Browse Source

Applied form designer patch by Christian Hornung:

- designer no longer rewrites fields of all parts in the designer file
- type names in non-designer parts are now correctly fixed to fully qualified type names
- designer no longer overwrites the wrong code region in the designer file
- when double-clicking an event which is defined in a different file, that file is now opened instead of a new (duplicate) method being created
- the design tab is now also shown if the System.Windows.Forms.Form base type is specified in the designer file, but not in the currently open file

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@867 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
bc3d54bf90
  1. 38
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs
  2. 2
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/IDesignerGenerator.cs
  3. 3
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/XmlDesignerGenerator.cs
  4. 2
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/NRefactoryDesignerLoader.cs
  5. 7
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs
  6. 1
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/SecondaryDisplayBinding.cs

38
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs

@ -28,7 +28,12 @@ namespace ICSharpCode.FormsDesigner
{ {
public abstract class AbstractDesignerGenerator : IDesignerGenerator public abstract class AbstractDesignerGenerator : IDesignerGenerator
{ {
/// <summary>The currently open part of the class being designed.</summary>
IClass c; IClass c;
/// <summary>The complete class being designed.</summary>
IClass completeClass;
/// <summary>The class part containing the designer code.</summary>
IClass formClass;
IMethod initializeComponents; IMethod initializeComponents;
FormsDesignerViewContent viewContent; FormsDesignerViewContent viewContent;
@ -63,11 +68,14 @@ namespace ICSharpCode.FormsDesigner
try { try {
LoggingService.Info("Remove field declaration: "+fieldName); LoggingService.Info("Remove field declaration: "+fieldName);
Reparse(); Reparse();
IField field = GetField(c, fieldName); IField field = GetField(formClass, fieldName);
if (field != null) { 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);
} else if ((field = GetField(completeClass, fieldName)) != null) {
// TODO: Remove the field in the part where it is declared
LoggingService.Warn("Removing field declaration in non-designer part currently not supported");
} }
SaveDocument(); SaveDocument();
} catch (Exception ex) { } catch (Exception ex) {
@ -98,15 +106,20 @@ namespace ICSharpCode.FormsDesigner
{ {
try { try {
Reparse(); Reparse();
IField oldField = GetField(c, newField.Name); IField oldField = GetField(formClass, newField.Name);
if (oldField != null) { if (oldField != null) {
int startOffset = document.PositionToOffset(new Point(0, oldField.Region.BeginLine - 1)); int startOffset = document.PositionToOffset(new Point(0, oldField.Region.BeginLine - 1));
int endOffset = document.PositionToOffset(new Point(0, oldField.Region.EndLine)); int endOffset = document.PositionToOffset(new Point(0, oldField.Region.EndLine));
document.Replace(startOffset, endOffset - startOffset, tabs + GenerateFieldDeclaration(domGenerator, newField) + Environment.NewLine); document.Replace(startOffset, endOffset - startOffset, tabs + GenerateFieldDeclaration(domGenerator, newField) + Environment.NewLine);
} else {
if ((oldField = GetField(completeClass, newField.Name)) != null) {
// TODO: Replace the field in the part where it is declared
LoggingService.Warn("Field declaration replacement in non-designer part currently not supported");
} else { } else {
int endOffset = document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine)); int endOffset = document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine));
document.Insert(endOffset, tabs + GenerateFieldDeclaration(domGenerator, newField) + Environment.NewLine); document.Insert(endOffset, tabs + GenerateFieldDeclaration(domGenerator, newField) + Environment.NewLine);
} }
}
SaveDocument(); SaveDocument();
} catch (Exception ex) { } catch (Exception ex) {
MessageService.ShowError(ex); MessageService.ShowError(ex);
@ -162,7 +175,7 @@ namespace ICSharpCode.FormsDesigner
foreach (CodeTypeMember m in formClass.Members) { foreach (CodeTypeMember m in formClass.Members) {
if (m is CodeMemberField) { if (m is CodeMemberField) {
CodeMemberField newField = (CodeMemberField)m; CodeMemberField newField = (CodeMemberField)m;
IField oldField = GetField(c, newField.Name); IField oldField = GetField(completeClass, newField.Name);
if (oldField == null || FieldChanged(oldField, newField)) { if (oldField == null || FieldChanged(oldField, newField)) {
AddOrReplaceField(domGenerator, newField); AddOrReplaceField(domGenerator, newField);
} }
@ -171,7 +184,7 @@ namespace ICSharpCode.FormsDesigner
// second loop looks for removed fields // second loop looks for removed fields
List<string> removedFields = new List<string>(); List<string> removedFields = new List<string>();
foreach (IField field in c.Fields) { foreach (IField field in completeClass.Fields) {
bool found = false; bool found = false;
foreach (CodeTypeMember m in formClass.Members) { foreach (CodeTypeMember m in formClass.Members) {
if (m is CodeMemberField && m.Name == field.Name) { if (m is CodeMemberField && m.Name == field.Name) {
@ -198,6 +211,7 @@ namespace ICSharpCode.FormsDesigner
{ {
// compare types // compare types
if (oldField.ReturnType.FullyQualifiedName != newField.Type.BaseType) { if (oldField.ReturnType.FullyQualifiedName != newField.Type.BaseType) {
LoggingService.Debug("FieldChanged: "+oldField.Name+", "+oldField.ReturnType.FullyQualifiedName+" -> "+newField.Type.BaseType);
return true; return true;
} }
@ -271,6 +285,7 @@ namespace ICSharpCode.FormsDesigner
designerContent = document.TextContent; designerContent = document.TextContent;
} }
ParserService.ParseFile(designerFile, designerContent, false, true); ParserService.ParseFile(designerFile, designerContent, false, true);
initializeComponents = FormsDesignerSecondaryDisplayBinding.GetInitializeComponents(c);
} }
using (StringReader r = new StringReader(designerContent)) { using (StringReader r = new StringReader(designerContent)) {
int count = initializeComponents.Region.BeginLine; int count = initializeComponents.Region.BeginLine;
@ -280,6 +295,8 @@ namespace ICSharpCode.FormsDesigner
tabs = line.Substring(0, line.Length - line.TrimStart().Length); tabs = line.Substring(0, line.Length - line.TrimStart().Length);
} }
this.c = c; this.c = c;
this.completeClass = c.DefaultReturnType.GetUnderlyingClass();
this.formClass = initializeComponents.DeclaringType;
break; break;
} }
} }
@ -294,18 +311,20 @@ namespace ICSharpCode.FormsDesigner
/// <param name="component"></param> /// <param name="component"></param>
/// <param name="edesc"></param> /// <param name="edesc"></param>
/// <returns></returns> /// <returns></returns>
public bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position) public bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out string file, out int position)
{ {
if (this.failedDesignerInitialize) { if (this.failedDesignerInitialize) {
position = 0; position = 0;
file = c.CompilationUnit.FileName;
return false; return false;
} }
Reparse(); Reparse();
foreach (IMethod method in c.Methods) { foreach (IMethod method in completeClass.Methods) {
if (method.Name == eventMethodName) { if (method.Name == eventMethodName) {
position = method.Region.BeginLine + 1; position = method.Region.BeginLine + 1;
file = method.DeclaringType.CompilationUnit.FileName;
return true; return true;
} }
} }
@ -313,6 +332,7 @@ namespace ICSharpCode.FormsDesigner
Reparse(); Reparse();
position = c.Region.EndLine + 1; position = c.Region.EndLine + 1;
file = c.CompilationUnit.FileName;
int offset = viewContent.Document.GetLineSegment(GetEventHandlerInsertionLine(c) - 1).Offset; int offset = viewContent.Document.GetLineSegment(GetEventHandlerInsertionLine(c) - 1).Offset;
@ -331,8 +351,7 @@ namespace ICSharpCode.FormsDesigner
Reparse(); Reparse();
ArrayList compatibleMethods = new ArrayList(); ArrayList compatibleMethods = new ArrayList();
MethodInfo methodInfo = edesc.EventType.GetMethod("Invoke"); MethodInfo methodInfo = edesc.EventType.GetMethod("Invoke");
c = c.DefaultReturnType.GetUnderlyingClass(); foreach (IMethod method in completeClass.Methods) {
foreach (IMethod method in c.Methods) {
if (method.Parameters.Count == methodInfo.GetParameters().Length) { if (method.Parameters.Count == methodInfo.GetParameters().Length) {
bool found = true; bool found = true;
for (int i = 0; i < methodInfo.GetParameters().Length; ++i) { for (int i = 0; i < methodInfo.GetParameters().Length; ++i) {
@ -360,8 +379,7 @@ namespace ICSharpCode.FormsDesigner
ParameterInfo pInfo = methodInfo.GetParameters()[0]; ParameterInfo pInfo = methodInfo.GetParameters()[0];
string eventName = pInfo.ParameterType.ToString().Replace("EventHandler", "EventArgs"); string eventName = pInfo.ParameterType.ToString().Replace("EventHandler", "EventArgs");
c = c.DefaultReturnType.GetUnderlyingClass(); foreach (IMethod method in completeClass.Methods) {
foreach (IMethod method in c.Methods) {
if (method.Parameters.Count == 2) { if (method.Parameters.Count == 2) {
bool found = true; bool found = true;

2
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/IDesignerGenerator.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.FormsDesigner
void Attach(FormsDesignerViewContent viewContent); void Attach(FormsDesignerViewContent viewContent);
void Detach(); void Detach();
void MergeFormChanges(CodeCompileUnit unit); void MergeFormChanges(CodeCompileUnit unit);
bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position); bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out string file, out int position);
ICollection GetCompatibleMethods(EventDescriptor edesc); ICollection GetCompatibleMethods(EventDescriptor edesc);
ICollection GetCompatibleMethods(EventInfo edesc); ICollection GetCompatibleMethods(EventInfo edesc);
} }

3
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/XmlDesignerGenerator.cs

@ -59,9 +59,10 @@ namespace ICSharpCode.FormsDesigner
//xml.WriteEndDocument(); //xml.WriteEndDocument();
viewContent.Document.TextContent = writer.ToString(); viewContent.Document.TextContent = writer.ToString();
} }
public bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position) public bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out string file, out int position)
{ {
position = 0; position = 0;
file = this.viewContent.TextEditorControl.FileName;
return false; return false;
} }

2
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/NRefactoryDesignerLoader.cs

@ -188,7 +188,7 @@ namespace ICSharpCode.FormsDesigner
} }
// Try to fix the type names to fully qualified ones // Try to fix the type names to fully qualified ones
FixTypeNames(p.CompilationUnit, parseInfo.BestCompilationUnit, ref foundInitMethod); FixTypeNames(p.CompilationUnit, part.CompilationUnit, ref foundInitMethod);
compilationUnits.Add(new KeyValuePair<string, CompilationUnit>(fileName, p.CompilationUnit)); compilationUnits.Add(new KeyValuePair<string, CompilationUnit>(fileName, p.CompilationUnit));
} }

7
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs

@ -269,8 +269,13 @@ namespace ICSharpCode.FormsDesigner
public void ShowSourceCode(IComponent component, EventDescriptor edesc, string eventMethodName) public void ShowSourceCode(IComponent component, EventDescriptor edesc, string eventMethodName)
{ {
int position; int position;
generator.InsertComponentEvent(component, edesc, eventMethodName, "", out position); string file;
generator.InsertComponentEvent(component, edesc, eventMethodName, "", out file, out position);
if (FileUtility.IsEqualFileName(file, this.TextEditorControl.FileName)) {
ShowSourceCode(position); ShowSourceCode(position);
} else {
FileService.JumpToFilePosition(file, position, 255);
}
} }
public ICollection GetCompatibleMethods(EventDescriptor edesc) public ICollection GetCompatibleMethods(EventDescriptor edesc)

1
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/SecondaryDisplayBinding.cs

@ -36,6 +36,7 @@ namespace ICSharpCode.FormsDesigner
public static bool BaseClassIsFormOrControl(IClass c) public static bool BaseClassIsFormOrControl(IClass c)
{ {
// Simple test for fully qualified name // Simple test for fully qualified name
c = c.DefaultReturnType.GetUnderlyingClass();
foreach (IReturnType baseType in c.BaseTypes) { foreach (IReturnType baseType in c.BaseTypes) {
if (baseType.FullyQualifiedName == "System.Windows.Forms.Form" if (baseType.FullyQualifiedName == "System.Windows.Forms.Form"
|| baseType.FullyQualifiedName == "System.Windows.Forms.UserControl" || baseType.FullyQualifiedName == "System.Windows.Forms.UserControl"

Loading…
Cancel
Save