CsCodeHelper.DesignExt.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Reflection;
  6. using System.Drawing;
  7. using System.Windows.Forms;
  8. #if NETSTANDARD || NETCOREAPP
  9. using FastReport.Code.CodeDom.Compiler;
  10. #else
  11. using System.CodeDom.Compiler;
  12. #endif
  13. using Microsoft.CSharp;
  14. using FastReport.Editor.Syntax;
  15. using FastReport.Editor.Syntax.Parsers;
  16. using FastReport.Utils;
  17. using FastReport.Data;
  18. using FastReport.Design.PageDesigners.Code;
  19. namespace FastReport.Code
  20. {
  21. partial class CsCodeHelper
  22. {
  23. #region Protected Methods
  24. protected override NetSyntaxParser CreateSyntaxParser()
  25. {
  26. NetSyntaxParser parser = new CsParser();
  27. parser.Options = SyntaxOptions.Outline | SyntaxOptions.CodeCompletion |
  28. SyntaxOptions.SyntaxErrors | SyntaxOptions.QuickInfoTips | SyntaxOptions.SmartIndent;
  29. parser.CodeCompletionChars = SyntaxConsts.ExtendedNetCodeCompletionChars.ToCharArray();
  30. return parser;
  31. }
  32. protected override void CompareEvent(string eventParams, string codeLine, List<string> eventNames)
  33. {
  34. // split code line to words
  35. // for example: "private void NewClick(object sender, System.EventArgs e)"
  36. string[] codeWords = codeLine.Split(new string[] { " ", ",", "(", ")",
  37. "private", "public", "protected", "virtual", "override", "void" }, StringSplitOptions.RemoveEmptyEntries);
  38. int i = 0;
  39. if (i < codeWords.Length)
  40. {
  41. // now we get: "NewClick object sender System.EventArgs e"
  42. string eventName = codeWords[i];
  43. string pars = "";
  44. i++;
  45. // first argument
  46. if (i < codeWords.Length)
  47. pars = codeWords[i] + ",";
  48. i += 2;
  49. if (i < codeWords.Length)
  50. {
  51. string secondArg = codeWords[i];
  52. if (secondArg.IndexOf('.') != -1)
  53. {
  54. // if second argument is, for example, "System.EventArgs", take only "EventArgs" part
  55. string[] splitSecondArg = secondArg.Split('.');
  56. secondArg = splitSecondArg[splitSecondArg.Length - 1];
  57. }
  58. pars += secondArg + ",";
  59. }
  60. if (String.Compare(eventParams, pars, true) == 0)
  61. eventNames.Add(eventName);
  62. }
  63. }
  64. #endregion
  65. #region Public Methods
  66. public override void LocateHandler(string eventName)
  67. {
  68. List<ISyntaxNode> methods = new List<ISyntaxNode>();
  69. EnumSyntaxNodes(methods, Parser.SyntaxTree.Root, NetNodeType.Method);
  70. foreach (ISyntaxNode method in methods)
  71. {
  72. if (method.Name == eventName)
  73. {
  74. Editor.Focus();
  75. Editor.Position = method.Position;
  76. Editor.Position = new Point(method.Position.X + 2, method.Position.Y + 2);
  77. break;
  78. }
  79. }
  80. }
  81. public override bool AddHandler(Type eventType, string eventName)
  82. {
  83. // get delegate params
  84. MethodInfo invoke = eventType.GetMethod("Invoke");
  85. System.Reflection.ParameterInfo[] pars = invoke.GetParameters();
  86. string eventParams = "";
  87. if (pars.Length == 2)
  88. eventParams = "(object sender, " + pars[1].ParameterType.Name + " e)";
  89. else
  90. {
  91. FRMessageBox.Error(String.Format(Res.Get("Messages,DelegateError"), eventType.ToString()));
  92. return false;
  93. }
  94. // update the syntax tree
  95. (Report.Designer.ActiveReportTab.Plugins.Find("Code") as CodePageDesigner).UpdateLanguage();
  96. List<ISyntaxNode> classes = new List<ISyntaxNode>();
  97. EnumSyntaxNodes(classes, Parser.SyntaxTree.Root, NetNodeType.Class);
  98. foreach (ISyntaxNode node in classes)
  99. {
  100. if (node.Name == "ReportScript")
  101. {
  102. Point startPos = node.Position;
  103. Point endPos = new Point(0, startPos.Y + node.Size.Height);
  104. Editor.Lines.Insert(endPos.Y, "");
  105. Editor.Lines.Insert(endPos.Y + 1, Indent(2) + "private void " + eventName + eventParams);
  106. Editor.Lines.Insert(endPos.Y + 2, Indent(2) + "{");
  107. Editor.Lines.Insert(endPos.Y + 3, Indent(3));
  108. Editor.Lines.Insert(endPos.Y + 4, Indent(2) + "}");
  109. Editor.Focus();
  110. Editor.Position = new Point(3 * CodePageSettings.TabSize, endPos.Y + 3);
  111. return true;
  112. }
  113. }
  114. FRMessageBox.Error(Res.Get("Messages,EventError"));
  115. return false;
  116. }
  117. #endregion
  118. }
  119. }