Browse Source

Added form designer to BooBinding (BOO-513).

Fixed BOO-511 (#develop should not display boo's "generated" module classes).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@582 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
fd562a9339
  1. 8
      src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin
  2. 15
      src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj
  3. 3
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs
  4. 4
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs
  5. 59
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs
  6. 141
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs
  7. 410
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs
  8. 61
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/FormDesignerBinding.cs
  9. 1
      src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj
  10. 249
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/AbstractDesignerGenerator.cs
  11. 257
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs
  12. 90
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs
  13. 33
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs
  14. 254
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs
  15. 88
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs
  16. 4
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs
  17. 5
      src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMVerboseOutputGenerator.cs

8
src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
version = "1.0.0">
<Runtime>
<Import assembly = "../../DisplayBindings/FormDesigner/FormDesigner.dll"/>
<Import assembly = "BooBinding.dll"/>
<Import assembly = ":ICSharpCode.SharpDevelop"/>
</Runtime>
@ -44,6 +45,13 @@ @@ -44,6 +45,13 @@
resource = "Grunwald.BooBinding.Resources.Boo.xshd" />
</Path>
<Path name = "/SharpDevelop/Workbench/DisplayBindings">
<DisplayBinding id = "BooFormDesigner"
type = "Secondary"
supportedformats = "Forms/UserControls"
class = "Grunwald.BooBinding.Designer.FormDesignerDisplayBinding" />
</Path>
<Path path = "/SharpDevelop/BackendBindings/ProjectOptions/Boo">
<DialogPanel id = "Application"
label = "Application"

15
src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj

@ -36,6 +36,7 @@ @@ -36,6 +36,7 @@
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Design" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="Boo.Lang.Compiler">
@ -50,6 +51,10 @@ @@ -50,6 +51,10 @@
<HintPath>..\..\RequiredLibraries\Boo.Lang.Parser.dll</HintPath>
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="Boo.Lang.CodeDom">
<HintPath>..\..\RequiredLibraries\Boo.Lang.CodeDom.dll</HintPath>
<SpecificVersion>False</SpecificVersion>
</Reference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Boo.xshd">
@ -69,6 +74,10 @@ @@ -69,6 +74,10 @@
<Compile Include="Src\CodeCompletion\VariableLookupVisitor.cs" />
<Compile Include="Src\CodeCompletion\InferredReturnType.cs" />
<Compile Include="Src\ConvertBuffer.cs" />
<Compile Include="Src\Designer\BooDesignerGenerator.cs" />
<Compile Include="Src\Designer\BooDesignerLoader.cs" />
<Compile Include="Src\Designer\FormDesignerBinding.cs" />
<Compile Include="Src\Designer\CodeDomVisitor.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="BooBinding.addin">
@ -110,6 +119,12 @@ @@ -110,6 +119,12 @@
<Private>True</Private>
</ProjectReference>
<Content Include="PostBuildEvent.bat" />
<ProjectReference Include="..\..\..\..\DisplayBindings\FormDesigner\Project\FormDesigner.csproj">
<Project>{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}</Project>
<Name>FormDesigner</Name>
<Private>False</Private>
</ProjectReference>
<Folder Include="Src\Designer" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

3
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs

@ -112,8 +112,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -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);
}

4
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs

@ -295,7 +295,9 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -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);
}

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

@ -0,0 +1,59 @@ @@ -0,0 +1,59 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
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;
}
}
}

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

@ -0,0 +1,141 @@ @@ -0,0 +1,141 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
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);
}
}
}

410
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs

@ -0,0 +1,410 @@ @@ -0,0 +1,410 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
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
{
/// <summary>
/// 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.
/// </summary>
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;
}
}
}
/// <summary>Converts a list of expressions to CodeDom expressions.</summary>
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();
}
}
}

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

@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
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);
}
}
}

1
src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj

@ -105,6 +105,7 @@ @@ -105,6 +105,7 @@
<Compile Include="Src\FormDesigner\DesignerGenerator\VBNetDesignerGenerator.cs" />
<Compile Include="Src\FormDesigner\DesignerLoader\DesignerLoaderProvider.cs" />
<Compile Include="Src\FormDesigner\DesignerLoader\FormDesignerLoadException.cs" />
<Compile Include="Src\FormDesigner\DesignerGenerator\AbstractDesignerGenerator.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj">

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

@ -0,0 +1,249 @@ @@ -0,0 +1,249 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
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);
/// <summary>
/// Contains the tabs in front of the InitializeComponents declaration.
/// Used to indent the fields and generated statements.
/// </summary>
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);
/// <summary>
/// If found return true and int as position
/// </summary>
/// <param name="component"></param>
/// <param name="edesc"></param>
/// <returns></returns>
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;
}
}
}

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

@ -1,162 +1,36 @@ @@ -1,162 +1,36 @@
// <file>
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
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 @@ -189,110 +63,5 @@ namespace ICSharpCode.FormDesigner
}
return param;
}
/// <summary>
/// If found return true and int as position
/// </summary>
/// <param name="component"></param>
/// <param name="edesc"></param>
/// <returns></returns>
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;
}
}
}

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

@ -40,11 +40,13 @@ namespace ICSharpCode.FormDesigner @@ -40,11 +40,13 @@ namespace ICSharpCode.FormDesigner
CodeDOMGeneratorUtility codeDOMGeneratorUtility = new CodeDOMGeneratorUtility();
List<string> addedVariables = new List<string>();
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 @@ -57,9 +59,68 @@ namespace ICSharpCode.FormDesigner
addedVariables.Clear();
List<CodeStatement> statements = new List<CodeStatement>();
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 @@ -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<CodeStatement> outputStatements, DesignerSerializationManager serializationManager)
{
LoggingService.Debug("Generate code for: " + component.Site.Name);
Type componentType = component.GetType();
@ -88,8 +158,6 @@ namespace ICSharpCode.FormDesigner @@ -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 @@ -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);
}
}

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

@ -6,42 +6,11 @@ @@ -6,42 +6,11 @@
// </file>
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
{

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

@ -1,161 +1,36 @@ @@ -1,161 +1,36 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
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 @@ -187,110 +62,5 @@ namespace ICSharpCode.FormDesigner
}
return param;
}
/// <summary>
/// If found return true and int as position
/// </summary>
/// <param name="component"></param>
/// <param name="edesc"></param>
/// <returns></returns>
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;
}
}
}

88
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs

@ -6,47 +6,19 @@ @@ -6,47 +6,19 @@
// </file>
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 @@ -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 @@ -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 @@ -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;

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

@ -99,6 +99,10 @@ namespace ICSharpCode.FormDesigner @@ -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;

5
src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMVerboseOutputGenerator.cs

@ -269,6 +269,9 @@ namespace ICSharpCode.NRefactory.Parser @@ -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 @@ -338,7 +341,7 @@ namespace ICSharpCode.NRefactory.Parser
protected override string QuoteSnippetString(string value)
{
return value;
return "\"" + value + "\"";
}
#endregion

Loading…
Cancel
Save