diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin index 12730e83ab..612c3d16a8 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin @@ -6,6 +6,7 @@ version = "1.0.0"> + @@ -44,6 +45,13 @@ resource = "Grunwald.BooBinding.Resources.Boo.xshd" /> + + + + + @@ -50,6 +51,10 @@ ..\..\RequiredLibraries\Boo.Lang.Parser.dll False + + ..\..\RequiredLibraries\Boo.Lang.CodeDom.dll + False + @@ -69,6 +74,10 @@ + + + + @@ -110,6 +119,12 @@ True + + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} + FormDesigner + False + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs index 42f4f8c00b..47a87f9960 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs @@ -112,8 +112,7 @@ namespace Grunwald.BooBinding.CodeCompletion try { compiler.Run(); - // somehow the SD parser thread goes into an endless loop if this flag is not set - visitor.Cu.ErrorsDuringCompile = true; //context.Errors.Count > 0 + //visitor.Cu.ErrorsDuringCompile = compiler.Errors.Count > 0 } catch (Exception ex) { MessageService.ShowError(ex); } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs index a4a8efca62..d7d2c6187a 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -295,7 +295,9 @@ namespace Grunwald.BooBinding.CodeCompletion public override bool EnterModule(AST.Module node) { - if (_firstModule) EnterTypeDefinition(node, ClassType.Class); + if (!_firstModule && node.Members.Count > 0) { + EnterTypeDefinition(node, ClassType.Module); + } _firstModule = false; return base.EnterModule(node); } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs new file mode 100644 index 0000000000..5305ca0a88 --- /dev/null +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs @@ -0,0 +1,59 @@ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// + +using System; +using System.ComponentModel; +using System.Reflection; +using ICSharpCode.Core; +using ICSharpCode.FormDesigner; + +namespace Grunwald.BooBinding.Designer +{ + public class BooDesignerGenerator : AbstractDesignerGenerator + { + protected override string GenerateFieldDeclaration(Type fieldType, string name) + { + return "private " + name + " as " + fieldType; + } + + protected override System.CodeDom.Compiler.CodeDomProvider CreateCodeProvider() + { + return new Boo.Lang.CodeDom.BooCodeProvider(); + } + + protected override string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body) + { + if (string.IsNullOrEmpty(body)) body = "\tpass"; + string param = GenerateParams(edesc); + return "private def " + eventMethodName + "(" + param + "):\n" + + body + + "\n"; + } + + protected static string GenerateParams(EventDescriptor edesc) + { + Type type = edesc.EventType; + MethodInfo mInfo = type.GetMethod("Invoke"); + string param = ""; + + for (int i = 0; i < mInfo.GetParameters().Length; ++i) { + ParameterInfo pInfo = mInfo.GetParameters()[i]; + + param += pInfo.Name; + param += " as "; + + string typeStr = pInfo.ParameterType.ToString(); + typeStr = BooAmbience.Instance.GetIntrinsicTypeName(typeStr); + param += typeStr; + if (i + 1 < mInfo.GetParameters().Length) { + param += ", "; + } + } + return param; + } + } +} diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs new file mode 100644 index 0000000000..1e71936e4d --- /dev/null +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs @@ -0,0 +1,141 @@ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// + +using System; +using System.Collections; +using System.Drawing; +using System.IO; +using System.ComponentModel.Design; +using System.CodeDom; +using System.CodeDom.Compiler; +using System.ComponentModel.Design.Serialization; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +using ICSharpCode.Core; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; + +using ICSharpCode.FormDesigner; +using ICSharpCode.FormDesigner.Services; +using Boo.Lang.Parser; +using Boo.Lang.Compiler.Ast; + +namespace Grunwald.BooBinding.Designer +{ + public class BooDesignerLoader : CodeDomDesignerLoader + { + bool loading = true; + IDesignerLoaderHost designerLoaderHost = null; + ITypeResolutionService typeResolutionService = null; + CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); + + TextEditorControl textEditorControl; + + public string TextContent { + get { + return textEditorControl.Document.TextContent; + } + } + + public override bool Loading { + get { + return loading; + } + } + + public IDesignerLoaderHost DesignerLoaderHost { + get { + return designerLoaderHost; + } + } + + protected override CodeDomProvider CodeDomProvider { + get { + return provider; + } + } + + protected override ITypeResolutionService TypeResolutionService { + get { + return typeResolutionService; + } + } + + protected override bool IsReloadNeeded() + { + return base.IsReloadNeeded() || TextContent != lastTextContent; + } + + public BooDesignerLoader(TextEditorControl textEditorControl) + { + this.textEditorControl = textEditorControl; + } + + public override void BeginLoad(IDesignerLoaderHost host) + { + this.loading = true; + typeResolutionService = (ITypeResolutionService)host.GetService(typeof(ITypeResolutionService)); + base.BeginLoad(host); + } + + protected override void OnEndLoad(bool successful, ICollection errors) + { + this.loading = false; + base.OnEndLoad(successful, errors); + } + + string lastTextContent; + + protected override CodeCompileUnit Parse() + { + LoggingService.Debug("BooDesignerLoader.Parse()"); + + lastTextContent = TextContent; + BooParsingStep step = new BooParsingStep(); + + StringBuilder errors = new StringBuilder(); + Module module = BooParser.ParseModule(4, new CompileUnit(), "BooDesignerLoaderModule", + new StringReader(lastTextContent), + delegate(antlr.RecognitionException e) { + errors.AppendLine(e.ToString()); + }); + + if (errors.Length > 0) { + throw new FormDesignerLoadException(errors.ToString()); + } + + // Try to fix the type names to fully qualified ones + ParseInformation parseInfo = ParserService.GetParseInformation(textEditorControl.FileName); + + /* + bool foundInitMethod = false; + //FixTypeNames(p.CompilationUnit, parseInfo.BestCompilationUnit, ref foundInitMethod); + if (!foundInitMethod) + throw new FormDesignerLoadException("The InitializeComponent method was not found. Designer cannot be loaded."); + */ + + CodeDomVisitor visitor = new CodeDomVisitor(parseInfo.MostRecentCompilationUnit.ProjectContent); + module.Accept(visitor); + + // output generated CodeDOM to the console : + ICSharpCode.NRefactory.Parser.CodeDOMVerboseOutputGenerator outputGenerator = new ICSharpCode.NRefactory.Parser.CodeDOMVerboseOutputGenerator(); + outputGenerator.GenerateCodeFromMember(visitor.OutputCompileUnit.Namespaces[0].Types[0], Console.Out, null); + provider.GenerateCodeFromCompileUnit(visitor.OutputCompileUnit, Console.Out, null); + + LoggingService.Debug("BooDesignerLoader.Parse() finished"); + return visitor.OutputCompileUnit; + } + + protected override void Write(CodeCompileUnit unit) + { + LoggingService.Info("BooDesignerLoader.Write called"); + provider.GenerateCodeFromCompileUnit(unit, Console.Out, null); + } + } +} diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs new file mode 100644 index 0000000000..da5bab5517 --- /dev/null +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs @@ -0,0 +1,410 @@ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// + +using System; +using System.Collections; +using System.CodeDom; +using System.Text; +using Boo.Lang.Compiler; +using Boo.Lang.Compiler.Ast; +using Boo.Lang.Compiler.Ast.Visitors; +using Boo.Lang.Parser; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; + +namespace Grunwald.BooBinding.Designer +{ + /// + /// The CodeDomVisitor is able to convert from the Boo AST to System.CodeDom + /// It makes use of the SharpDevelop parser service to get necessary additional + /// information about the types. + /// + public class CodeDomVisitor : DepthFirstVisitor + { + CodeCompileUnit _compileUnit = new CodeCompileUnit(); + + public CodeCompileUnit OutputCompileUnit { + get { + return _compileUnit; + } + } + + IProjectContent pc; + + public CodeDomVisitor(IProjectContent pc) + { + this.pc = pc; + } + + CodeNamespace _namespace; + CodeTypeDeclaration _class; + CodeStatementCollection _statements; + CodeExpression _expression; + + MemberAttributes ConvModifiers(TypeMember member) + { + if (member is Field) + return ConvModifiers(member.Modifiers, MemberAttributes.Family); + else + return ConvModifiers(member.Modifiers, MemberAttributes.Public); + } + + MemberAttributes ConvModifiers(TypeMemberModifiers modifier, MemberAttributes defaultAttr) + { + MemberAttributes attr = 0; + if ((modifier & TypeMemberModifiers.Abstract) == TypeMemberModifiers.Abstract) + attr |= MemberAttributes.Abstract; + if ((modifier & TypeMemberModifiers.Final) == TypeMemberModifiers.Final) + attr |= MemberAttributes.Const; + if ((modifier & TypeMemberModifiers.Internal) == TypeMemberModifiers.Internal) + attr |= MemberAttributes.Assembly; + if ((modifier & TypeMemberModifiers.Override) == TypeMemberModifiers.Override) + attr |= MemberAttributes.Override; + if ((modifier & TypeMemberModifiers.Private) == TypeMemberModifiers.Private) + attr |= MemberAttributes.Private; + if ((modifier & TypeMemberModifiers.Protected) == TypeMemberModifiers.Protected) + attr |= MemberAttributes.Family; + if ((modifier & TypeMemberModifiers.Public) == TypeMemberModifiers.Public) + attr |= MemberAttributes.Public; + if ((modifier & TypeMemberModifiers.Static) == TypeMemberModifiers.Static) + attr |= MemberAttributes.Static; + if ((modifier & TypeMemberModifiers.Virtual) != TypeMemberModifiers.Virtual) + attr |= MemberAttributes.Final; + if (attr == 0) + return defaultAttr; + else + return attr; + } + + CodeTypeReference ConvTypeRef(TypeReference tr) + { + if (tr == null) return null; + string name = tr.ToString(); + if (BooAmbience.ReverseTypeConversionTable.ContainsKey(name)) + name = BooAmbience.ReverseTypeConversionTable[name]; + return new CodeTypeReference(name); + } + + public override void OnCompileUnit(CompileUnit node) + { + foreach (Module m in node.Modules) + m.Accept(this); + } + + public override void OnModule(Module node) + { + if (node.Namespace == null) { + _namespace = new CodeNamespace("Global"); + _compileUnit.Namespaces.Add(_namespace); + } else { + node.Namespace.Accept(this); + } + foreach (Import i in node.Imports) + i.Accept(this); + foreach (TypeMember m in node.Members) + m.Accept(this); + } + + public override void OnNamespaceDeclaration(NamespaceDeclaration node) + { + _namespace = new CodeNamespace(node.Name); + _compileUnit.Namespaces.Add(_namespace); + } + + public override void OnImport(Import node) + { + _namespace.Imports.Add(new CodeNamespaceImport(node.Namespace)); + } + + CodeTypeDeclaration ConvertTypeDefinition(TypeDefinition node) + { + CodeTypeDeclaration oldClass = _class; + CodeTypeDeclaration newClass = new CodeTypeDeclaration(node.Name); + _class = newClass; + + foreach (TypeReference b in node.BaseTypes) + newClass.BaseTypes.Add(ConvTypeRef(b)); + + foreach (TypeMember member in node.Members) + member.Accept(this); + + if (oldClass == null) + _namespace.Types.Add(newClass); + else + oldClass.Members.Add(newClass); + _class = oldClass; + return newClass; + } + + public override void OnClassDefinition(ClassDefinition node) + { + ConvertTypeDefinition(node).IsClass = true; + } + + public override void OnStructDefinition(StructDefinition node) + { + ConvertTypeDefinition(node).IsStruct = true; + } + public override void OnInterfaceDefinition(InterfaceDefinition node) + { + ConvertTypeDefinition(node).IsInterface = true; + } + + public override void OnField(Field node) + { + CodeMemberField field = new CodeMemberField(ConvTypeRef(node.Type), node.Name); + field.Attributes = ConvModifiers(node); + if (node.Initializer != null) { + _expression = null; + //Visit(node.Initializer); + field.InitExpression = _expression; + } + _class.Members.Add(field); + } + + public override void OnConstructor(Boo.Lang.Compiler.Ast.Constructor node) + { + ConvertMethod(node, new CodeConstructor()); + } + public override void OnMethod(Method node) + { + CodeMemberMethod cmm = new CodeMemberMethod(); + cmm.Name = node.Name; + cmm.ReturnType = ConvTypeRef(node.ReturnType); + ConvertMethod(node, cmm); + } + public override void OnDestructor(Boo.Lang.Compiler.Ast.Destructor node) + { + CodeMemberMethod cmm = new CodeMemberMethod(); + cmm.Name = "Finalize"; + ConvertMethod(node, cmm); + } + void ConvertMethod(Method node, CodeMemberMethod method) + { + method.Attributes = ConvModifiers(node); + if (node.Parameters != null) { + foreach (ParameterDeclaration p in node.Parameters) + method.Parameters.Add(new CodeParameterDeclarationExpression(ConvTypeRef(p.Type), p.Name)); + } + _statements = method.Statements; + + if (node.Body != null) + node.Body.Accept(this); + + _class.Members.Add(method); + } + public override void OnBinaryExpression(BinaryExpression node) + { + BinaryOperatorType op = node.Operator; + if (op == BinaryOperatorType.Assign) { + _expression = null; + node.Left.Accept(this); + CodeExpression left = _expression; + _expression = null; + node.Right.Accept(this); + if (left != null && _expression != null) + _statements.Add(new CodeAssignStatement(left, _expression)); + _expression = null; + } + } + public override void OnBlock(Block node) + { + foreach (Statement n in node.Statements) + n.Accept(this); + } + + public override void OnExpressionStatement(ExpressionStatement node) + { + _expression = null; + node.Expression.Accept(this); + if (_expression != null) + _statements.Add(new CodeExpressionStatement(_expression)); + } + + public override void OnGotoStatement(GotoStatement node) + { + _statements.Add(new CodeGotoStatement(node.Label.Name)); + } + + public override void OnNullLiteralExpression(NullLiteralExpression node) + { + _expression = new CodePrimitiveExpression(null); + } + + public override void OnBoolLiteralExpression(BoolLiteralExpression node) + { + _expression = new CodePrimitiveExpression(node.Value); + } + + public override void OnStringLiteralExpression(StringLiteralExpression node) + { + _expression = new CodePrimitiveExpression(node.Value); + } + + public override void OnCharLiteralExpression(CharLiteralExpression node) + { + _expression = new CodePrimitiveExpression(node.Value); + } + + public override void OnIntegerLiteralExpression(IntegerLiteralExpression node) + { + _expression = new CodePrimitiveExpression(node.Value); + } + + public override void OnDoubleLiteralExpression(DoubleLiteralExpression node) + { + _expression = new CodePrimitiveExpression(node.Value); + } + + public override void OnMemberReferenceExpression(MemberReferenceExpression node) + { + _expression = null; + node.Target.Accept(this); + if (_expression != null) { + if (_expression is CodeTypeReferenceExpression) { + string baseName = ((CodeTypeReferenceExpression)_expression).Type.BaseType; + _expression = CreateMemberExpression(_expression, baseName, node.Name, true); + } else { + _expression = CreateMemberExpression(_expression, node.Name); + } + } + } + + public override void OnReferenceExpression(ReferenceExpression node) + { + if (pc.GetClass(node.Name) != null) + _expression = new CodeTypeReferenceExpression(node.Name); + else if (pc.NamespaceExists(node.Name)) + _expression = new CodeTypeReferenceExpression(node.Name); + else + _expression = CreateMemberExpression(new CodeThisReferenceExpression(), node.Name); + } + + CodeExpression CreateMemberExpression(CodeExpression expr, string name) + { + if (expr is CodeTypeReferenceExpression) { + string typeRef = ((CodeTypeReferenceExpression)_expression).Type.BaseType; + return CreateMemberExpression(expr, typeRef, name, true); + } else if (expr is CodeThisReferenceExpression) { + string typeRef = _namespace.Name + "." + _class.Name; + return CreateMemberExpression(expr, typeRef, name, false); + } else if (expr is CodeFieldReferenceExpression || expr is CodePropertyReferenceExpression) { + if (_fieldReferenceType == null) + return new CodePropertyReferenceExpression(expr, name); + return CreateMemberExpression(expr, _fieldReferenceType.FullyQualifiedName, name, false); + } else { + _fieldReferenceType = null; + return new CodePropertyReferenceExpression(expr, name); + } + } + + IReturnType _fieldReferenceType; + + CodeExpression CreateMemberExpression(CodeExpression target, string parentName, string name, bool isStatic) + { + _fieldReferenceType = null; + + string combinedName = parentName + "." + name; + if (pc.GetClass(combinedName) != null) + return new CodeTypeReferenceExpression(combinedName); + else if (pc.NamespaceExists(combinedName)) + return new CodeTypeReferenceExpression(combinedName); + + GetClassReturnType rt = new GetClassReturnType(pc, parentName, 0); + foreach (IProperty prop in rt.GetProperties()) { + if (prop.IsStatic == isStatic && prop.Name == name) { + _fieldReferenceType = prop.ReturnType; + return new CodePropertyReferenceExpression(target, name); + } + } + foreach (IEvent ev in rt.GetEvents()) { + if (ev.IsStatic == isStatic && ev.Name == name) { + _fieldReferenceType = ev.ReturnType; + return new CodeEventReferenceExpression(target, name); + } + } + foreach (IMethod me in rt.GetMethods()) { + if (me.IsStatic == isStatic && me.Name == name) { + _fieldReferenceType = me.ReturnType; + return new CodeMethodReferenceExpression(target, name); + } + } + foreach (IField field in rt.GetFields()) { + if (field.IsStatic == isStatic && field.Name == name) { + _fieldReferenceType = field.ReturnType; + return new CodeFieldReferenceExpression(target, name); + } + } + // unknown member, guess: + if (char.IsUpper(name, 0)) + return new CodePropertyReferenceExpression(target, name); + else + return new CodeFieldReferenceExpression(target, name); + } + + public override void OnAstLiteralExpression(AstLiteralExpression node) + { + _expression = new CodeObjectCreateExpression(node.Node.GetType()); + } + + public override void OnMethodInvocationExpression(MethodInvocationExpression node) + { + _expression = null; + node.Target.Accept(this); + if (_expression != null) { + CodeMethodInvokeExpression cmie; + CodeObjectCreateExpression coce; + + if (_expression is CodeTypeReferenceExpression) { + coce = new CodeObjectCreateExpression(((CodeTypeReferenceExpression)_expression).Type); + ConvertExpressions(coce.Parameters, node.Arguments); + _expression = coce; + } else if (_expression is CodeMethodReferenceExpression) { + cmie = new CodeMethodInvokeExpression((CodeMethodReferenceExpression)_expression); + ConvertExpressions(cmie.Parameters, node.Arguments); + _expression = cmie; + } else if (_expression is CodeFieldReferenceExpression) { + // when a type is unknown, a MemberReferenceExpression is translated into a CodeFieldReferenceExpression + CodeFieldReferenceExpression cfre = (CodeFieldReferenceExpression)_expression; + cmie = new CodeMethodInvokeExpression(cfre.TargetObject, cfre.FieldName); + ConvertExpressions(cmie.Parameters, node.Arguments); + _expression = cmie; + } else { + _expression = null; + } + } + } + + /// Converts a list of expressions to CodeDom expressions. + void ConvertExpressions(CodeExpressionCollection args, ExpressionCollection expressions) + { + foreach (Expression e in expressions) { + _expression = null; + e.Accept(this); + args.Add(_expression); + } + } + + public override void OnReturnStatement(ReturnStatement node) + { + _expression = null; + if (node.Expression != null) + node.Expression.Accept(this); + _statements.Add(new CodeMethodReturnStatement(_expression)); + } + + public override void OnSelfLiteralExpression(SelfLiteralExpression node) + { + _expression = new CodeThisReferenceExpression(); + } + + public override void OnSuperLiteralExpression(SuperLiteralExpression node) + { + _expression = new CodeBaseReferenceExpression(); + } + } +} diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/FormDesignerBinding.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/FormDesignerBinding.cs new file mode 100644 index 0000000000..35bdfa55b6 --- /dev/null +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/FormDesignerBinding.cs @@ -0,0 +1,61 @@ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// + +using System; +using System.IO; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.FormDesigner; +using ICSharpCode.TextEditor; + +namespace Grunwald.BooBinding.Designer +{ + public class FormDesignerDisplayBinding : ISecondaryDisplayBinding + { + public bool CanAttachTo(IViewContent viewContent) + { + if (viewContent is ITextEditorControlProvider) { + ITextEditorControlProvider textAreaControlProvider = (ITextEditorControlProvider)viewContent; + string fileExtension = String.Empty; + string fileName = viewContent.IsUntitled ? viewContent.UntitledName : viewContent.FileName; + if (fileName == null) + return false; + if (Path.GetExtension(fileName).Equals(".boo", StringComparison.InvariantCultureIgnoreCase)) { + ParseInformation info = ParserService.ParseFile(fileName, textAreaControlProvider.TextEditorControl.Document.TextContent, false, true); + if (FormDesignerSecondaryDisplayBinding.IsDesignable(info)) + return true; + } + } + return false; + } + + public ISecondaryViewContent[] CreateSecondaryViewContent(IViewContent viewContent) + { + IDesignerLoaderProvider loader = new BooDesignerLoaderProvider(((ITextEditorControlProvider)viewContent).TextEditorControl); + IDesignerGenerator generator = new BooDesignerGenerator(); + return new ISecondaryViewContent[] { new FormDesignerViewContent(viewContent, loader, generator) }; + } + } + + public class BooDesignerLoaderProvider : IDesignerLoaderProvider + { + TextEditorControl textEditorControl; + + public BooDesignerLoaderProvider(TextEditorControl textEditorControl) + { + this.textEditorControl = textEditorControl; + } + + public System.ComponentModel.Design.Serialization.DesignerLoader CreateLoader() + { + return new BooDesignerLoader(textEditorControl); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj index 3e46e77df2..cc38af8586 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj @@ -105,6 +105,7 @@ + diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/AbstractDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/AbstractDesignerGenerator.cs new file mode 100644 index 0000000000..c41cf5a8fc --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/AbstractDesignerGenerator.cs @@ -0,0 +1,249 @@ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// + +using System; +using System.IO; +using System.Collections; +using System.Diagnostics; +using System.Drawing; +using System.Reflection; +using System.ComponentModel; +using System.ComponentModel.Design; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; + +using ICSharpCode.Core; + +namespace ICSharpCode.FormDesigner +{ + public abstract class AbstractDesignerGenerator : IDesignerGenerator + { + IClass c; + IMethod initializeComponents; + + FormDesignerViewContent viewContent; + bool failedDesignerInitialize = false; + + public const string NonVisualComponentContainerName = "components"; + + public void Attach(FormDesignerViewContent 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() + { + 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; + } + + void ComponentRemoved(object sender, ComponentEventArgs e) + { + try { + Reparse(viewContent.Document.TextContent); + foreach (IField field in c.Fields) { + if (field.Name == e.Component.Site.Name) { + int startOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); + int endOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.EndLine)); + viewContent.Document.Remove(startOffset, endOffset - startOffset); + } + } + } catch (Exception ex) { + MessageService.ShowError(ex); + } + } + + protected abstract string GenerateFieldDeclaration(Type fieldType, string name); + + /// + /// Contains the tabs in front of the InitializeComponents declaration. + /// Used to indent the fields and generated statements. + /// + protected string tabs; + + void ComponentAdded(object sender, ComponentEventArgs e) + { + try { + Reparse(viewContent.Document.TextContent); + int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine)); + viewContent.Document.Insert(endOffset, tabs + GenerateFieldDeclaration(e.Component.GetType(), e.Component.Site.Name) + Environment.NewLine); + if (CodeDOMGenerator.IsNonVisualComponent(viewContent.Host, e.Component)) { + if (!IsNonVisualComponentContainerDefined) { + viewContent.Document.Insert(endOffset, tabs + GenerateFieldDeclaration(typeof(Container), NonVisualComponentContainerName) + Environment.NewLine); + } + } + } catch (Exception ex) { + MessageService.ShowError(ex); + } + } + + void ComponentRenamed(object sender, ComponentRenameEventArgs e) + { + Reparse(viewContent.Document.TextContent); + foreach (IField field in c.Fields) { + if (field.Name == e.OldName) { + int startOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); + int endOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.EndLine)); + viewContent.Document.Replace(startOffset, endOffset - startOffset, tabs + GenerateFieldDeclaration(e.Component.GetType(), e.NewName) + Environment.NewLine); + } + } + } + + protected abstract System.CodeDom.Compiler.CodeDomProvider CreateCodeProvider(); + + public void MergeFormChanges() + { + if (tabs == null) Reparse(viewContent.Document.TextContent); + + // generate file and get initialize components string + StringWriter writer = new StringWriter(); + new CodeDOMGenerator(viewContent.Host, CreateCodeProvider(), tabs + '\t').ConvertContentDefinition(writer); + string statements = writer.ToString(); + + Reparse(viewContent.Document.TextContent); + + int startOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.BeginLine + 1)); + int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine - 1)); + + viewContent.Document.Replace(startOffset, endOffset - startOffset, statements); + } + + protected void Reparse(string content) + { + // get new initialize components + ParseInformation info = ParserService.ParseFile(viewContent.TextEditorControl.FileName, content, false, true); + ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit; + foreach (IClass c in cu.Classes) { + if (FormDesignerSecondaryDisplayBinding.BaseClassIsFormOrControl(c)) { + initializeComponents = FormDesignerSecondaryDisplayBinding.GetInitializeComponents(c); + if (initializeComponents != null) { + using (StringReader r = new StringReader(content)) { + int count = initializeComponents.Region.BeginLine; + for (int i = 1; i < count; i++) + r.ReadLine(); + string line = r.ReadLine(); + tabs = line.Substring(0, line.Length - line.TrimStart().Length); + } + this.c = c; + break; + } + } + } + } + + protected abstract string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body); + + /// + /// If found return true and int as position + /// + /// + /// + /// + public bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position) + { + if (this.failedDesignerInitialize) { + position = 0; + return false; + } + + Reparse(viewContent.Document.TextContent); + + foreach (IMethod method in c.Methods) { + if (method.Name == eventMethodName) { + position = method.Region.BeginLine + 1; + return true; + } + } + MergeFormChanges(); + Reparse(viewContent.Document.TextContent); + + position = c.Region.EndLine + 1; + + int offset = viewContent.Document.GetLineSegment(c.Region.EndLine - 1).Offset; + + viewContent.Document.Insert(offset, CreateEventHandler(edesc, eventMethodName, body)); + viewContent.Document.FormattingStrategy.IndentLines(viewContent.TextEditorControl.ActiveTextAreaControl.TextArea, c.Region.EndLine - 1, c.Region.EndLine + 3); + + return false; + } + + public ICollection GetCompatibleMethods(EventDescriptor edesc) + { + Reparse(viewContent.Document.TextContent); + ArrayList compatibleMethods = new ArrayList(); + MethodInfo methodInfo = edesc.EventType.GetMethod("Invoke"); + foreach (IMethod method in c.Methods) { + if (method.Parameters.Count == methodInfo.GetParameters().Length) { + bool found = true; + for (int i = 0; i < methodInfo.GetParameters().Length; ++i) { + ParameterInfo pInfo = methodInfo.GetParameters()[i]; + IParameter p = method.Parameters[i]; + if (p.ReturnType.FullyQualifiedName != pInfo.ParameterType.ToString()) { + found = false; + break; + } + } + if (found) { + compatibleMethods.Add(method.Name); + } + } + } + + return compatibleMethods; + } + + public ICollection GetCompatibleMethods(EventInfo edesc) + { + Reparse(viewContent.Document.TextContent); + ArrayList compatibleMethods = new ArrayList(); + MethodInfo methodInfo = edesc.GetAddMethod(); + ParameterInfo pInfo = methodInfo.GetParameters()[0]; + string eventName = pInfo.ParameterType.ToString().Replace("EventHandler", "EventArgs"); + + foreach (IMethod method in c.Methods) { + if (method.Parameters.Count == 2) { + bool found = true; + + IParameter p = method.Parameters[1]; + if (p.ReturnType.FullyQualifiedName != eventName) { + found = false; + } + if (found) { + compatibleMethods.Add(method.Name); + } + } + } + return compatibleMethods; + } + + bool IsNonVisualComponentContainerDefined + { + get { + return GetField(c, NonVisualComponentContainerName) != null; + } + } + + IField GetField(IClass c, string name) + { + foreach (IField field in c.Fields) { + if (field.Name == name) { + return field; + } + } + return null; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs index cf3f3d573f..c5278df8f7 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs @@ -1,162 +1,36 @@ -// +// // 2002-2005 AlphaSierraPapa // GNU General Public License -// +// // $Revision$ // using System; -using System.Text; -using System.Text.RegularExpressions; -using System.IO; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Design; -using System.Reflection; -using System.Windows.Forms; -using System.Drawing.Printing; using System.ComponentModel; -using System.ComponentModel.Design; -using System.ComponentModel.Design.Serialization; -using System.Xml; - -using ICSharpCode.SharpDevelop.Gui; -using ICSharpCode.SharpDevelop.Dom; -using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.SharpDevelop.Internal.Undo; -using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; - +using System.Reflection; using ICSharpCode.Core; -using ICSharpCode.FormDesigner.Services; -using ICSharpCode.TextEditor; -using ICSharpCode.TextEditor.Document; - -using ICSharpCode.NRefactory.Parser; -using ICSharpCode.NRefactory.Parser.AST; -using ICSharpCode.NRefactory.PrettyPrinter; - -using System.CodeDom; -using System.CodeDom.Compiler; - -using Microsoft.CSharp; -using Microsoft.VisualBasic; namespace ICSharpCode.FormDesigner { - public class CSharpDesignerGenerator : IDesignerGenerator + public class CSharpDesignerGenerator : AbstractDesignerGenerator { - IClass c; - IMethod initializeComponents; - - FormDesignerViewContent viewContent; - bool failedDesignerInitialize = false; - - string NonVisualComponentContainerName = "components"; - - public void Attach(FormDesignerViewContent 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() - { - 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; - } - - void ComponentRemoved(object sender, ComponentEventArgs e) - { - try { - Reparse(viewContent.Document.TextContent); - foreach (IField field in c.Fields) { - if (field.Name == e.Component.Site.Name) { - int startOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); - int endOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.EndLine)); - viewContent.Document.Remove(startOffset, endOffset - startOffset); - } - } - } catch (Exception ex) { - MessageService.ShowError(ex); - } - } - - void ComponentAdded(object sender, ComponentEventArgs e) + protected override string GenerateFieldDeclaration(Type fieldType, string name) { - try { - Reparse(viewContent.Document.TextContent); - int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine)); - viewContent.Document.Insert(endOffset, "\t\tprivate " + e.Component.GetType() + " " + e.Component.Site.Name + ";" + Environment.NewLine); - if (CodeDOMGenerator.IsNonVisualComponent(viewContent.Host, e.Component)) { - if (!IsNonVisualComponentContainerDefined) { - viewContent.Document.Insert(endOffset, "\t\tprivate " + typeof(Container) + " " + NonVisualComponentContainerName + ";" + Environment.NewLine); - } - } - } catch (Exception ex) { - MessageService.ShowError(ex); - } + return "private " + fieldType + " " + name + ";"; } - void ComponentRenamed(object sender, ComponentRenameEventArgs e) + protected override System.CodeDom.Compiler.CodeDomProvider CreateCodeProvider() { - Reparse(viewContent.Document.TextContent); - foreach (IField field in c.Fields) { - if (field.Name == e.OldName) { - int startOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); - int endOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.EndLine)); - viewContent.Document.Replace(startOffset, endOffset - startOffset, "\t\tprivate " + e.Component.GetType() + " " + e.NewName + ";" + Environment.NewLine); - } - } + return new Microsoft.CSharp.CSharpCodeProvider(); } - public void MergeFormChanges() + protected override string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body) { + string param = GenerateParams(edesc, true); - // generate file and get initialize components string - StringWriter writer = new StringWriter(); - new CodeDOMGenerator(viewContent.Host, new Microsoft.CSharp.CSharpCodeProvider()).ConvertContentDefinition(writer); - string statements = writer.ToString(); - - Reparse(viewContent.Document.TextContent); - - int startOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.BeginLine + 1)); - int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine - 1)); - - viewContent.Document.Replace(startOffset, endOffset - startOffset, statements); - } - - protected void Reparse(string content) - { - // get new initialize components - ParseInformation info = ParserService.ParseFile(viewContent.TextEditorControl.FileName, content, false, true); - ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit; - foreach (IClass c in cu.Classes) { - if (FormDesignerSecondaryDisplayBinding.BaseClassIsFormOrControl(c)) { - initializeComponents = GetInitializeComponents(c); - if (initializeComponents != null) { - this.c = c; - break; - } - } - } - } - - IMethod GetInitializeComponents(IClass c) - { - foreach (IMethod method in c.Methods) { - if ((method.Name == "InitializeComponents" || method.Name == "InitializeComponent") && method.Parameters.Count == 0) { - return method; - } - } - return null; + return "void " + eventMethodName + "(" + param + ")\n" + + "{\n" + body + + "\n}\n\n"; } protected static string GenerateParams(EventDescriptor edesc, bool paramNames) @@ -189,110 +63,5 @@ namespace ICSharpCode.FormDesigner } return param; } - - /// - /// If found return true and int as position - /// - /// - /// - /// - public bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position) - { - if (this.failedDesignerInitialize) { - position = 0; - return false; - } - - Reparse(viewContent.Document.TextContent); - - foreach (IMethod method in c.Methods) { - if (method.Name == eventMethodName) { - position = method.Region.BeginLine + 1; - return true; - } - } - MergeFormChanges(); - Reparse(viewContent.Document.TextContent); - - position = c.Region.EndLine + 1; - - int offset = viewContent.Document.GetLineSegment(c.Region.EndLine - 1).Offset; - - string param = GenerateParams(edesc, true); - - string text = "void " + eventMethodName + "(" + param + ")\n" + - "{\n" + body + - "\n}\n\n"; - viewContent.Document.Insert(offset, text); - viewContent.Document.FormattingStrategy.IndentLines(viewContent.TextEditorControl.ActiveTextAreaControl.TextArea, c.Region.EndLine - 1, c.Region.EndLine + 3); - - return false; - } - - public ICollection GetCompatibleMethods(EventDescriptor edesc) - { - Reparse(viewContent.Document.TextContent); - ArrayList compatibleMethods = new ArrayList(); - MethodInfo methodInfo = edesc.EventType.GetMethod("Invoke"); - foreach (IMethod method in c.Methods) { - if (method.Parameters.Count == methodInfo.GetParameters().Length) { - bool found = true; - for (int i = 0; i < methodInfo.GetParameters().Length; ++i) { - ParameterInfo pInfo = methodInfo.GetParameters()[i]; - IParameter p = method.Parameters[i]; - if (p.ReturnType.FullyQualifiedName != pInfo.ParameterType.ToString()) { - found = false; - break; - } - } - if (found) { - compatibleMethods.Add(method.Name); - } - } - } - - return compatibleMethods; - } - - public ICollection GetCompatibleMethods(EventInfo edesc) - { - Reparse(viewContent.Document.TextContent); - ArrayList compatibleMethods = new ArrayList(); - MethodInfo methodInfo = edesc.GetAddMethod(); - ParameterInfo pInfo = methodInfo.GetParameters()[0]; - string eventName = pInfo.ParameterType.ToString().Replace("EventHandler", "EventArgs"); - - foreach (IMethod method in c.Methods) { - if (method.Parameters.Count == 2) { - bool found = true; - - IParameter p = method.Parameters[1]; - if (p.ReturnType.FullyQualifiedName != eventName) { - found = false; - } - if (found) { - compatibleMethods.Add(method.Name); - } - } - } - return compatibleMethods; - } - - bool IsNonVisualComponentContainerDefined - { - get { - return GetField(c, NonVisualComponentContainerName) != null; - } - } - - IField GetField(IClass c, string name) - { - foreach (IField field in c.Fields) { - if (field.Name == name) { - return field; - } - } - return null; - } } } diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs index 6e773c0f8e..d4aa3b920f 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs @@ -40,11 +40,13 @@ namespace ICSharpCode.FormDesigner CodeDOMGeneratorUtility codeDOMGeneratorUtility = new CodeDOMGeneratorUtility(); List addedVariables = new List(); + string indentation; - public CodeDOMGenerator(IDesignerHost host, CodeDomProvider codeProvider) + public CodeDOMGenerator(IDesignerHost host, CodeDomProvider codeProvider, string indentation) { this.host = host; this.codeProvider = codeProvider; + this.indentation = indentation; } public void ConvertContentDefinition(TextWriter writer) @@ -57,9 +59,68 @@ namespace ICSharpCode.FormDesigner addedVariables.Clear(); + List statements = new List(); + foreach (IComponent component in host.Container.Components) { if (!IsComponentAdded(component)) { - GenerateComponentCode(component, writer, serializationManager); + 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; + } + } + + + CodeGeneratorOptions options = codeDOMGeneratorUtility.CreateCodeGeneratorOptions; + options.IndentString = indentation; + foreach (CodeStatement statement in statements) { + // indentation isn't generated when calling GenerateCodeFromStatement + writer.Write(options.IndentString); + try { +// outputGenerator.PublicGenerateCodeFromStatement(statement, Console.Out, options); + codeProvider.GenerateCodeFromStatement(statement, writer, options); + } catch (Exception e) { + codeProvider.GenerateCodeFromStatement(new CodeCommentStatement("TODO: Error while generating statement : " + e.Message), + writer, + options); + LoggingService.Error(e); } } @@ -68,13 +129,22 @@ namespace ICSharpCode.FormDesigner 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) { IDesigner designer = host.GetDesigner(component); return !(designer is ControlDesigner); } - void GenerateComponentCode(IComponent component, TextWriter writer, DesignerSerializationManager serializationManager) + void GenerateComponentCode(IComponent component, List outputStatements, DesignerSerializationManager serializationManager) { LoggingService.Debug("Generate code for: " + component.Site.Name); Type componentType = component.GetType(); @@ -88,8 +158,6 @@ namespace ICSharpCode.FormDesigner } ICollection statements = serializer.Serialize(serializationManager, component) as ICollection; - CodeGeneratorOptions options = codeDOMGeneratorUtility.CreateCodeGeneratorOptions; - options.IndentString = "\t\t\t"; // ICSharpCode.NRefactory.Parser.CodeDOMVerboseOutputGenerator outputGenerator = new ICSharpCode.NRefactory.Parser.CodeDOMVerboseOutputGenerator(); @@ -117,17 +185,7 @@ namespace ICSharpCode.FormDesigner } } - // indentation isn't generated when calling GenerateCodeFromStatement - writer.Write(options.IndentString); - try { -// outputGenerator.PublicGenerateCodeFromStatement(statement, Console.Out, options); - codeProvider.GenerateCodeFromStatement(statement, writer, options); - } catch (Exception e) { - codeProvider.GenerateCodeFromStatement(new CodeCommentStatement("TODO: Error while generating statement : " + e.Message), - writer, - options); - LoggingService.Error(e); - } + outputStatements.Add(statement); } } diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs index dbee98df63..e10bf4bdc4 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs @@ -6,42 +6,11 @@ // using System; -using System.Text; -using System.Text.RegularExpressions; -using System.IO; using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Design; -using System.Reflection; -using System.Windows.Forms; -using System.Drawing.Printing; using System.ComponentModel; -using System.ComponentModel.Design; -using System.ComponentModel.Design.Serialization; -using System.Xml; +using System.Reflection; using ICSharpCode.SharpDevelop.Gui; -using ICSharpCode.SharpDevelop.Dom; -using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.SharpDevelop.Internal.Undo; -using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; - -using ICSharpCode.Core; -using ICSharpCode.FormDesigner.Services; -using ICSharpCode.TextEditor; -using ICSharpCode.TextEditor.Document; - -using ICSharpCode.NRefactory.Parser; -using ICSharpCode.NRefactory.Parser.AST; -using ICSharpCode.NRefactory.PrettyPrinter; - -using System.CodeDom; -using System.CodeDom.Compiler; - -using Microsoft.CSharp; -using Microsoft.VisualBasic; namespace ICSharpCode.FormDesigner { diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs index 830efe9d35..b13e2a0820 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs @@ -1,161 +1,36 @@ // // 2002-2005 AlphaSierraPapa // GNU General Public License -// +// // $Revision$ // using System; -using System.Text; -using System.Text.RegularExpressions; -using System.IO; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Design; -using System.Reflection; -using System.Windows.Forms; -using System.Drawing.Printing; using System.ComponentModel; -using System.ComponentModel.Design; -using System.ComponentModel.Design.Serialization; -using System.Xml; - -using ICSharpCode.SharpDevelop.Gui; -using ICSharpCode.SharpDevelop.Dom; -using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.SharpDevelop.Internal.Undo; -using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; - +using System.Reflection; using ICSharpCode.Core; -using ICSharpCode.FormDesigner.Services; -using ICSharpCode.TextEditor; -using ICSharpCode.TextEditor.Document; - -using ICSharpCode.NRefactory.Parser; -using ICSharpCode.NRefactory.Parser.AST; -using ICSharpCode.NRefactory.PrettyPrinter; - -using System.CodeDom; -using System.CodeDom.Compiler; - -using Microsoft.CSharp; -using Microsoft.VisualBasic; namespace ICSharpCode.FormDesigner { - public class VBNetDesignerGenerator : IDesignerGenerator + public class VBNetDesignerGenerator : AbstractDesignerGenerator { - IClass c; - IMethod initializeComponents; - - FormDesignerViewContent viewContent; - bool failedDesignerInitialize = false; - - string NonVisualComponentContainerName = "components"; - - public void Attach(FormDesignerViewContent 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() - { - 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; - } - - void ComponentRemoved(object sender, ComponentEventArgs e) - { - try { - Reparse(viewContent.Document.TextContent); - foreach (IField field in c.Fields) { - if (field.Name == e.Component.Site.Name) { - int startOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); - int endOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.EndLine)); - viewContent.Document.Remove(startOffset, endOffset - startOffset); - } - } - } catch (Exception ex) { - MessageService.ShowError(ex); - } - } - - void ComponentAdded(object sender, ComponentEventArgs e) + protected override string GenerateFieldDeclaration(Type fieldType, string name) { - try { - Reparse(viewContent.Document.TextContent); - int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine)); - viewContent.Document.Insert(endOffset, "\tPrivate " + e.Component.Site.Name + " As " + e.Component.GetType() + Environment.NewLine); - if (CodeDOMGenerator.IsNonVisualComponent(viewContent.Host, e.Component)) { - if (!IsNonVisualComponentContainerDefined) { - viewContent.Document.Insert(endOffset, "\tPrivate " + NonVisualComponentContainerName + " As " + typeof(Container) + Environment.NewLine); - } - } - } catch (Exception ex) { - MessageService.ShowError(ex); - } + return "Private " + name + " As " + fieldType; } - void ComponentRenamed(object sender, ComponentRenameEventArgs e) + protected override System.CodeDom.Compiler.CodeDomProvider CreateCodeProvider() { - Reparse(viewContent.Document.TextContent); - foreach (IField field in c.Fields) { - if (field.Name == e.OldName) { - int startOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); - int endOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.EndLine)); - viewContent.Document.Replace(startOffset, endOffset - startOffset, "\tPrivate " + e.NewName + " As " + e.Component.GetType() + Environment.NewLine); - } - } + return new Microsoft.VisualBasic.VBCodeProvider(); } - public void MergeFormChanges() + protected override string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body) { - // generate file and get initialize components string - StringWriter writer = new StringWriter(); - new CodeDOMGenerator(viewContent.Host, new Microsoft.VisualBasic.VBCodeProvider()).ConvertContentDefinition(writer); - string statements = writer.ToString(); - - Reparse(viewContent.Document.TextContent); - - int startOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.BeginLine + 1)); - int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine - 1)); + string param = GenerateParams(edesc); - viewContent.Document.Replace(startOffset, endOffset - startOffset, statements); - } - - protected void Reparse(string content) - { - // get new initialize components - ParseInformation info = ParserService.ParseFile(viewContent.TextEditorControl.FileName, content, false, true); - ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit; - foreach (IClass c in cu.Classes) { - if (FormDesignerSecondaryDisplayBinding.BaseClassIsFormOrControl(c)) { - initializeComponents = GetInitializeComponents(c); - if (initializeComponents != null) { - this.c = c; - break; - } - } - } - } - - IMethod GetInitializeComponents(IClass c) - { - foreach (IMethod method in c.Methods) { - if ((method.Name == "InitializeComponents" || method.Name == "InitializeComponent") && method.Parameters.Count == 0) { - return method; - } - } - return null; + return "Sub " + eventMethodName + "(" + param + ")\n" + + body + + "\nEnd Sub\n\n"; } protected static string GenerateParams(EventDescriptor edesc) @@ -187,110 +62,5 @@ namespace ICSharpCode.FormDesigner } return param; } - - /// - /// If found return true and int as position - /// - /// - /// - /// - public bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position) - { - if (this.failedDesignerInitialize) { - position = 0; - return false; - } - - Reparse(viewContent.Document.TextContent); - - foreach (IMethod method in c.Methods) { - if (method.Name == eventMethodName) { - position = method.Region.BeginLine + 1; - return true; - } - } - MergeFormChanges(); - Reparse(viewContent.Document.TextContent); - - position = c.Region.EndLine + 1; - - int offset = viewContent.Document.GetLineSegment(c.Region.EndLine - 1).Offset; - - string param = GenerateParams(edesc); - - string text = "Sub " + eventMethodName + "(" + param + ")\n" + - body + - "\nEnd Sub\n\n"; - viewContent.Document.Insert(offset, text); - viewContent.Document.FormattingStrategy.IndentLines(viewContent.TextEditorControl.ActiveTextAreaControl.TextArea, c.Region.EndLine - 1, c.Region.EndLine + 3); - - return false; - } - - public ICollection GetCompatibleMethods(EventDescriptor edesc) - { - Reparse(viewContent.Document.TextContent); - ArrayList compatibleMethods = new ArrayList(); - MethodInfo methodInfo = edesc.EventType.GetMethod("Invoke"); - foreach (IMethod method in c.Methods) { - if (method.Parameters.Count == methodInfo.GetParameters().Length) { - bool found = true; - for (int i = 0; i < methodInfo.GetParameters().Length; ++i) { - ParameterInfo pInfo = methodInfo.GetParameters()[i]; - IParameter p = method.Parameters[i]; - if (p.ReturnType.FullyQualifiedName != pInfo.ParameterType.ToString()) { - found = false; - break; - } - } - if (found) { - compatibleMethods.Add(method.Name); - } - } - } - - return compatibleMethods; - } - - public ICollection GetCompatibleMethods(EventInfo edesc) - { - Reparse(viewContent.Document.TextContent); - ArrayList compatibleMethods = new ArrayList(); - MethodInfo methodInfo = edesc.GetAddMethod(); - ParameterInfo pInfo = methodInfo.GetParameters()[0]; - string eventName = pInfo.ParameterType.ToString().Replace("EventHandler", "EventArgs"); - - foreach (IMethod method in c.Methods) { - if (method.Parameters.Count == 2) { - bool found = true; - - IParameter p = method.Parameters[1]; - if (p.ReturnType.FullyQualifiedName != eventName) { - found = false; - } - if (found) { - compatibleMethods.Add(method.Name); - } - } - } - return compatibleMethods; - } - - bool IsNonVisualComponentContainerDefined - { - get { - return GetField(c, NonVisualComponentContainerName) != null; - } - } - - IField GetField(IClass c, string name) - { - foreach (IField field in c.Fields) { - if (field.Name == name) { - return field; - } - } - return null; - } } } diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs index e96d114ea6..02b7257a93 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs @@ -6,47 +6,19 @@ // using System; -using System.Text; -using System.Text.RegularExpressions; using System.IO; -using System.Collections; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Design; -using System.Reflection; -using System.Windows.Forms; -using System.Drawing.Printing; -using System.ComponentModel; -using System.ComponentModel.Design; -using System.ComponentModel.Design.Serialization; -using System.Xml; +using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Gui; -using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.SharpDevelop.Internal.Undo; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; - -using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Dom; -using ICSharpCode.FormDesigner.Services; -using ICSharpCode.TextEditor; -using ICSharpCode.TextEditor.Document; - using ICSharpCode.NRefactory.Parser; -using ICSharpCode.NRefactory.Parser.AST; -using ICSharpCode.NRefactory.PrettyPrinter; - -using System.CodeDom; -using System.CodeDom.Compiler; - -using Microsoft.CSharp; -using Microsoft.VisualBasic; namespace ICSharpCode.FormDesigner { public class FormDesignerSecondaryDisplayBinding : ISecondaryDisplayBinding { - IMethod GetInitializeComponents(IClass c) + public static IMethod GetInitializeComponents(IClass c) { foreach (IMethod method in c.Methods) { if ((method.Name == "InitializeComponents" || method.Name == "InitializeComponent") && method.Parameters.Count == 0) { @@ -69,6 +41,23 @@ namespace ICSharpCode.FormDesigner return c.IsTypeInInheritanceTree(pc.GetClass("System.Windows.Forms.Form")) || c.IsTypeInInheritanceTree(pc.GetClass("System.Windows.Forms.UserControl")); } + public static bool IsDesignable(ParseInformation info) + { + if (info != null) { + ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit; + foreach (IClass c in cu.Classes) { + if (BaseClassIsFormOrControl(c)) { + IMethod method = GetInitializeComponents(c); + if (method == null) { + return false; + } + return true; + } + } + } + return false; + } + public bool CanAttachTo(IViewContent viewContent) { if (viewContent is ITextEditorControlProvider) { @@ -78,40 +67,14 @@ namespace ICSharpCode.FormDesigner if (fileName == null) return false; - fileExtension = Path.GetExtension(fileName).ToLower(); + fileExtension = Path.GetExtension(fileName).ToLowerInvariant(); switch (fileExtension) { case ".cs": - ParseInformation info = ParserService.ParseFile(fileName, textAreaControlProvider.TextEditorControl.Document.TextContent, false, true); - if (info != null) { - ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit; - foreach (IClass c in cu.Classes) { - if (BaseClassIsFormOrControl(c)) { - IMethod method = GetInitializeComponents(c); - if (method == null) { - continue; - } - Console.WriteLine("TRUE "+ info); - - return true; - } - } - } - break; case ".vb": - info = ParserService.ParseFile(fileName, textAreaControlProvider.TextEditorControl.Document.TextContent, false, true); - if (info != null) { - ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit; - foreach (IClass c in cu.Classes) { - if (BaseClassIsFormOrControl(c)) { - IMethod method = GetInitializeComponents(c); - if (method == null) { - continue; - } - return true; - } - } - } + ParseInformation info = ParserService.ParseFile(fileName, textAreaControlProvider.TextEditorControl.Document.TextContent, false, true); + if (IsDesignable(info)) + return true; break; case ".xfrm": return true; @@ -125,11 +88,8 @@ namespace ICSharpCode.FormDesigner string fileExtension = String.Empty; string fileName = viewContent.IsUntitled ? viewContent.UntitledName : viewContent.FileName; - fileExtension = Path.GetExtension(fileName).ToLower(); + fileExtension = Path.GetExtension(fileName).ToLowerInvariant(); - if (!FormKeyHandler.inserted) { - FormKeyHandler.Insert(); - } IDesignerLoaderProvider loader; IDesignerGenerator generator; diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs index 51f7e3f645..0352eb8ea9 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs @@ -99,6 +99,10 @@ namespace ICSharpCode.FormDesigner } public FormDesignerViewContent(IViewContent viewContent, IDesignerLoaderProvider loader, IDesignerGenerator generator) { + if (!FormKeyHandler.inserted) { + FormKeyHandler.Insert(); + } + this.loader = loader; this.generator = generator; p.BackColor = Color.White; diff --git a/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMVerboseOutputGenerator.cs b/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMVerboseOutputGenerator.cs index d00911085a..64d99ed339 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMVerboseOutputGenerator.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMVerboseOutputGenerator.cs @@ -269,6 +269,9 @@ namespace ICSharpCode.NRefactory.Parser protected override void GenerateConstructor(CodeConstructor e, CodeTypeDeclaration c) { Output.WriteLine("[CodeConstructor : {0}]", e.ToString()); + ++Indent; + GenerateStatements(e.Statements); + --Indent; } protected override void GenerateTypeConstructor(CodeTypeConstructor e) @@ -338,7 +341,7 @@ namespace ICSharpCode.NRefactory.Parser protected override string QuoteSnippetString(string value) { - return value; + return "\"" + value + "\""; } #endregion