CsCodeHelper.DesignExt.Mono.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. using System.CodeDom.Compiler;
  9. using Microsoft.CSharp;
  10. using FastReport.Utils;
  11. using FastReport.Data;
  12. using FastReport.Design.PageDesigners.Code;
  13. namespace FastReport.Code
  14. {
  15. partial class CsCodeHelper
  16. {
  17. #region Public Methods
  18. public override List<string> GetEvents(Type eventType)
  19. {
  20. // build a string containing the event params.
  21. // for example, event type "EventHandler" will generate the following string: "object,EventArgs,"
  22. string eventParams = "";
  23. MethodInfo invoke = eventType.GetMethod("Invoke");
  24. System.Reflection.ParameterInfo[] evparams = invoke.GetParameters();
  25. foreach (System.Reflection.ParameterInfo p in evparams)
  26. {
  27. eventParams += p.ParameterType.Name + ",";
  28. }
  29. List<string> eventNames = new List<string>();
  30. string[] lines = Editor.Text.Split('\n');
  31. foreach (string line in lines)
  32. {
  33. string codeLine = line.Trim();
  34. if (codeLine.StartsWith("private void"))
  35. {
  36. // split code line to words
  37. // for example: "private void NewClick(object sender, System.EventArgs e)"
  38. string[] codeWords = codeLine.Split(new string[] { " ", ",", "(", ")", "private", "void" }, StringSplitOptions.RemoveEmptyEntries);
  39. int i = 0;
  40. if (i < codeWords.Length)
  41. {
  42. // now we get: "NewClick object sender System.EventArgs e"
  43. string eventName = codeWords[i];
  44. string pars = "";
  45. i++;
  46. // first argument
  47. if (i < codeWords.Length)
  48. pars = codeWords[i] + ",";
  49. i += 2;
  50. if (i < codeWords.Length)
  51. {
  52. string secondArg = codeWords[i];
  53. if (secondArg.IndexOf('.') != -1)
  54. {
  55. // if second argument is, for example, "System.EventArgs", take only "EventArgs" part
  56. string[] splitSecondArg = secondArg.Split('.');
  57. secondArg = splitSecondArg[splitSecondArg.Length - 1];
  58. }
  59. pars += secondArg + ",";
  60. }
  61. if (String.Compare(eventParams, pars, true) == 0)
  62. eventNames.Add(eventName);
  63. }
  64. }
  65. }
  66. return eventNames;
  67. }
  68. public override void LocateHandler(string eventName)
  69. {
  70. string[] lines = Editor.Text.Split('\n');
  71. int i = 0;
  72. foreach (string line in lines)
  73. {
  74. string codeLine = line.Trim();
  75. if (codeLine.StartsWith("private void " + eventName))
  76. {
  77. Editor.Focus();
  78. Editor.Select(i, 0);
  79. break;
  80. }
  81. i += line.Length + 1;
  82. }
  83. }
  84. public override bool AddHandler(Type eventType, string eventName)
  85. {
  86. // get delegate params
  87. MethodInfo invoke = eventType.GetMethod("Invoke");
  88. System.Reflection.ParameterInfo[] pars = invoke.GetParameters();
  89. string eventParams = "";
  90. if (pars.Length == 2)
  91. eventParams = "(object sender, " + pars[1].ParameterType.Name + " e)";
  92. else
  93. {
  94. FRMessageBox.Error(String.Format(Res.Get("Messages,DelegateError"), eventType.ToString()));
  95. return false;
  96. }
  97. string[] lines = Editor.Text.Split('\n');
  98. int charIndex = 0;
  99. for (int i = 0; i < lines.Length; i++)
  100. {
  101. string line = lines[i];
  102. charIndex += line.Length + 1;
  103. line = line.Trim();
  104. if (line.StartsWith("public class ReportScript"))
  105. {
  106. charIndex += lines[i + 1].Length + 1;
  107. string insert = " private void " + eventName + eventParams + "\r\n {\r\n ";
  108. Editor.Text = Editor.Text.Insert(charIndex, insert + "\r\n }\r\n\r\n");
  109. Editor.Focus();
  110. Editor.Select(charIndex + insert.Length, 0);
  111. return true;
  112. }
  113. }
  114. FRMessageBox.Error(Res.Get("Messages,EventError"));
  115. return false;
  116. }
  117. #endregion
  118. }
  119. }