CodeHelper.DesignExt.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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 FastReport.Editor;
  8. using FastReport.Editor.Syntax;
  9. using FastReport.Editor.Syntax.Parsers;
  10. #if NETSTANDARD || NETCOREAPP
  11. using FastReport.Code.CodeDom.Compiler;
  12. #else
  13. using System.CodeDom.Compiler;
  14. #endif
  15. using System.Windows.Forms;
  16. using FastReport.Data;
  17. using FastReport.Engine;
  18. using System.IO;
  19. using FastReport.Utils;
  20. using FastReport.Design.PageDesigners.Code;
  21. namespace FastReport.Code
  22. {
  23. partial class CodeHelperBase
  24. {
  25. #region Fields
  26. private NetSyntaxParser parser;
  27. #endregion
  28. #region Properties
  29. public NetSyntaxParser Parser
  30. {
  31. get
  32. {
  33. if (parser == null)
  34. parser = CreateSyntaxParser();
  35. return parser;
  36. }
  37. set { parser = value; }
  38. }
  39. public SyntaxEdit Editor
  40. {
  41. get { return Report.Designer.Editor.Edit; }
  42. }
  43. #endregion
  44. #region Protected Methods
  45. protected virtual NetSyntaxParser CreateSyntaxParser()
  46. {
  47. return null;
  48. }
  49. protected void EnumSyntaxNodes(List<ISyntaxNode> list, ISyntaxNode node, NetNodeType nodeType)
  50. {
  51. if ((NetNodeType)node.NodeType == nodeType)
  52. list.Add(node);
  53. // scan only "ReportScript" class!
  54. if ((NetNodeType)node.NodeType == NetNodeType.Class)
  55. {
  56. if (String.Compare(node.Name, "ReportScript", true) != 0)
  57. return;
  58. }
  59. if (node.ChildList != null)
  60. foreach (ISyntaxNode n in node.ChildList)
  61. {
  62. EnumSyntaxNodes(list, n, nodeType);
  63. }
  64. }
  65. protected string Indent(int num)
  66. {
  67. return "".PadLeft(num * CodePageSettings.TabSize, ' ');
  68. }
  69. protected abstract void CompareEvent(string eventParams, string codeLine, List<string> eventNames);
  70. #endregion
  71. #region Public Methods
  72. public abstract bool AddHandler(Type eventType, string eventName);
  73. public abstract void LocateHandler(string eventName);
  74. public List<string> GetEvents(Type eventType)
  75. {
  76. // build a string containing the event params.
  77. // for example, event type "EventHandler" will generate the following string: "object,EventArgs,"
  78. string eventParams = "";
  79. MethodInfo invoke = eventType.GetMethod("Invoke");
  80. System.Reflection.ParameterInfo[] pars = invoke.GetParameters();
  81. foreach (System.Reflection.ParameterInfo p in pars)
  82. {
  83. eventParams += p.ParameterType.Name + ",";
  84. }
  85. // update the syntax tree
  86. (Report.Designer.ActiveReportTab.Plugins.Find("Code") as CodePageDesigner).UpdateLanguage();
  87. List<string> result = new List<string>();
  88. List<ISyntaxNode> methods = new List<ISyntaxNode>();
  89. EnumSyntaxNodes(methods, parser.SyntaxTree.Root, NetNodeType.Method);
  90. foreach (ISyntaxNode method in methods)
  91. {
  92. // get a code line, for example: " private void NewClick(object sender, System.EventArgs e)"
  93. string codeLine = Editor.Lines[method.Position.Y].Trim();
  94. // compare it with event params, and add the event name to the result list if succesful
  95. CompareEvent(eventParams, codeLine, result);
  96. }
  97. return result;
  98. }
  99. public void Locate(int line, int column)
  100. {
  101. Editor.Focus();
  102. Editor.Position = new Point(column - 1, line - 1);
  103. }
  104. public void RegisterAssemblies()
  105. {
  106. NetSyntaxParser parser = Parser as NetSyntaxParser;
  107. // register assemblies
  108. foreach (string assm in Report.ReferencedAssemblies)
  109. {
  110. try
  111. {
  112. // GAC assemblies should be registered without an extension
  113. parser.RegisterAssembly(assm.Replace(".dll", "").Replace(".exe", ""));
  114. }
  115. catch
  116. {
  117. try
  118. {
  119. // not a GAC assembly, try its full name.
  120. string fullName = assm;
  121. if (!Path.IsPathRooted(fullName))
  122. fullName = Config.ApplicationFolder + assm;
  123. parser.RegisterAssembly(fullName);
  124. }
  125. catch
  126. {
  127. }
  128. }
  129. }
  130. // register FastReport.dll
  131. parser.RegisterAssembly(this.GetType().Assembly);
  132. // register objects
  133. ObjectCollection allObjects = Report.AllObjects;
  134. foreach (Base c in allObjects)
  135. {
  136. parser.RegisterObject(c.Name, c);
  137. }
  138. parser.RegisterObject("Report", Report);
  139. parser.RegisterObject("Engine", new ReportEngine(Report));
  140. }
  141. #endregion
  142. }
  143. }