Browse Source

Applied form designer patch by Christian Hornung. Fixes SD2-522 and SD2-516.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@692 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
eefbab6fb7
  1. 6
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs
  2. 4
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/FormDesignerBinding.cs
  3. 40
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/AbstractDesignerGenerator.cs
  4. 148
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs
  5. 7
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs
  6. 10
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/XmlDesignerGenerator.cs
  7. 10
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/DesignerLoaderProvider.cs
  8. 11
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs
  9. 6
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/XmlDesignerLoader.cs
  10. 22
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs
  11. 243
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/EventBindingService.cs

6
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs

@ -32,6 +32,7 @@ namespace Grunwald.BooBinding.Designer @@ -32,6 +32,7 @@ namespace Grunwald.BooBinding.Designer
{
bool loading = true;
IDesignerLoaderHost designerLoaderHost = null;
IDesignerGenerator generator;
ITypeResolutionService typeResolutionService = null;
CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
@ -72,9 +73,10 @@ namespace Grunwald.BooBinding.Designer @@ -72,9 +73,10 @@ namespace Grunwald.BooBinding.Designer
return base.IsReloadNeeded() || TextContent != lastTextContent;
}
public BooDesignerLoader(TextEditorControl textEditorControl)
public BooDesignerLoader(TextEditorControl textEditorControl, IDesignerGenerator generator)
{
this.textEditorControl = textEditorControl;
this.generator = generator;
}
public override void BeginLoad(IDesignerLoaderHost host)
@ -135,7 +137,7 @@ namespace Grunwald.BooBinding.Designer @@ -135,7 +137,7 @@ namespace Grunwald.BooBinding.Designer
protected override void Write(CodeCompileUnit unit)
{
LoggingService.Info("BooDesignerLoader.Write called");
provider.GenerateCodeFromCompileUnit(unit, Console.Out, null);
generator.MergeFormChanges(unit);
}
}
}

4
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/FormDesignerBinding.cs

@ -53,9 +53,9 @@ namespace Grunwald.BooBinding.Designer @@ -53,9 +53,9 @@ namespace Grunwald.BooBinding.Designer
this.textEditorControl = textEditorControl;
}
public System.ComponentModel.Design.Serialization.DesignerLoader CreateLoader()
public System.ComponentModel.Design.Serialization.DesignerLoader CreateLoader(IDesignerGenerator generator)
{
return new BooDesignerLoader(textEditorControl);
return new BooDesignerLoader(textEditorControl, generator);
}
}
}

40
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/AbstractDesignerGenerator.cs

@ -13,6 +13,8 @@ using System.Drawing; @@ -13,6 +13,8 @@ using System.Drawing;
using System.Reflection;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.CodeDom;
using System.CodeDom.Compiler;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Dom;
@ -31,8 +33,19 @@ namespace ICSharpCode.FormDesigner @@ -31,8 +33,19 @@ namespace ICSharpCode.FormDesigner
FormDesignerViewContent viewContent;
bool failedDesignerInitialize = false;
CodeDomProvider provider;
public const string NonVisualComponentContainerName = "components";
public CodeDomProvider CodeDomProvider {
get {
if (this.provider == null) {
this.provider = this.CreateCodeProvider();
}
return this.provider;
}
}
public void Attach(FormDesignerViewContent viewContent)
{
this.viewContent = viewContent;
@ -114,13 +127,34 @@ namespace ICSharpCode.FormDesigner @@ -114,13 +127,34 @@ namespace ICSharpCode.FormDesigner
protected abstract DomRegion GetReplaceRegion(ICSharpCode.TextEditor.Document.IDocument document, IMethod method);
public void MergeFormChanges()
public void MergeFormChanges(CodeCompileUnit unit)
{
if (tabs == null) Reparse();
// find InitializeComponent method and the class it is declared in
CodeTypeDeclaration formClass = null;
CodeMemberMethod initializeComponent = null;
foreach (CodeNamespace n in unit.Namespaces) {
foreach (CodeTypeDeclaration typeDecl in n.Types) {
foreach (CodeTypeMember m in typeDecl.Members) {
if (m is CodeMemberMethod && m.Name == "InitializeComponent") {
formClass = typeDecl;
initializeComponent = (CodeMemberMethod)m;
break;
}
}
}
}
if (formClass == null || initializeComponent == null) {
throw new InvalidOperationException("InitializeComponent method not found in framework-generated CodeDom.");
}
// generate file and get initialize components string
StringWriter writer = new StringWriter();
new CodeDOMGenerator(viewContent.Host, CreateCodeProvider(), tabs + '\t').ConvertContentDefinition(writer);
CodeDOMGenerator domGenerator = new CodeDOMGenerator(this.CodeDomProvider, tabs + '\t');
domGenerator.ConvertContentDefinition(initializeComponent, writer);
string statements = writer.ToString();
// initializeComponents.BodyRegion.BeginLine + 1
@ -219,7 +253,7 @@ namespace ICSharpCode.FormDesigner @@ -219,7 +253,7 @@ namespace ICSharpCode.FormDesigner
return true;
}
}
MergeFormChanges();
viewContent.MergeFormChanges();
Reparse();
position = c.Region.EndLine + 1;

148
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs

@ -23,8 +23,6 @@ using System.Text.RegularExpressions; @@ -23,8 +23,6 @@ using System.Text.RegularExpressions;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using Microsoft.VisualBasic;
using ICSharpCode.Core;
using ICSharpCode.FormDesigner.Services;
@ -35,82 +33,24 @@ namespace ICSharpCode.FormDesigner @@ -35,82 +33,24 @@ namespace ICSharpCode.FormDesigner
/// </summary>
public class CodeDOMGenerator
{
IDesignerHost host;
CodeDomProvider codeProvider;
CodeDOMGeneratorUtility codeDOMGeneratorUtility = new CodeDOMGeneratorUtility();
List<string> addedVariables = new List<string>();
string indentation;
public CodeDOMGenerator(IDesignerHost host, CodeDomProvider codeProvider, string indentation)
public CodeDOMGenerator(CodeDomProvider codeProvider, string indentation)
{
this.host = host;
this.codeProvider = codeProvider;
this.indentation = indentation;
}
public void ConvertContentDefinition(TextWriter writer)
public void ConvertContentDefinition(CodeMemberMethod method, TextWriter writer)
{
LoggingService.Info("Start CodeCOMGenerator.ConvertContentDefinition");
DesignerSerializationManager serializationManager = (DesignerSerializationManager)host.GetService(typeof(IDesignerSerializationManager));
IDisposable session = serializationManager.CreateSession();
DesignerResourceService designerResourceService = (DesignerResourceService)host.GetService(typeof(System.ComponentModel.Design.IResourceService));
designerResourceService.SerializationStarted(true);
addedVariables.Clear();
List<CodeStatement> statements = new List<CodeStatement>();
foreach (IComponent component in host.Container.Components) {
if (!IsComponentAdded(component)) {
GenerateComponentCode(component, statements, serializationManager);
}
}
// Sort statements a bit:
// Move initialization statements up (but keep the order of everything else!)
int insertIndex = 0;
for (int i = 0; i < statements.Count; i++) {
CodeStatement statement = statements[i];
if (statement is CodeVariableDeclarationStatement
|| (statement is CodeAssignStatement
&& ((CodeAssignStatement)statement).Right is CodeObjectCreateExpression
&& ((CodeAssignStatement)statement).Left is CodeVariableReferenceExpression)) {
// move i up to insertIndex
for (int j = i; j > insertIndex; j--) {
statements[j] = statements[j - 1];
}
statements[insertIndex++] = statement;
}
}
// Move SuspendLayout statements up
for (int i = insertIndex; i < statements.Count; i++) {
CodeStatement statement = statements[i];
if (IsMethodCall(statement, "SuspendLayout")) {
// move i up to insertIndex
for (int j = i; j > insertIndex; j--) {
statements[j] = statements[j - 1];
}
statements[insertIndex++] = statement;
}
}
// Move ResumeLayout statements down
insertIndex = statements.Count - 1;
for (int i = insertIndex; i >= 0; i--) {
CodeStatement statement = statements[i];
if (IsMethodCall(statement, "ResumeLayout")) {
// move i down to insertIndex
for (int j = i; j < insertIndex; j++) {
statements[j] = statements[j + 1];
}
statements[insertIndex--] = statement;
}
}
LoggingService.Info("Generate code for: "+method.Name);
CodeGeneratorOptions options = codeDOMGeneratorUtility.CreateCodeGeneratorOptions;
options.IndentString = indentation;
foreach (CodeStatement statement in statements) {
foreach (CodeStatement statement in method.Statements) {
// indentation isn't generated when calling GenerateCodeFromStatement
writer.Write(options.IndentString);
try {
@ -124,18 +64,6 @@ namespace ICSharpCode.FormDesigner @@ -124,18 +64,6 @@ namespace ICSharpCode.FormDesigner
}
}
designerResourceService.SerializationEnded(true);
session.Dispose();
LoggingService.Info("End CodeCOMGenerator.ConvertContentDefinition");
}
bool IsMethodCall(CodeStatement statement, string methodName)
{
CodeExpressionStatement ces = statement as CodeExpressionStatement;
if (ces == null) return false;
CodeMethodInvokeExpression cmie = ces.Expression as CodeMethodInvokeExpression;
if (cmie == null) return false;
return cmie.Method.MethodName == methodName;
}
public static bool IsNonVisualComponent(IDesignerHost host, IComponent component)
@ -144,73 +72,5 @@ namespace ICSharpCode.FormDesigner @@ -144,73 +72,5 @@ namespace ICSharpCode.FormDesigner
return !(designer is ControlDesigner);
}
void GenerateComponentCode(IComponent component, List<CodeStatement> outputStatements, DesignerSerializationManager serializationManager)
{
LoggingService.Debug("Generate code for: " + component.Site.Name);
Type componentType = component.GetType();
ExpressionContext exprContext = new ExpressionContext(new CodeThisReferenceExpression(), componentType, component, component);
((IDesignerSerializationManager)serializationManager).Context.Append(exprContext);
CodeDomSerializer serializer = (CodeDomSerializer)serializationManager.GetSerializer(componentType, typeof(CodeDomSerializer));
if (serializer == null) {
throw new Exception("No serializer found for component type=" + componentType.ToString());
}
ICollection statements = serializer.Serialize(serializationManager, component) as ICollection;
// ICSharpCode.NRefactory.Parser.CodeDOMVerboseOutputGenerator outputGenerator = new ICSharpCode.NRefactory.Parser.CodeDOMVerboseOutputGenerator();
foreach (CodeStatement statement in statements) {
CodeVariableDeclarationStatement variableDecl = statement as CodeVariableDeclarationStatement;
if (variableDecl != null) {
LoggingService.Debug("variable declaration: " + variableDecl.Name);
if (variableDecl.Name == "resources") {
FixResourcesVariableDeclarationStatement(variableDecl);
} else {
// skip generating the variable declaration if the component is a main
// component that gets its own field
// TreeNode is an example that does NOT get its own root component!
bool foundComponent = false;
foreach (IComponent c in host.Container.Components) {
if (variableDecl.Name == c.Site.Name) {
foundComponent = true;
break;
}
}
if (foundComponent) {
addedVariables.Add(((CodeVariableDeclarationStatement)statement).Name);
continue;
}
}
}
outputStatements.Add(statement);
}
}
bool IsComponentAdded(IComponent component)
{
if (component.Site != null) {
return addedVariables.Contains(component.Site.Name);
}
return false;
}
/// <summary>
/// HACK - Fix the resources variable declaration. The CodeDomSerializer
/// creates an incorrect code expression object.
/// </summary>
void FixResourcesVariableDeclarationStatement(CodeVariableDeclarationStatement variableDecl)
{
CodeObjectCreateExpression exp = variableDecl.InitExpression as CodeObjectCreateExpression;
if (exp != null) {
CodeTypeReference typeRef = new CodeTypeReference(host.RootComponent.Site.Name);
CodeTypeOfExpression typeofExpression = new CodeTypeOfExpression(typeRef);
exp.Parameters.Clear();
exp.Parameters.Add(typeofExpression);
}
}
}
}

7
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs

@ -9,6 +9,8 @@ using System; @@ -9,6 +9,8 @@ using System;
using System.Collections;
using System.ComponentModel;
using System.Reflection;
using System.CodeDom;
using System.CodeDom.Compiler;
using ICSharpCode.SharpDevelop.Gui;
@ -16,9 +18,12 @@ namespace ICSharpCode.FormDesigner @@ -16,9 +18,12 @@ namespace ICSharpCode.FormDesigner
{
public interface IDesignerGenerator
{
CodeDomProvider CodeDomProvider {
get;
}
void Attach(FormDesignerViewContent viewContent);
void Detach();
void MergeFormChanges();
void MergeFormChanges(CodeCompileUnit unit);
bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position);
ICollection GetCompatibleMethods(EventDescriptor edesc);
ICollection GetCompatibleMethods(EventInfo edesc);

10
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/XmlDesignerGenerator.cs

@ -14,6 +14,8 @@ using System.Reflection; @@ -14,6 +14,8 @@ using System.Reflection;
using System.Windows.Forms;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Text;
using System.Text.RegularExpressions;
@ -23,6 +25,12 @@ namespace ICSharpCode.FormDesigner @@ -23,6 +25,12 @@ namespace ICSharpCode.FormDesigner
{
FormDesignerViewContent viewContent;
public CodeDomProvider CodeDomProvider {
get {
return new Microsoft.CSharp.CSharpCodeProvider();
}
}
public void Attach(FormDesignerViewContent viewContent)
{
this.viewContent = viewContent;
@ -33,7 +41,7 @@ namespace ICSharpCode.FormDesigner @@ -33,7 +41,7 @@ namespace ICSharpCode.FormDesigner
this.viewContent = null;
}
public void MergeFormChanges()
public void MergeFormChanges(CodeCompileUnit unit)
{
StringWriter writer = new StringWriter();
XmlTextWriter xml = new XmlTextWriter(writer);

10
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/DesignerLoaderProvider.cs

@ -14,7 +14,7 @@ namespace ICSharpCode.FormDesigner @@ -14,7 +14,7 @@ namespace ICSharpCode.FormDesigner
{
public interface IDesignerLoaderProvider
{
DesignerLoader CreateLoader();
DesignerLoader CreateLoader(IDesignerGenerator generator);
}
public class NRefactoryDesignerLoaderProvider : IDesignerLoaderProvider
@ -28,9 +28,9 @@ namespace ICSharpCode.FormDesigner @@ -28,9 +28,9 @@ namespace ICSharpCode.FormDesigner
this.textEditorControl = textEditorControl;
}
public DesignerLoader CreateLoader()
public DesignerLoader CreateLoader(IDesignerGenerator generator)
{
return new NRefactoryDesignerLoader(language, textEditorControl);
return new NRefactoryDesignerLoader(language, textEditorControl, generator);
}
}
@ -43,9 +43,9 @@ namespace ICSharpCode.FormDesigner @@ -43,9 +43,9 @@ namespace ICSharpCode.FormDesigner
this.textEditorControl = textEditorControl;
}
public DesignerLoader CreateLoader()
public DesignerLoader CreateLoader(IDesignerGenerator generator)
{
return new XmlDesignerLoader(textEditorControl);
return new XmlDesignerLoader(textEditorControl, generator);
}
}
}

11
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs

@ -46,8 +46,8 @@ namespace ICSharpCode.FormDesigner @@ -46,8 +46,8 @@ namespace ICSharpCode.FormDesigner
bool loading = true;
IDesignerLoaderHost designerLoaderHost = null;
ITypeResolutionService typeResolutionService = null;
IDesignerGenerator generator;
SupportedLanguage language;
CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
TextEditorControl textEditorControl;
@ -71,7 +71,7 @@ namespace ICSharpCode.FormDesigner @@ -71,7 +71,7 @@ namespace ICSharpCode.FormDesigner
protected override CodeDomProvider CodeDomProvider {
get {
return provider;
return generator.CodeDomProvider;
}
}
@ -86,10 +86,11 @@ namespace ICSharpCode.FormDesigner @@ -86,10 +86,11 @@ namespace ICSharpCode.FormDesigner
return base.IsReloadNeeded() || TextContent != lastTextContent;
}
public NRefactoryDesignerLoader(SupportedLanguage language, TextEditorControl textEditorControl)
public NRefactoryDesignerLoader(SupportedLanguage language, TextEditorControl textEditorControl, IDesignerGenerator generator)
{
this.language = language;
this.textEditorControl = textEditorControl;
this.generator = generator;
}
public override void BeginLoad(IDesignerLoaderHost host)
@ -206,7 +207,7 @@ namespace ICSharpCode.FormDesigner @@ -206,7 +207,7 @@ namespace ICSharpCode.FormDesigner
if ((Control.ModifierKeys & Keys.Control) == Keys.Control) {
CodeDOMVerboseOutputGenerator outputGenerator = new CodeDOMVerboseOutputGenerator();
outputGenerator.GenerateCodeFromMember(visitor.codeCompileUnit.Namespaces[0].Types[0], Console.Out, null);
provider.GenerateCodeFromCompileUnit(visitor.codeCompileUnit, Console.Out, null);
this.CodeDomProvider.GenerateCodeFromCompileUnit(visitor.codeCompileUnit, Console.Out, null);
}
#endif
@ -291,7 +292,7 @@ namespace ICSharpCode.FormDesigner @@ -291,7 +292,7 @@ namespace ICSharpCode.FormDesigner
protected override void Write(CodeCompileUnit unit)
{
LoggingService.Info("DesignerLoader.Write called");
provider.GenerateCodeFromCompileUnit(unit, Console.Out, null);
generator.MergeFormChanges(unit);
}
// public void Reload()

6
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/XmlDesignerLoader.cs

@ -39,6 +39,7 @@ namespace ICSharpCode.FormDesigner @@ -39,6 +39,7 @@ namespace ICSharpCode.FormDesigner
public class XmlDesignerLoader : BasicDesignerLoader, IObjectCreator
{
TextEditorControl textEditorControl;
IDesignerGenerator generator;
public string TextContent {
get {
@ -46,9 +47,10 @@ namespace ICSharpCode.FormDesigner @@ -46,9 +47,10 @@ namespace ICSharpCode.FormDesigner
}
}
public XmlDesignerLoader(TextEditorControl textEditorControl)
public XmlDesignerLoader(TextEditorControl textEditorControl, IDesignerGenerator generator)
{
this.textEditorControl = textEditorControl;
this.generator = generator;
}
IDesignerLoaderHost host;
@ -70,6 +72,8 @@ namespace ICSharpCode.FormDesigner @@ -70,6 +72,8 @@ namespace ICSharpCode.FormDesigner
protected override void PerformFlush(IDesignerSerializationManager serializationManager)
{
// the XML designer is not based on CodeDom, so we pass null for the CodeCompileUnit
generator.MergeFormChanges(null);
}
Type IObjectCreator.GetType(string name)

22
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs

@ -57,7 +57,7 @@ namespace ICSharpCode.FormDesigner @@ -57,7 +57,7 @@ namespace ICSharpCode.FormDesigner
Panel p = new Panel();
DesignSurface designSurface;
IDesignerLoaderProvider loader;
IDesignerLoaderProvider loaderProvider;
IDesignerGenerator generator;
DesignerResourceService designerResourceService;
@ -97,13 +97,13 @@ namespace ICSharpCode.FormDesigner @@ -97,13 +97,13 @@ namespace ICSharpCode.FormDesigner
return (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));
}
}
public FormDesignerViewContent(IViewContent viewContent, IDesignerLoaderProvider loader, IDesignerGenerator generator)
public FormDesignerViewContent(IViewContent viewContent, IDesignerLoaderProvider loaderProvider, IDesignerGenerator generator)
{
if (!FormKeyHandler.inserted) {
FormKeyHandler.Insert();
}
this.loader = loader;
this.loaderProvider = loaderProvider;
this.generator = generator;
p.BackColor = Color.White;
@ -134,19 +134,17 @@ namespace ICSharpCode.FormDesigner @@ -134,19 +134,17 @@ namespace ICSharpCode.FormDesigner
serviceContainer.AddService(typeof(MemberRelationshipService), new DefaultMemberRelationshipService());
ICSharpCode.FormDesigner.Services.EventBindingService eventBindingService = new ICSharpCode.FormDesigner.Services.EventBindingService();
designSurface = new DesignSurface(serviceContainer);
ICSharpCode.FormDesigner.Services.EventBindingService eventBindingService = new ICSharpCode.FormDesigner.Services.EventBindingService(designSurface);
serviceContainer.AddService(typeof(System.ComponentModel.Design.IEventBindingService), eventBindingService);
designSurface = new DesignSurface(serviceContainer);
eventBindingService.ServiceProvider = designSurface;
designerResourceService.Host = Host;
designerResourceService.FileName = viewContent.FileName;
serviceContainer.AddService(typeof(IDesignerHost), Host);
DesignerLoader designerLoader = loader.CreateLoader();
DesignerLoader designerLoader = loaderProvider.CreateLoader(generator);
designSurface.BeginLoad(designerLoader);
designerLoader.Flush();
designSurface.Flush();
generator.Attach(this);
@ -217,14 +215,16 @@ namespace ICSharpCode.FormDesigner @@ -217,14 +215,16 @@ namespace ICSharpCode.FormDesigner
}
}
protected virtual void MergeFormChanges()
public virtual void MergeFormChanges()
{
if (this.failedDesignerInitialize) {
return;
}
bool isDirty = viewContent.IsDirty;
LoggingService.Info("Merging form changes...");
generator.MergeFormChanges();
designerResourceService.SerializationStarted(true);
designSurface.Flush();
designerResourceService.SerializationEnded(true);
LoggingService.Info("Finished merging form changes");
viewContent.IsDirty = isDirty;
}

243
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/EventBindingService.cs

@ -17,39 +17,20 @@ using ICSharpCode.SharpDevelop.Gui; @@ -17,39 +17,20 @@ using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.FormDesigner.Services
{
public class EventBindingService : IEventBindingService
public class EventBindingService : System.ComponentModel.Design.EventBindingService
{
public IComponentChangeService changeService = null;
EventTypeConverter eventTypeConverter;
Hashtable components = new Hashtable();
IServiceProvider serviceProvider = null;
public IServiceProvider ServiceProvider {
get {
return serviceProvider;
}
set {
serviceProvider = value;
eventTypeConverter = new EventTypeConverter(serviceProvider, this);
changeService = serviceProvider.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (changeService != null) {
changeService.ComponentRemoved += new ComponentEventHandler(ComponentRemoved);
changeService.ComponentRename += new ComponentRenameEventHandler(ComponentRenamed);
}
}
}
public EventBindingService()
public EventBindingService(IServiceProvider provider) : base(provider)
{
}
public virtual string CreateUniqueMethodName(IComponent component, EventDescriptor e)
protected override string CreateUniqueMethodName(IComponent component, EventDescriptor e)
{
return String.Format("{0}{1}", Char.ToUpper(component.Site.Name[0]) + component.Site.Name.Substring(1), e.DisplayName);
}
// sohuld look around in form class for compatiable methodes
public ICollection GetCompatibleMethods(EventDescriptor e)
protected override ICollection GetCompatibleMethods(EventDescriptor e)
{
IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
if (window != null) {
@ -62,43 +43,7 @@ namespace ICSharpCode.FormDesigner.Services @@ -62,43 +43,7 @@ namespace ICSharpCode.FormDesigner.Services
return new string[]{};
}
public ICollection GetCompatibleMethods(EventInfo e)
{
IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
if (window != null) {
FormDesignerViewContent formDesigner = window.ActiveViewContent as FormDesignerViewContent;
if (formDesigner != null) {
return formDesigner.GetCompatibleMethods(e);
}
}
return new string[]{};
}
public EventDescriptor GetEvent(PropertyDescriptor property)
{
EventPropertyDescriptor eventProp = property as EventPropertyDescriptor;
if (eventProp == null) {
return null;
}
return eventProp.Event;
}
public PropertyDescriptorCollection GetEventProperties(EventDescriptorCollection events)
{
PropertyDescriptor[] props = new PropertyDescriptor[events.Count];
for (int i = 0; i < events.Count; ++i) {
props[i] = GetEventProperty(events[i]);
}
return new PropertyDescriptorCollection(props);
}
public PropertyDescriptor GetEventProperty(EventDescriptor e)
{
return new EventPropertyDescriptor(e, this);
}
public bool ShowCode()
protected override bool ShowCode()
{
IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
if (window == null) {
@ -114,7 +59,7 @@ namespace ICSharpCode.FormDesigner.Services @@ -114,7 +59,7 @@ namespace ICSharpCode.FormDesigner.Services
return false;
}
public bool ShowCode(int lineNumber)
protected override bool ShowCode(int lineNumber)
{
IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
if (window == null) {
@ -130,7 +75,7 @@ namespace ICSharpCode.FormDesigner.Services @@ -130,7 +75,7 @@ namespace ICSharpCode.FormDesigner.Services
return false;
}
public bool ShowCode(IComponent component, EventDescriptor edesc)
protected override bool ShowCode(IComponent component, EventDescriptor edesc, string methodName)
{
IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
if (window == null || edesc == null || edesc.Name == null || edesc.Name.Length == 0) {
@ -139,183 +84,11 @@ namespace ICSharpCode.FormDesigner.Services @@ -139,183 +84,11 @@ namespace ICSharpCode.FormDesigner.Services
FormDesignerViewContent formDesigner = window.ActiveViewContent as FormDesignerViewContent;
if (formDesigner != null) {
object name = ((Hashtable)components[component])[edesc.Name];
string nameStr = name == null ? null : name.ToString();
if (nameStr != null && nameStr.Length > 0) {
formDesigner.ShowSourceCode(component, edesc, nameStr);
} else {
// TODO: Remove empty event methods.
}
formDesigner.ShowSourceCode(component, edesc, methodName);
return true;
}
return false;
}
protected void ComponentRemoved(object sender, ComponentEventArgs e)
{
components.Remove(e.Component);
}
protected void ComponentRenamed(object sender, ComponentRenameEventArgs e)
{
}
protected class EventTypeConverter : TypeConverter
{
IServiceProvider serviceProvider = null;
EventBindingService eventBindingService = null;
public EventTypeConverter(IServiceProvider serviceProvider, EventBindingService eventBindingService)
{
this.serviceProvider = serviceProvider;
this.eventBindingService = eventBindingService;
}
public override bool CanConvertFrom(ITypeDescriptorContext context,Type type)
{
return (type == typeof(string));
}
public override bool CanConvertTo(ITypeDescriptorContext context,Type type)
{
return (type == typeof(string));
}
public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,object value)
{
if (context != null)
{
EventPropertyDescriptor ed = context.PropertyDescriptor as EventPropertyDescriptor;
// ed.SetValue(context.Instance,value);
return value;
}
else return base.ConvertFrom(context,culture,value);
}
public override object ConvertTo(ITypeDescriptorContext context,CultureInfo culture,object value, Type type)
{
if (value != null) {
if (value.GetType() == typeof(string)) {
return value;
}
}
if (context != null) {
EventPropertyDescriptor ed = context.PropertyDescriptor as EventPropertyDescriptor;
if (ed != null) {
return ed.GetValue(context.Instance);
}
}
return base.ConvertTo(context, culture, value, type);
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
EventPropertyDescriptor ed = context.PropertyDescriptor as EventPropertyDescriptor;
if (ed == null || ed.eventBindingService == null) {
ISelectionService selectionService = (ISelectionService)this.serviceProvider.GetService(typeof(ISelectionService));
EventInfo eventInfo = selectionService.PrimarySelection.GetType().GetEvent(context.PropertyDescriptor.Name);
return new StandardValuesCollection(eventBindingService.GetCompatibleMethods(eventInfo));
}
ICollection col = ed.eventBindingService.GetCompatibleMethods(((EventPropertyDescriptor)context.PropertyDescriptor).Event);
return new StandardValuesCollection(col);
}
public override bool IsValid(ITypeDescriptorContext context, object o)
{
return true;
}
}
protected class EventPropertyDescriptor : PropertyDescriptor
{
protected EventDescriptor baseDescriptor = null;
public EventBindingService eventBindingService = null;
public EventPropertyDescriptor(EventDescriptor eventDesc, EventBindingService service): base(eventDesc)
{
baseDescriptor = eventDesc;
eventBindingService = service;
}
public EventDescriptor Event {
get { return baseDescriptor;}
}
public override Type ComponentType {
get {return Event.ComponentType;}
}
public override TypeConverter Converter {
get {return eventBindingService.eventTypeConverter;}
}
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)
{
IDictionary events = eventBindingService.components[component] as IDictionary;
if (events == null) {
return null;
}
return events[Name];
}
public override void ResetValue(object component)
{
SetValue(component,null);
}
public override void SetValue(object component, object value)
{
if (value as string == "") {
value = null;
}
IDictionary events = eventBindingService.components[component] as IDictionary;
string oldValue = null;
if (events != null) {
oldValue = (string)events[Name];
} else if (value != null) {
events = new Hashtable();
eventBindingService.components[component] = (Hashtable)events;
}
if (String.Compare(oldValue,(string)value) != 0) {
// eventBindingService.changeService.OnComponentChanging(component,Event);
events[Name] = value;
// eventBindingService.changeService.OnComponentChanged(component,Event,oldValue,value);
}
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
}
}
}

Loading…
Cancel
Save