Browse Source

Applied form designer field declaration patch by Christian Hornung.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@810 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
9203eb6ee3
  1. 7
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs
  2. 139
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/AbstractDesignerGenerator.cs
  3. 5
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs
  4. 17
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs
  5. 5
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs
  6. 6
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs
  7. 29
      src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs

7
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs

@ -9,6 +9,7 @@ using System;
using System.ComponentModel; using System.ComponentModel;
using System.Text; using System.Text;
using System.Reflection; using System.Reflection;
using System.CodeDom;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.FormDesigner; using ICSharpCode.FormDesigner;
@ -17,9 +18,11 @@ namespace Grunwald.BooBinding.Designer
{ {
public class BooDesignerGenerator : AbstractDesignerGenerator public class BooDesignerGenerator : AbstractDesignerGenerator
{ {
protected override string GenerateFieldDeclaration(Type fieldType, string name) protected override string GenerateFieldDeclaration(CodeDOMGenerator domGenerator, CodeMemberField field)
{ {
return "private " + name + " as " + fieldType; // TODO: add support for modifiers
// (or implement code generation for fields in the Boo CodeDomProvider)
return "private " + field.Name + " as " + field.Type.BaseType;
} }
protected override System.CodeDom.Compiler.CodeDomProvider CreateCodeProvider() protected override System.CodeDom.Compiler.CodeDomProvider CreateCodeProvider()

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

@ -8,6 +8,7 @@
using System; using System;
using System.IO; using System.IO;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Reflection; using System.Reflection;
@ -35,8 +36,6 @@ namespace ICSharpCode.FormDesigner
CodeDomProvider provider; CodeDomProvider provider;
public const string NonVisualComponentContainerName = "components";
public CodeDomProvider CodeDomProvider { public CodeDomProvider CodeDomProvider {
get { get {
if (this.provider == null) { if (this.provider == null) {
@ -49,31 +48,26 @@ namespace ICSharpCode.FormDesigner
public void Attach(FormDesignerViewContent viewContent) public void Attach(FormDesignerViewContent viewContent)
{ {
this.viewContent = viewContent; this.viewContent = viewContent;
IComponentChangeService componentChangeService = (IComponentChangeService)viewContent.DesignSurface.GetService(typeof(IComponentChangeService));
componentChangeService.ComponentAdded += new ComponentEventHandler(ComponentAdded);
componentChangeService.ComponentRename += new ComponentRenameEventHandler(ComponentRenamed);
componentChangeService.ComponentRemoving += new ComponentEventHandler(ComponentRemoved);
} }
public void Detach() public void Detach()
{ {
IComponentChangeService componentChangeService = (IComponentChangeService)viewContent.DesignSurface.GetService(typeof(IComponentChangeService));
componentChangeService.ComponentAdded -= new ComponentEventHandler(ComponentAdded);
componentChangeService.ComponentRename -= new ComponentRenameEventHandler(ComponentRenamed);
componentChangeService.ComponentRemoving -= new ComponentEventHandler(ComponentRemoved);
this.viewContent = null; this.viewContent = null;
} }
void ComponentRemoved(object sender, ComponentEventArgs e) /// <summary>
/// Removes the field declaration with the specified name from the source file.
/// </summary>
void RemoveField(string fieldName)
{ {
try { try {
LoggingService.Info("Remove field declaration: "+fieldName);
Reparse(); Reparse();
foreach (IField field in c.Fields) { IField field = GetField(c, fieldName);
if (field.Name == e.Component.Site.Name) { if (field != null) {
int startOffset = document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); int startOffset = document.PositionToOffset(new Point(0, field.Region.BeginLine - 1));
int endOffset = document.PositionToOffset(new Point(0, field.Region.EndLine)); int endOffset = document.PositionToOffset(new Point(0, field.Region.EndLine));
document.Remove(startOffset, endOffset - startOffset); document.Remove(startOffset, endOffset - startOffset);
}
} }
SaveDocument(); SaveDocument();
} catch (Exception ex) { } catch (Exception ex) {
@ -81,7 +75,12 @@ namespace ICSharpCode.FormDesigner
} }
} }
protected abstract string GenerateFieldDeclaration(Type fieldType, string name); protected virtual string GenerateFieldDeclaration(CodeDOMGenerator domGenerator, CodeMemberField field)
{
StringWriter writer = new StringWriter();
domGenerator.ConvertContentDefinition(field, writer);
return writer.ToString().Trim();
}
/// <summary> /// <summary>
/// Contains the tabs in front of the InitializeComponents declaration. /// Contains the tabs in front of the InitializeComponents declaration.
@ -89,33 +88,24 @@ namespace ICSharpCode.FormDesigner
/// </summary> /// </summary>
protected string tabs; protected string tabs;
void ComponentAdded(object sender, ComponentEventArgs e) /// <summary>
{ /// Adds the declaration for the specified field to the source file
try { /// or replaces the already present declaration for a field with the same name.
Reparse(); /// </summary>
int endOffset = document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine)); /// <param name="domGenerator">The CodeDOMGenerator used to generate the field declaration.</param>
document.Insert(endOffset, tabs + GenerateFieldDeclaration(e.Component.GetType(), e.Component.Site.Name) + Environment.NewLine); /// <param name="newField">The CodeDom field to be added or replaced.</param>
if (CodeDOMGenerator.IsNonVisualComponent(viewContent.Host, e.Component)) { void AddOrReplaceField(CodeDOMGenerator domGenerator, CodeMemberField newField)
if (!IsNonVisualComponentContainerDefined) {
document.Insert(endOffset, tabs + GenerateFieldDeclaration(typeof(Container), NonVisualComponentContainerName) + Environment.NewLine);
}
}
SaveDocument();
} catch (Exception ex) {
MessageService.ShowError(ex);
}
}
void ComponentRenamed(object sender, ComponentRenameEventArgs e)
{ {
try { try {
Reparse(); Reparse();
foreach (IField field in c.Fields) { IField oldField = GetField(c, newField.Name);
if (field.Name == e.OldName) { if (oldField != null) {
int startOffset = document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); int startOffset = document.PositionToOffset(new Point(0, oldField.Region.BeginLine - 1));
int endOffset = document.PositionToOffset(new Point(0, field.Region.EndLine)); int endOffset = document.PositionToOffset(new Point(0, oldField.Region.EndLine));
document.Replace(startOffset, endOffset - startOffset, tabs + GenerateFieldDeclaration(e.Component.GetType(), e.NewName) + Environment.NewLine); document.Replace(startOffset, endOffset - startOffset, tabs + GenerateFieldDeclaration(domGenerator, newField) + Environment.NewLine);
} } else {
int endOffset = document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine));
document.Insert(endOffset, tabs + GenerateFieldDeclaration(domGenerator, newField) + Environment.NewLine);
} }
SaveDocument(); SaveDocument();
} catch (Exception ex) { } catch (Exception ex) {
@ -166,6 +156,64 @@ namespace ICSharpCode.FormDesigner
document.Replace(startOffset, endOffset - startOffset, statements); document.Replace(startOffset, endOffset - startOffset, statements);
SaveDocument(); SaveDocument();
// apply changes the designer made to field declarations
// first loop looks for added and changed fields
foreach (CodeTypeMember m in formClass.Members) {
if (m is CodeMemberField) {
CodeMemberField newField = (CodeMemberField)m;
IField oldField = GetField(c, newField.Name);
if (oldField == null || FieldChanged(oldField, newField)) {
AddOrReplaceField(domGenerator, newField);
}
}
}
// second loop looks for removed fields
List<string> removedFields = new List<string>();
foreach (IField field in c.Fields) {
bool found = false;
foreach (CodeTypeMember m in formClass.Members) {
if (m is CodeMemberField && m.Name == field.Name) {
found = true;
break;
}
}
if (!found) {
removedFields.Add(field.Name);
}
}
// removing fields is done in two steps because
// we must not modify the c.Fields collection while it is enumerated
removedFields.ForEach(RemoveField);
}
/// <summary>
/// Compares the SharpDevelop.Dom field declaration oldField to
/// the CodeDom field declaration newField.
/// </summary>
/// <returns>true, if the fields are different in type or modifiers, otherwise false.</returns>
bool FieldChanged(IField oldField, CodeMemberField newField)
{
// compare types
if (oldField.ReturnType.FullyQualifiedName != newField.Type.BaseType) {
return true;
}
// compare modifiers
ModifierEnum[] sdModifiers = new ModifierEnum[] {ModifierEnum.Private, ModifierEnum.Protected, ModifierEnum.ProtectedAndInternal, ModifierEnum.Internal, ModifierEnum.Public};
MemberAttributes[] cdModifiers = new MemberAttributes[] {MemberAttributes.Private, MemberAttributes.Family, MemberAttributes.FamilyOrAssembly, MemberAttributes.Assembly, MemberAttributes.Public};
ModifierEnum oldModifiers = oldField.Modifiers & ModifierEnum.VisibilityMask;
MemberAttributes newModifiers = newField.Attributes & MemberAttributes.AccessMask;
for (int i = 0; i < sdModifiers.Length; i++) {
if ((oldModifiers == sdModifiers[i]) ^ (newModifiers == cdModifiers[i])) {
return true;
}
}
return false;
} }
IDocument document; IDocument document;
@ -321,13 +369,6 @@ namespace ICSharpCode.FormDesigner
return compatibleMethods; return compatibleMethods;
} }
bool IsNonVisualComponentContainerDefined
{
get {
return GetField(c, NonVisualComponentContainerName) != null;
}
}
IField GetField(IClass c, string name) IField GetField(IClass c, string name)
{ {
foreach (IField field in c.Fields) { foreach (IField field in c.Fields) {

5
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs

@ -17,11 +17,6 @@ namespace ICSharpCode.FormDesigner
{ {
public class CSharpDesignerGenerator : AbstractDesignerGenerator public class CSharpDesignerGenerator : AbstractDesignerGenerator
{ {
protected override string GenerateFieldDeclaration(Type fieldType, string name)
{
return "private " + fieldType + " " + name + ";";
}
protected override DomRegion GetReplaceRegion(ICSharpCode.TextEditor.Document.IDocument document, IMethod method) protected override DomRegion GetReplaceRegion(ICSharpCode.TextEditor.Document.IDocument document, IMethod method)
{ {
DomRegion r = method.BodyRegion; DomRegion r = method.BodyRegion;

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

@ -66,10 +66,21 @@ namespace ICSharpCode.FormDesigner
} }
public static bool IsNonVisualComponent(IDesignerHost host, IComponent component) public void ConvertContentDefinition(CodeMemberField field, TextWriter writer)
{ {
IDesigner designer = host.GetDesigner(component); LoggingService.Info("Generate field declaration for: "+field.Name);
return !(designer is ControlDesigner);
CodeGeneratorOptions options = codeDOMGeneratorUtility.CreateCodeGeneratorOptions;
options.IndentString = indentation;
try {
codeProvider.GenerateCodeFromMember(field, writer, options);
} catch (Exception e) {
codeProvider.GenerateCodeFromStatement(new CodeCommentStatement("TODO: Error while generating statement : " + e.Message),
writer,
options);
LoggingService.Error(e);
}
} }
} }

5
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs

@ -16,11 +16,6 @@ namespace ICSharpCode.FormDesigner
{ {
public class VBNetDesignerGenerator : AbstractDesignerGenerator public class VBNetDesignerGenerator : AbstractDesignerGenerator
{ {
protected override string GenerateFieldDeclaration(Type fieldType, string name)
{
return "Private " + name + " As " + fieldType;
}
protected override System.CodeDom.Compiler.CodeDomProvider CreateCodeProvider() protected override System.CodeDom.Compiler.CodeDomProvider CreateCodeProvider()
{ {
return new Microsoft.VisualBasic.VBCodeProvider(); return new Microsoft.VisualBasic.VBCodeProvider();

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

@ -301,6 +301,12 @@ namespace ICSharpCode.FormDesigner
protected override void Write(CodeCompileUnit unit) protected override void Write(CodeCompileUnit unit)
{ {
LoggingService.Info("DesignerLoader.Write called"); LoggingService.Info("DesignerLoader.Write called");
// output generated CodeDOM to the console :
#if DEBUG
if ((Control.ModifierKeys & Keys.Control) == Keys.Control) {
this.CodeDomProvider.GenerateCodeFromCompileUnit(unit, Console.Out, null);
}
#endif
generator.MergeFormChanges(unit); generator.MergeFormChanges(unit);
} }

29
src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs

@ -117,18 +117,8 @@ namespace ICSharpCode.NRefactory.Parser
if ((modifier & Modifier.Abstract) != 0) if ((modifier & Modifier.Abstract) != 0)
attr |= MemberAttributes.Abstract; attr |= MemberAttributes.Abstract;
// if ((modifier & Modifier.None) != 0)
// attr |= MemberAttributes.AccessMask;
if ((modifier & Modifier.Internal) != 0)
attr |= MemberAttributes.Assembly;
if ((modifier & Modifier.Const) != 0) if ((modifier & Modifier.Const) != 0)
attr |= MemberAttributes.Const; attr |= MemberAttributes.Const;
if ((modifier & Modifier.Protected) != 0)
attr |= MemberAttributes.Family;
if ((modifier & Modifier.Protected) != 0 && (modifier & Modifier.Internal) != 0)
attr |= MemberAttributes.FamilyAndAssembly;
// if ((modifier & Modifier.None) != 0)
// attr |= MemberAttributes.FamilyOrAssembly;
if ((modifier & Modifier.Sealed) != 0) if ((modifier & Modifier.Sealed) != 0)
attr |= MemberAttributes.Final; attr |= MemberAttributes.Final;
if ((modifier & Modifier.New) != 0) if ((modifier & Modifier.New) != 0)
@ -137,17 +127,20 @@ namespace ICSharpCode.NRefactory.Parser
attr |= MemberAttributes.Overloaded; attr |= MemberAttributes.Overloaded;
if ((modifier & Modifier.Override) != 0) if ((modifier & Modifier.Override) != 0)
attr |= MemberAttributes.Override; attr |= MemberAttributes.Override;
if ((modifier & Modifier.Static) != 0)
attr |= MemberAttributes.Static;
if ((modifier & Modifier.Private) != 0) if ((modifier & Modifier.Private) != 0)
attr |= MemberAttributes.Private; attr |= MemberAttributes.Private;
if ((modifier & Modifier.Public) != 0) else if ((modifier & Modifier.Public) != 0)
attr |= MemberAttributes.Public; attr |= MemberAttributes.Public;
// if ((modifier & Modifier.None) != 0) else if ((modifier & Modifier.Internal) != 0 && (modifier & Modifier.Protected) != 0)
// attr |= MemberAttributes.ScopeMask; attr |= MemberAttributes.FamilyOrAssembly;
if ((modifier & Modifier.Static) != 0) else if ((modifier & Modifier.Internal) != 0)
attr |= MemberAttributes.Static; attr |= MemberAttributes.Assembly;
// if ((modifier & Modifier.None) != 0) else if ((modifier & Modifier.Protected) != 0)
// attr |= MemberAttributes.VTableMask; attr |= MemberAttributes.Family;
return attr; return attr;
} }

Loading…
Cancel
Save