VbCodeHelper.DesignExt.cs 4.9 KB

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