Browse Source

Form event handlers now generated and loaded by python form designer.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3936 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Matt Ward 17 years ago
parent
commit
b95d5e6c83
  1. 6
      src/AddIns/BackendBindings/Python/PyWalker/ResolveWalker.cs
  2. 5
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IComponentCreator.cs
  3. 10
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs
  4. 10
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerLoader.cs
  5. 76
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs
  6. 19
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalker.cs
  7. 78
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateEventHandlerFormTestFixture.cs
  8. 71
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertSecondEventHandlerTestFixture.cs
  9. 52
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadEventHandlerTestFixture.cs
  10. 6
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFontTestFixture.cs
  11. 6
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormTestFixtureBase.cs
  12. 5
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MissingInitializeComponentMethodTestFixture.cs
  13. 14
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderTestFixture.cs
  14. 5
      src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
  15. 6
      src/AddIns/BackendBindings/Python/PythonBinding/Test/TODO.txt
  16. 52
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockEventBindingService.cs
  17. 62
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockPropertyDescriptor.cs

6
src/AddIns/BackendBindings/Python/PyWalker/ResolveWalker.cs

@ -46,6 +46,12 @@ namespace PyWalker @@ -46,6 +46,12 @@ namespace PyWalker
return base.Walk(node);
}
public override bool Walk(AugmentedAssignStatement node)
{
writer.WriteLine("AugmentedAssignStatement");
return base.Walk(node);
}
public override bool Walk(AssignmentStatement node)
{
writer.WriteLine("AssignmentStatement");

5
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IComponentCreator.cs

@ -46,5 +46,10 @@ namespace ICSharpCode.PythonBinding @@ -46,5 +46,10 @@ namespace ICSharpCode.PythonBinding
/// Gets the type given its name.
/// </summary>
Type GetType(string typeName);
/// <summary>
/// Gets the property descriptor associated with the event.
/// </summary>
PropertyDescriptor GetEventProperty(EventDescriptor e);
}
}

10
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs

@ -121,9 +121,15 @@ namespace ICSharpCode.PythonBinding @@ -121,9 +121,15 @@ namespace ICSharpCode.PythonBinding
// new line before it.
IDocument doc = viewContent.DesignerCodeFileDocument;
string eventHandler = CreateEventHandler(eventMethodName, body, "\t");
string newContent = "\r\n" + eventHandler;
int line = doc.LineSegmentCollection.Count;
int offset = doc.GetLineSegment(line - 1).Offset;
LineSegment lastLineSegment = doc.GetLineSegment(line - 1);
int offset = lastLineSegment.Offset + lastLineSegment.Length;
string newContent = "\r\n" + eventHandler;
if (lastLineSegment.Length > 0) {
// Add an extra new line between the last line and the event handler.
newContent = "\r\n" + newContent;
}
doc.Insert(offset, newContent);
// Set position so it points to the line

10
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerLoader.cs

@ -9,6 +9,7 @@ using System; @@ -9,6 +9,7 @@ using System;
using System.CodeDom;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Security.Permissions;
@ -78,6 +79,15 @@ namespace ICSharpCode.PythonBinding @@ -78,6 +79,15 @@ namespace ICSharpCode.PythonBinding
return serializationManager.GetType(typeName);
}
/// <summary>
/// Gets the property descriptor associated with the event.
/// </summary>
public PropertyDescriptor GetEventProperty(EventDescriptor e)
{
IEventBindingService eventBindingService = GetService(typeof(IEventBindingService)) as IEventBindingService;
return eventBindingService.GetEventProperty(e);
}
/// <summary>
/// Passes the designer host's root component to the generator so it can update the
/// source code with changes made at design time.

76
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs

@ -7,8 +7,10 @@ @@ -7,8 +7,10 @@
using System;
using System.Drawing;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
@ -26,6 +28,41 @@ namespace ICSharpCode.PythonBinding @@ -26,6 +28,41 @@ namespace ICSharpCode.PythonBinding
StringBuilder codeBuilder;
string indentString = String.Empty;
int indent;
IEventBindingService eventBindingService;
Attribute[] notDesignOnlyFilter = new Attribute[] { DesignOnlyAttribute.No };
class PythonFormEventBindingService : EventBindingService
{
public PythonFormEventBindingService()
: base(new ServiceContainer())
{
}
protected override string CreateUniqueMethodName(IComponent component, EventDescriptor e)
{
return String.Empty;
}
protected override ICollection GetCompatibleMethods(EventDescriptor e)
{
return new ArrayList();
}
protected override bool ShowCode()
{
return false;
}
protected override bool ShowCode(int lineNumber)
{
return false;
}
protected override bool ShowCode(IComponent component, EventDescriptor e, string methodName)
{
return false;
}
}
public PythonForm()
: this("\t")
@ -33,8 +70,14 @@ namespace ICSharpCode.PythonBinding @@ -33,8 +70,14 @@ namespace ICSharpCode.PythonBinding
}
public PythonForm(string indentString)
: this(indentString, new PythonFormEventBindingService())
{
}
PythonForm(string indentString, IEventBindingService eventBindingService)
{
this.indentString = indentString;
this.eventBindingService = eventBindingService;
}
/// <summary>
@ -71,8 +114,7 @@ namespace ICSharpCode.PythonBinding @@ -71,8 +114,7 @@ namespace ICSharpCode.PythonBinding
public PropertyDescriptorCollection GetSerializableProperties(object obj)
{
List<PropertyDescriptor> properties = new List<PropertyDescriptor>();
Attribute[] filter = new Attribute[] { DesignOnlyAttribute.No };
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(obj, filter).Sort()) {
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(obj, notDesignOnlyFilter).Sort()) {
if (property.SerializationVisibility == DesignerSerializationVisibility.Visible) {
if (property.ShouldSerializeValue(obj)) {
properties.Add(property);
@ -138,6 +180,8 @@ namespace ICSharpCode.PythonBinding @@ -138,6 +180,8 @@ namespace ICSharpCode.PythonBinding
AppendControl(childControl, true, true);
}
}
AppendEventHandlers(propertyOwnerName, control);
}
/// <summary>
@ -238,5 +282,33 @@ namespace ICSharpCode.PythonBinding @@ -238,5 +282,33 @@ namespace ICSharpCode.PythonBinding
AppendChildControlLayoutMethodCalls(control.Controls, methods);
}
}
/// <summary>
/// Generates code that wires an event to an event handler.
/// </summary>
/// <remarks>
/// Note that the EventDescriptorCollection.Sort method does not work if the
/// enumerator is called first. Sorting will only occur if an item is retrieved after calling
/// Sort or CopyTo is called. The PropertyDescriptorCollection class does not behave
/// in the same way.</remarks>
void AppendEventHandlers(string propertyOwnerName, Control control)
{
EventDescriptorCollection events = TypeDescriptor.GetEvents(control, notDesignOnlyFilter).Sort();
if (events.Count > 0) {
EventDescriptor dummyEventDescriptor = events[0];
}
foreach (EventDescriptor eventDescriptor in events) {
AppendEventHandler(propertyOwnerName, control, eventDescriptor);
}
}
void AppendEventHandler(string propertyOwnerName, Control control, EventDescriptor eventDescriptor)
{
PropertyDescriptor propertyDescriptor = eventBindingService.GetEventProperty(eventDescriptor);
if (propertyDescriptor.ShouldSerializeValue(control)) {
string methodName = (string)propertyDescriptor.GetValue(control);
AppendIndentedLine(GetPropertyName(propertyOwnerName, eventDescriptor.Name) + " += self." + methodName);
}
}
}
}

19
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalker.cs

@ -145,6 +145,25 @@ namespace ICSharpCode.PythonBinding @@ -145,6 +145,25 @@ namespace ICSharpCode.PythonBinding
return false;
}
/// <summary>
/// Walks a statement of the form:
///
/// self.a += self.b
/// </summary>
public override bool Walk(AugmentedAssignStatement node)
{
MemberExpression eventExpression = node.Left as MemberExpression;
string eventName = eventExpression.Name.ToString();
MemberExpression eventHandlerExpression = node.Right as MemberExpression;
string eventHandlerName = eventHandlerExpression.Name.ToString();
EventDescriptor eventDescriptor = TypeDescriptor.GetEvents(form).Find(eventName, false);
PropertyDescriptor propertyDescriptor = componentCreator.GetEventProperty(eventDescriptor);
propertyDescriptor.SetValue(form, eventHandlerName);
return false;
}
/// <summary>
/// Walks the binary expression which is the right hand side of an assignment statement.
/// </summary>

78
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateEventHandlerFormTestFixture.cs

@ -0,0 +1,78 @@ @@ -0,0 +1,78 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
/// <summary>
/// Tests that an event is wired to its event handler after the user specifies an event handler
/// method in the property grid.
/// </summary>
[TestFixture]
public class GenerateEventHandlerFormTestFixture
{
string generatedPythonCode;
[TestFixtureSetUp]
public void SetUpFixture()
{
using (DesignSurface designSurface = new DesignSurface(typeof(Form))) {
IDesignerHost host = (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));
IEventBindingService eventBindingService = new MockEventBindingService(host);
Form form = (Form)host.RootComponent;
form.ClientSize = new Size(200, 300);
PropertyDescriptorCollection descriptors = TypeDescriptor.GetProperties(form);
PropertyDescriptor namePropertyDescriptor = descriptors.Find("Name", false);
namePropertyDescriptor.SetValue(form, "MainForm");
// Simulate giving a name to the Load event handler in the property grid.
EventDescriptorCollection events = TypeDescriptor.GetEvents(form);
EventDescriptor loadEvent = events.Find("Load", false);
PropertyDescriptor loadEventProperty = eventBindingService.GetEventProperty(loadEvent);
loadEventProperty.SetValue(form, "MainFormLoad");
// Add a second event handler method to check that the events are sorted alphabetically
// before the InitializeComponent method is generated.
EventDescriptor closedEvent = events.Find("FormClosed", false);
PropertyDescriptor closedEventProperty = eventBindingService.GetEventProperty(closedEvent);
closedEventProperty.SetValue(form, "MainFormClosed");
PythonForm pythonForm = new PythonForm(" ");
generatedPythonCode = pythonForm.GenerateInitializeComponentMethod(form);
}
}
[Test]
public void GeneratedCode()
{
string expectedCode = "def InitializeComponent(self):\r\n" +
" self.SuspendLayout()\r\n" +
" # \r\n" +
" # MainForm\r\n" +
" # \r\n" +
" self.ClientSize = System.Drawing.Size(200, 300)\r\n" +
" self.Name = \"MainForm\"\r\n" +
" self.FormClosed += self.MainFormClosed\r\n" +
" self.Load += self.MainFormLoad\r\n" +
" self.ResumeLayout(False)\r\n" +
" self.PerformLayout()\r\n";
Assert.AreEqual(expectedCode, generatedPythonCode);
}
}
}

71
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertSecondEventHandlerTestFixture.cs

@ -0,0 +1,71 @@ @@ -0,0 +1,71 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.PythonBinding;
using ICSharpCode.FormsDesigner;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
/// <summary>
/// Tests the PythonDesignerGenerator adds an extra new line between the previous event handler
/// and the new one inserted.
/// </summary>
[TestFixture]
public class InsertSecondEventHandlerTestFixture
{
string file;
int position;
bool insertedEventHandler;
MockTextEditorViewContent mockViewContent;
DerivedFormDesignerViewContent viewContent;
[TestFixtureSetUp]
public void SetUpFixture()
{
DerivedPythonDesignerGenerator generator = new DerivedPythonDesignerGenerator();
mockViewContent = new MockTextEditorViewContent();
viewContent = new DerivedFormDesignerViewContent(mockViewContent, new MockOpenedFile(@"C:\Projects\Python\mainform.py"));
generator.Attach(viewContent);
viewContent.DesignerCodeFileContent = GetTextEditorCode();
MockEventDescriptor mockEventDescriptor = new MockEventDescriptor("Click");
generator.InsertComponentEvent(null, mockEventDescriptor, "button1_click", String.Empty, out file, out position);
insertedEventHandler = generator.InsertComponentEvent(null, mockEventDescriptor, "button2_click", String.Empty, out file, out position);
}
[Test]
public void ExpectedCodeAfterEventHandlerInserted()
{
string expectedCode = GetTextEditorCode();
string eventHandler = "\tdef button1_click(self, sender, e):\r\n" +
"\t\tpass\r\n" +
"\r\n" +
"\tdef button2_click(self, sender, e):\r\n" +
"\t\tpass";
expectedCode = expectedCode + "\r\n" + eventHandler;
Assert.AreEqual(expectedCode, viewContent.DesignerCodeFileContent);
}
string GetTextEditorCode()
{
return "from System.Windows.Forms import Form\r\n" +
"\r\n" +
"class MainForm(Form):\r\n" +
"\tdef __init__(self):\r\n" +
"\t\tself.InitializeComponents()\r\n" +
"\t\r\n" +
"\tdef InitializeComponents(self):\r\n" +
"\t\tself._button1 = System.Windows.Forms.Button()\r\n" +
"\t\tself.Controls.Add(self._button1)\r\n";
}
}
}

52
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadEventHandlerTestFixture.cs

@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
[TestFixture]
public class LoadEventHandlerTestFixture : LoadFormTestFixtureBase
{
public override string PythonCode {
get {
return "class TestForm(System.Windows.Forms.Form):\r\n" +
" def InitializeComponent(self):\r\n" +
" self.SuspendLayout()\r\n" +
" # \r\n" +
" # TestForm\r\n" +
" # \r\n" +
" self.Name = \"TestForm\"\r\n" +
" self.Load += self.TestFormLoad\r\n" +
" self.ResumeLayout(False)\r\n";
}
}
public EventDescriptor GetLoadEventDescriptor()
{
return TypeDescriptor.GetEvents(Form).Find("Load", true);
}
[Test]
public void EventPropertyDescriptorValueSetToEventHandlerMethodName()
{
EventDescriptor loadEventDescriptor = GetLoadEventDescriptor();
PropertyDescriptor property = base.GetEventProperty(loadEventDescriptor);
Assert.AreEqual("TestFormLoad", property.GetValue(Form) as String);
}
}
}

6
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFontTestFixture.cs

@ -34,12 +34,6 @@ namespace PythonBinding.Tests.Designer @@ -34,12 +34,6 @@ namespace PythonBinding.Tests.Designer
}
}
[TestFixtureSetUp]
public new void SetUpFixture()
{
base.SetUpFixture();
}
[Test]
public void FormBackColor()
{

6
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormTestFixtureBase.cs

@ -9,6 +9,7 @@ using System; @@ -9,6 +9,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.Reflection;
@ -102,6 +103,11 @@ namespace PythonBinding.Tests.Designer @@ -102,6 +103,11 @@ namespace PythonBinding.Tests.Designer
return type;
}
public PropertyDescriptor GetEventProperty(EventDescriptor e)
{
return new MockPropertyDescriptor("abc", "TestFormLoad", true);
}
protected Form Form {
get { return form; }
}

5
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MissingInitializeComponentMethodTestFixture.cs

@ -88,5 +88,10 @@ namespace PythonBinding.Tests.Designer @@ -88,5 +88,10 @@ namespace PythonBinding.Tests.Designer
{
throw new NotImplementedException();
}
public PropertyDescriptor GetEventProperty(EventDescriptor e)
{
return null;
}
}
}

14
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderTestFixture.cs

@ -38,6 +38,7 @@ namespace PythonBinding.Tests.Designer @@ -38,6 +38,7 @@ namespace PythonBinding.Tests.Designer
MockExtenderProviderService mockExtenderProviderService;
IComponent rootComponent;
Form designedForm;
MockEventBindingService mockEventBindingService;
[TestFixtureSetUp]
public void SetUpFixture()
@ -55,6 +56,10 @@ namespace PythonBinding.Tests.Designer @@ -55,6 +56,10 @@ namespace PythonBinding.Tests.Designer
mockExtenderProviderService = new MockExtenderProviderService();
mockDesignerLoaderHost.AddService(typeof(IExtenderProviderService), mockExtenderProviderService);
mockEventBindingService = new MockEventBindingService();
mockDesignerLoaderHost.AddService(typeof(IEventBindingService), mockEventBindingService);
System.Console.WriteLine("Before BeginLoad");
loader.BeginLoad(mockDesignerLoaderHost);
System.Console.WriteLine("After BeginLoad");
@ -123,6 +128,15 @@ namespace PythonBinding.Tests.Designer @@ -123,6 +128,15 @@ namespace PythonBinding.Tests.Designer
Assert.AreEqual(designedForm, generator.MergeChangesRootComponent);
}
[Test]
public void GetEventPropertyUsesEventBindingService()
{
IEventBindingService eventBindingService = (IEventBindingService)mockEventBindingService;
EventDescriptor e = TypeDescriptor.GetEvents(typeof(Form)).Find("Load", true);
PropertyDescriptor expectedProperty = eventBindingService.GetEventProperty(e);
Assert.AreEqual(expectedProperty, loader.GetEventProperty(e));
}
/// <summary>
/// The code that the designer loader will parse.
/// </summary>

5
src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj

@ -155,6 +155,7 @@ @@ -155,6 +155,7 @@
<Compile Include="Designer\GenerateAutoScrollFormTestFixture.cs" />
<Compile Include="Designer\GenerateCursorFormTestFixture.cs" />
<Compile Include="Designer\GenerateDoubleBufferedFormTestFixture.cs" />
<Compile Include="Designer\GenerateEventHandlerFormTestFixture.cs" />
<Compile Include="Designer\GenerateFormColorTestFixture.cs" />
<Compile Include="Designer\GenerateFormLocationTestFixture.cs" />
<Compile Include="Designer\GenerateFormPaddingTestFixture.cs" />
@ -168,11 +169,13 @@ @@ -168,11 +169,13 @@
<Compile Include="Designer\GeneratorMergeFindsInitializeComponentsTestFixture.cs" />
<Compile Include="Designer\IgnoreDesignTimePropertiesTestFixture.cs" />
<Compile Include="Designer\InsertNewEventHandlerTestFixture.cs" />
<Compile Include="Designer\InsertSecondEventHandlerTestFixture.cs" />
<Compile Include="Designer\IsFullyQualifiedBaseClassFormDesignableTestFixture.cs" />
<Compile Include="Designer\LoadAccessibleRoleTestFixture.cs" />
<Compile Include="Designer\LoadAnchorStylesFormTestFixture.cs" />
<Compile Include="Designer\LoadColorFromArgbTestFixture.cs" />
<Compile Include="Designer\LoadCursorTestFixture.cs" />
<Compile Include="Designer\LoadEventHandlerTestFixture.cs" />
<Compile Include="Designer\LoadFontTestFixture.cs" />
<Compile Include="Designer\LoadFormTestFixtureBase.cs" />
<Compile Include="Designer\LoadFormWithBooleanPropertiesSetTestFixture.cs" />
@ -249,6 +252,7 @@ @@ -249,6 +252,7 @@
<Compile Include="Utils\MockDesignerGenerator.cs" />
<Compile Include="Utils\MockDesignerLoaderHost.cs" />
<Compile Include="Utils\MockEditableViewContent.cs" />
<Compile Include="Utils\MockEventBindingService.cs" />
<Compile Include="Utils\MockEventDescriptor.cs" />
<Compile Include="Utils\MockExtenderProviderService.cs" />
<Compile Include="Utils\MockMethod.cs" />
@ -257,6 +261,7 @@ @@ -257,6 +261,7 @@
<Compile Include="Utils\MockProcessRunner.cs" />
<Compile Include="Utils\MockProject.cs" />
<Compile Include="Utils\MockProjectContent.cs" />
<Compile Include="Utils\MockPropertyDescriptor.cs" />
<Compile Include="Utils\MockTextEditorProperties.cs" />
<Compile Include="Utils\MockTextEditorViewContent.cs" />
<Compile Include="Utils\MockTypeResolutionService.cs" />

6
src/AddIns/BackendBindings/Python/PythonBinding/Test/TODO.txt

@ -87,3 +87,9 @@ def main(args): @@ -87,3 +87,9 @@ def main(args):
ChildControl has ParentControl as base class.
BorderStyle set to None in designer for ChildControl. Code should then be generated for BorderStyle since this
is not the default
* Event Handler loading code:
Handle invalid event name.
Check that += operator used.
Support event handlers on other controls.

52
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockEventBindingService.cs

@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
namespace PythonBinding.Tests.Utils
{
public class MockEventBindingService : EventBindingService
{
public MockEventBindingService(IServiceProvider serviceProvider)
: base(serviceProvider)
{
}
public MockEventBindingService()
: this(new ServiceContainer())
{
}
protected override string CreateUniqueMethodName(IComponent component, EventDescriptor e)
{
return String.Empty;
}
protected override ICollection GetCompatibleMethods(EventDescriptor e)
{
return new ArrayList();
}
protected override bool ShowCode()
{
return false;
}
protected override bool ShowCode(int lineNumber)
{
return false;
}
protected override bool ShowCode(IComponent component, EventDescriptor e, string methodName)
{
return false;
}
}
}

62
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockPropertyDescriptor.cs

@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace PythonBinding.Tests.Utils
{
public class MockPropertyDescriptor : PropertyDescriptor
{
object propertyValue;
bool shouldSerializeValue;
public MockPropertyDescriptor(string name, object value, bool shouldSerializeValue)
: base(name, null)
{
this.propertyValue = value;
this.shouldSerializeValue = shouldSerializeValue;
}
public override Type ComponentType {
get { return typeof(Form); }
}
public override bool IsReadOnly {
get { return false; }
}
public override Type PropertyType {
get { return typeof(String); }
}
public override bool CanResetValue(object component)
{
return true;
}
public override object GetValue(object component)
{
return this.propertyValue;
}
public override void ResetValue(object component)
{
}
public override void SetValue(object component, object value)
{
this.propertyValue = value;
}
public override bool ShouldSerializeValue(object component)
{
return shouldSerializeValue;
}
}
}
Loading…
Cancel
Save