📄 codedomgenerator.cs
字号:
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Kr黦er" email="mike@icsharpcode.net"/>
// <version value="$version"/>
// </file>
using System;
using System.IO;
using System.Xml;
using System.Collections;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Text;
using System.Text.RegularExpressions;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using Microsoft.VisualBasic;
using ICSharpCode.SharpDevelop.Services;
using ICSharpCode.SharpDevelop.FormDesigner.Services;
namespace ICSharpCode.SharpDevelop.FormDesigner
{
/// <summary>
/// This class is able to generate a CodeDOM definition out of a XML file.
/// </summary>
public class CodeDOMGenerator
{
IDesignerHost host;
AmbienceService ambienceService = (AmbienceService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(AmbienceService));
ICodeGenerator codeGenerator;
CodeTypeDeclaration codeTypeDeclaration;
CodeNamespace codeNamespace;
CodeDOMGeneratorUtility codeDOMGeneratorUtility = new CodeDOMGeneratorUtility();
public CodeDOMGenerator(IDesignerHost host, CodeDomProvider codeProvider)
{
this.host = host;
codeGenerator = codeProvider.CreateGenerator();
codeNamespace = new CodeNamespace("GeneratedForm");
this.codeDOMGeneratorUtility.AddNamespaceImport("System");
this.codeDOMGeneratorUtility.AddNamespaceImport("System.Windows.Forms");
codeNamespace.Comments.Add(new CodeCommentStatement("This file was autogenerated by a tool.", false));
}
public void ConvertContentDefinition(string fileName)
{
StreamWriter sw = File.CreateText(fileName);
ConvertContentDefinition(sw);
sw.Close();
}
public void ConvertContentDefinition(TextWriter writer)
{
try {
// create class
CodeDomDesignerSerializetionManager serializationManager = (CodeDomDesignerSerializetionManager)host.GetService(typeof(IDesignerSerializationManager));
serializationManager.Initialize();
DesignerResourceService designerResourceService = (DesignerResourceService)serializationManager.GetService(typeof(System.ComponentModel.Design.IResourceService));
designerResourceService.SerializationStarted(true);
foreach (IComponent c in host.Container.Components) {
serializationManager.SetName(c, c.Site.Name);
}
CodeDomSerializer rootSerializer = serializationManager.GetRootSerializer(host.RootComponent.GetType());
if (rootSerializer == null) {
throw new Exception("No root serializer found");
}
//Serialize host to CodeDom
codeTypeDeclaration = (CodeTypeDeclaration)rootSerializer.Serialize(serializationManager, host.RootComponent);
// triger serializationManager.SerializationCompleted
serializationManager.OnSerializationComplete();
designerResourceService.SerializationEnded(true);
// create constructor
CodeConstructor cc = new CodeConstructor();
cc.Attributes = MemberAttributes.Public | MemberAttributes.Final;
if (ambienceService.GenerateAdditionalComments) {
cc.Statements.Add(new CodeCommentStatement(" Must be called for initialization", false));
}
cc.Statements.Add(new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "InitializeComponent")));
if (ambienceService.GenerateAdditionalComments) {
cc.Statements.Add(new CodeCommentStatement("", false));
cc.Statements.Add(new CodeCommentStatement(" TODO : Add constructor code after InitializeComponents", false));
cc.Statements.Add(new CodeCommentStatement("", false));
}
foreach (object o in codeTypeDeclaration.Members) {
if (o is CodeMemberMethod) {
CodeMemberMethod method = (CodeMemberMethod)o;
// foreach (object st in method.Statements) {
// if (st is CodeAssignStatement) {
// CodeAssignStatement cas = (CodeAssignStatement)st;
// CodeExpression ce = cas.Right;
// Console.WriteLine("right : " + ce);
// while (ce is CodeFieldReferenceExpression) {
// CodeFieldReferenceExpression fre = (CodeFieldReferenceExpression)ce;
// Console.WriteLine("FieldName : " + fre.FieldName);
// ce = fre.TargetObject;
// Console.WriteLine("Target: " + ce);
// if (ce is CodeTypeReferenceExpression) {
// Console.WriteLine("Type: " + ((CodeTypeReferenceExpression)ce).Type.BaseType );
// }
// }
// if (ce is CodePropertyReferenceExpression) {
// CodePropertyReferenceExpression cpre = (CodePropertyReferenceExpression)ce;
// Console.WriteLine("Propertyname:");
// Console.WriteLine(cpre.PropertyName);
// Console.WriteLine("target object:");
// Console.WriteLine(cpre.TargetObject);
// }
// }
// Console.WriteLine(st);
// }
// int i = 0;
// for (; i < method.Statements.Count; ++i) {
// if (method.Statements[i] is System.CodeDom.CodeCommentStatement) {
// break;
// }
// }
//
// foreach (IComponent component in host.Container.Components) {
// if (component != host.RootComponent && component is Control && ((Control)component).Controls != null && ((Control)component).Controls.Count > 0) {
// CodeFieldReferenceExpression fieldRef = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), component.Site.Name);
// method.Statements.Insert(i, new CodeExpressionStatement(new CodeMethodInvokeExpression(fieldRef, "SuspendLayout")));
// method.Statements.Add(new CodeMethodInvokeExpression(fieldRef, "ResumeLayout", new CodePrimitiveExpression(false)));
// }
// }
//
// if (host.RootComponent is Control) {
//
// method.Statements.Insert(i, new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "SuspendLayout")));
// method.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "ResumeLayout", new CodePrimitiveExpression(false)));
// }
break;
}
}
codeTypeDeclaration.Members.Add(cc);
// finally generate code
codeNamespace.Types.Add(codeTypeDeclaration);
codeNamespace.Imports.Add(new CodeNamespaceImport("System"));
codeNamespace.Imports.Add(new CodeNamespaceImport("System.Drawing"));
codeNamespace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));
codeGenerator.GenerateCodeFromNamespace(codeNamespace, writer, codeDOMGeneratorUtility.CreateCodeGeneratorOptions);
// {
// // Output code
// TextWriter writer2 = new StringWriter();
// codeGenerator.GenerateCodeFromNamespace(codeNamespace, writer2, null);
// Console.WriteLine(writer2.ToString());
// }
} catch (Exception e) {
Console.WriteLine("Exception : " + e.ToString());
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -