📄 abstractdesignergenerator.cs
字号:
}
/// <summary>
/// Compares the SharpDevelop.Dom field declaration oldField to
/// the CodeDom field declaration newField.
/// </summary>
/// <returns>true, if the fields are different in type or modifiers, otherwise false.</returns>
bool FieldChanged(IField oldField, CodeMemberField newField)
{
// compare types
if (oldField.ReturnType.FullyQualifiedName != newField.Type.BaseType) {
LoggingService.Debug("FieldChanged: "+oldField.Name+", "+oldField.ReturnType.FullyQualifiedName+" -> "+newField.Type.BaseType);
return true;
}
// compare modifiers
ModifierEnum oldModifiers = oldField.Modifiers & ModifierEnum.VisibilityMask;
MemberAttributes newModifiers = newField.Attributes & MemberAttributes.AccessMask;
// SharpDevelop.Dom always adds Private modifier, even if not specified
// CodeDom omits Private modifier if not present (although it is the default)
if (oldModifiers == ModifierEnum.Private) {
if (newModifiers != 0 && newModifiers != MemberAttributes.Private) {
return true;
}
}
ModifierEnum[] sdModifiers = new ModifierEnum[] {ModifierEnum.Protected, ModifierEnum.ProtectedAndInternal, ModifierEnum.Internal, ModifierEnum.Public};
MemberAttributes[] cdModifiers = new MemberAttributes[] {MemberAttributes.Family, MemberAttributes.FamilyOrAssembly, MemberAttributes.Assembly, MemberAttributes.Public};
for (int i = 0; i < sdModifiers.Length; i++) {
if ((oldModifiers == sdModifiers[i]) ^ (newModifiers == cdModifiers[i])) {
return true;
}
}
return false;
}
IDocument document;
string saveDocumentToFile; // only set when InitializeComponent was loaded from code-behind file that was not opened
string designerFile; // file that contains InitializeComponents
void SaveDocument()
{
if (saveDocumentToFile != null) {
NamedFileOperationDelegate method = delegate(string fileName) {
using (StreamWriter writer = new StreamWriter(fileName, false, System.Text.Encoding.UTF8)) {
writer.Write(document.TextContent);
}
};
FileUtility.ObservedSave(method, saveDocumentToFile, FileErrorPolicy.Inform);
}
}
protected void Reparse()
{
saveDocumentToFile = null;
// get new initialize components
string content = viewContent.Document.TextContent;
ParseInformation info = ParserService.ParseFile(viewContent.TextEditorControl.FileName, content, false, true);
ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit;
foreach (IClass c in cu.Classes) {
if (FormsDesignerSecondaryDisplayBinding.BaseClassIsFormOrControl(c)) {
initializeComponents = FormsDesignerSecondaryDisplayBinding.GetInitializeComponents(c);
if (initializeComponents != null) {
designerFile = initializeComponents.DeclaringType.CompilationUnit.FileName;
string designerContent;
if (FileUtility.IsEqualFileName(viewContent.TextEditorControl.FileName, designerFile)) {
designerContent = content;
document = viewContent.Document;
} else {
IWorkbenchWindow window = FileService.GetOpenFile(designerFile);
if (window == null) {
document = new DocumentFactory().CreateDocument();
designerContent = ParserService.GetParseableFileContent(designerFile);
document.TextContent = designerContent;
saveDocumentToFile = designerFile;
} else {
ITextEditorControlProvider tecp = window.ViewContent as ITextEditorControlProvider;
if (tecp == null)
throw new ApplicationException("designer file viewcontent must implement ITextEditorControlProvider");
document = tecp.TextEditorControl.Document;
designerContent = document.TextContent;
}
ParserService.ParseFile(designerFile, designerContent, false, true);
initializeComponents = FormsDesignerSecondaryDisplayBinding.GetInitializeComponents(c);
}
using (StringReader r = new StringReader(designerContent)) {
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;
this.completeClass = c.GetCompoundClass();
this.formClass = initializeComponents.DeclaringType;
break;
}
}
}
}
protected abstract string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body, string indentation);
protected virtual int GetCursorLine(IDocument document, IMethod method)
{
return method.BodyRegion.BeginLine + 1;
}
protected virtual int GetCursorLineAfterEventHandlerCreation()
{
return 2;
}
/// <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 string file, out int position)
{
if (this.failedDesignerInitialize) {
position = 0;
file = c.CompilationUnit.FileName;
return false;
}
Reparse();
foreach (IMethod method in completeClass.Methods) {
if (method.Name == eventMethodName) {
position = GetCursorLine(document, method);
file = method.DeclaringType.CompilationUnit.FileName;
return true;
}
}
viewContent.MergeFormChanges();
Reparse();
file = c.CompilationUnit.FileName;
int line = GetEventHandlerInsertionLine(c);
int offset = viewContent.Document.GetLineSegment(line - 1).Offset;
viewContent.Document.Insert(offset, CreateEventHandler(edesc, eventMethodName, body, tabs));
position = line + GetCursorLineAfterEventHandlerCreation();
return false;
}
protected virtual int GetEventHandlerInsertionLine(IClass c)
{
return c.Region.EndLine;
}
public ICollection GetCompatibleMethods(EventDescriptor edesc)
{
Reparse();
ArrayList compatibleMethods = new ArrayList();
MethodInfo methodInfo = edesc.EventType.GetMethod("Invoke");
foreach (IMethod method in completeClass.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();
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 completeClass.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;
}
IField GetField(IClass c, string name)
{
foreach (IField field in c.Fields) {
if (field.Name == name) {
return field;
}
}
return null;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -