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. 80
      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. 10
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormTestFixtureBase.cs
  12. 7
      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. 8
      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.

80
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,17 +28,58 @@ namespace ICSharpCode.PythonBinding @@ -26,17 +28,58 @@ 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")
{
}
public PythonForm(string indentString)
public PythonForm(string indentString)
: this(indentString, new PythonFormEventBindingService())
{
this.indentString = indentString;
}
PythonForm(string indentString, IEventBindingService eventBindingService)
{
this.indentString = indentString;
this.eventBindingService = eventBindingService;
}
/// <summary>
/// Generates python code for the InitializeComponent method based on the controls added to the form.
/// </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()
{

10
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;
@ -38,7 +39,7 @@ namespace PythonBinding.Tests.Designer @@ -38,7 +39,7 @@ namespace PythonBinding.Tests.Designer
[TestFixtureSetUp]
public void SetUpFixture()
{
{
PythonFormWalker walker = new PythonFormWalker(this);
form = walker.CreateForm(PythonCode);
}
@ -60,7 +61,7 @@ namespace PythonBinding.Tests.Designer @@ -60,7 +61,7 @@ namespace PythonBinding.Tests.Designer
{
CreatedComponent c = new CreatedComponent(componentClass.FullName, name);
createdComponents.Add(c);
object instance = componentClass.Assembly.CreateInstance(componentClass.FullName);
return (IComponent)instance;
}
@ -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; }
}

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

@ -87,6 +87,11 @@ namespace PythonBinding.Tests.Designer @@ -87,6 +87,11 @@ namespace PythonBinding.Tests.Designer
public Type GetType(string typeName)
{
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" />

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

@ -86,4 +86,10 @@ def main(args): @@ -86,4 +86,10 @@ def main(args):
ParentControl has BorderStyle = FixedSingle when created.
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
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