FRXPageDesigner.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Drawing;
  4. using System.ComponentModel;
  5. using FastReport.Editor;
  6. using FastReport.Editor.Common;
  7. using FastReport.Editor.Syntax;
  8. using FastReport.Utils;
  9. using FastReport.Forms;
  10. using FastReport.Design.ToolWindows;
  11. using FastReport.Data;
  12. using FastReport.Code;
  13. using System.Reflection;
  14. using FastReport.Design.PageDesigners.Page;
  15. namespace FastReport.Design.PageDesigners.Code
  16. {
  17. #if !DEBUG
  18. [DesignTimeVisible(false)]
  19. #endif
  20. internal class FRXPageDesigner : PageDesignerBase
  21. {
  22. #region Fields
  23. private SyntaxEdit edit;
  24. private TextSource source;
  25. private bool editInitialized;
  26. private Point positionInText;
  27. private bool canModify;
  28. private int defaultHintDelay;
  29. private int defaultCompletionDelay;
  30. Font defaultFont;
  31. #endregion
  32. #region Properties
  33. public SyntaxEdit Edit
  34. {
  35. get
  36. {
  37. if (!editInitialized)
  38. CreateEdit();
  39. return edit;
  40. }
  41. }
  42. public TextSource Source
  43. {
  44. get
  45. {
  46. if (!editInitialized)
  47. CreateEdit();
  48. return source;
  49. }
  50. }
  51. #endregion
  52. #region Private Methods
  53. private void CreateEdit()
  54. {
  55. defaultHintDelay = SyntaxConsts.DefaultHintDelay;
  56. defaultCompletionDelay = SyntaxConsts.DefaultCompletionDelay;
  57. editInitialized = true;
  58. source = new TextSource();
  59. edit = new SyntaxEdit();
  60. defaultFont = edit.Font;
  61. edit.Dock = DockStyle.Fill;
  62. edit.BorderStyle = EditBorderStyle.None;
  63. edit.Source = source;
  64. edit.AllowDrop = true;
  65. edit.TextChanged += Edit_TextChanged;
  66. Controls.Add(edit);
  67. // do this after controls.add!
  68. edit.IndentOptions = IndentOptions.AutoIndent | IndentOptions.SmartIndent;
  69. edit.NavigateOptions = NavigateOptions.BeyondEol;
  70. edit.Braces.BracesOptions = BracesOptions.Highlight | BracesOptions.HighlightBounds;
  71. edit.Braces.BackColor = Color.LightGray;
  72. edit.Braces.Style = FontStyle.Regular;
  73. edit.Scroll.ScrollBars = RichTextBoxScrollBars.Both;
  74. edit.Scroll.Options = ScrollingOptions.AllowSplitHorz | ScrollingOptions.AllowSplitVert | ScrollingOptions.SmoothScroll;
  75. edit.Outlining.AllowOutlining = true;
  76. edit.DisplayLines.UseSpaces = true;
  77. edit.SplitHorz += new EventHandler(Edit_SplitHorz);
  78. edit.SplitVert += new EventHandler(Edit_SplitVert);
  79. edit.ImeMode = ImeMode.On;
  80. UpdateOptions();
  81. UpdateEditColors();
  82. LocalizeEditMenu();
  83. canModify = false;
  84. SetScriptText();
  85. canModify = true;
  86. }
  87. private void Edit_TextChanged(object sender, EventArgs e)
  88. {
  89. if(canModify)
  90. Designer.SetModified(null, "FRXChange");
  91. }
  92. private void UpdateEditColors()
  93. {
  94. edit.Gutter.BrushColor = UIStyleUtils.GetControlColor(Designer.UIStyle);
  95. edit.Gutter.PenColor = edit.Gutter.BrushColor;
  96. }
  97. private void Edit_SplitHorz(object sender, EventArgs e)
  98. {
  99. Edit.HorzSplitEdit.BorderStyle = Edit.BorderStyle;
  100. }
  101. private void Edit_SplitVert(object sender, EventArgs e)
  102. {
  103. Edit.VertSplitEdit.BorderStyle = Edit.BorderStyle;
  104. }
  105. private void LocalizeEditMenu()
  106. {
  107. MyRes res = new MyRes("Designer,Menu,Edit");
  108. StringConsts.MenuUndoCaption = res.Get("Undo");
  109. StringConsts.MenuRedoCaption = res.Get("Redo");
  110. StringConsts.MenuCutCaption = res.Get("Cut");
  111. StringConsts.MenuCopyCaption = res.Get("Copy");
  112. StringConsts.MenuPasteCaption = res.Get("Paste");
  113. StringConsts.MenuDeleteCaption = res.Get("Delete");
  114. StringConsts.MenuSelectAllCaption = res.Get("SelectAll");
  115. }
  116. private void SetScriptText()
  117. {
  118. Edit.Source.Text = Designer.Report.SaveToString();
  119. }
  120. #endregion
  121. #region Public Methods
  122. public void UpdateOptions()
  123. {
  124. Edit.DisplayLines.UseSpaces = FRXPageSettings.UseSpaces;
  125. Edit.DisplayLines.TabStops = new int[] { FRXPageSettings.TabSize };
  126. }
  127. public void UpdateFont()
  128. {
  129. Font font;
  130. bool needDisposeFont = false;
  131. if (Config.Root.FindItem("Designer").FindItem("Fonts").Find("CodePageDesigner") != -1)
  132. {
  133. XmlItem editorFont = Config.Root.FindItem("Designer").FindItem("Fonts").FindItem("CodePageDesigner").FindItem("CodePage");
  134. font = new Font(editorFont.GetProp("font-name"), int.Parse(editorFont.GetProp("font-size")), (editorFont.GetProp("font-italic") == "1" ? FontStyle.Italic : FontStyle.Regular) | (editorFont.GetProp("font-bold") == "1" ? FontStyle.Bold : FontStyle.Regular));
  135. needDisposeFont = true;
  136. }
  137. else
  138. {
  139. font = defaultFont;
  140. }
  141. Edit.Font = this.LogicalToDevice(font, needDisposeFont);
  142. }
  143. public void Copy()
  144. {
  145. Edit.Selection.Copy();
  146. }
  147. public void Cut()
  148. {
  149. Edit.Selection.Cut();
  150. }
  151. public void Paste()
  152. {
  153. Edit.Selection.Paste();
  154. }
  155. public bool CanUndo()
  156. {
  157. return Source.CanUndo();
  158. }
  159. public bool CanRedo()
  160. {
  161. return Source.CanRedo();
  162. }
  163. public override void FillObjects(bool resetSelection)
  164. {
  165. // do nothing
  166. }
  167. public override void PageActivated()
  168. {
  169. base.PageActivated();
  170. canModify = false;
  171. SetScriptText();
  172. canModify = true;
  173. UpdateOptions();
  174. UpdateLanguage();
  175. Edit.Position = new Point(0, 0);
  176. Edit.Position = positionInText;
  177. }
  178. public override void PageDeactivated()
  179. {
  180. base.PageDeactivated();
  181. if (editInitialized)
  182. {
  183. CommitChanges();
  184. positionInText = Edit.Position;
  185. }
  186. }
  187. public override void SaveState()
  188. {
  189. FRXPageSettings.SaveState();
  190. }
  191. public override void RestoreState()
  192. {
  193. }
  194. public override DesignerOptionsPage GetOptionsPage()
  195. {
  196. return new FRXPageOptions(this);
  197. }
  198. #endregion
  199. #region IDesignerPlugin
  200. public override void UpdateUIStyle()
  201. {
  202. base.UpdateUIStyle();
  203. if (editInitialized)
  204. UpdateEditColors();
  205. }
  206. public override void Localize()
  207. {
  208. base.Localize();
  209. if (editInitialized)
  210. LocalizeEditMenu();
  211. }
  212. public override void UpdateDpiDependencies()
  213. {
  214. base.UpdateDpiDependencies();
  215. if (editInitialized)
  216. UpdateFont();
  217. }
  218. public void UpdateLanguage()
  219. {
  220. SyntaxParser parser = new XmlParser();
  221. parser.Options |= SyntaxOptions.SyntaxErrors;
  222. Edit.Lexer = parser;
  223. Source.Lexer = parser;
  224. Source.FormatText();
  225. Edit.Refresh();
  226. }
  227. public void CommitChanges()
  228. {
  229. if (Edit.Modified)
  230. {
  231. Edit.Modified = false;
  232. Designer.Report.LoadFromString(Edit.Source.Text);
  233. (Designer.ActiveReportTab.Plugins.Find("Code") as CodePageDesigner).Script = Designer.Report.ScriptText;
  234. Designer.SetModified(null, "FRXChange");
  235. }
  236. }
  237. #endregion
  238. public FRXPageDesigner(Designer designer) : base(designer)
  239. {
  240. Name = "FRXPage";
  241. RightToLeft = Config.RightToLeft ? RightToLeft.Yes : RightToLeft.No;
  242. }
  243. }
  244. }