TextEditorForm.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using FastReport.Utils;
  6. using FastReport.Data;
  7. using FastReport.Code;
  8. using System.Reflection;
  9. using FastReport.Controls;
  10. namespace FastReport.Forms
  11. {
  12. internal partial class TextEditorForm : BaseDialogForm
  13. {
  14. private Report report;
  15. private static List<string> expandedNodes;
  16. private string brackets;
  17. private bool textChanged;
  18. public string ExpressionText
  19. {
  20. get { return tbText.Text; }
  21. set
  22. {
  23. tbText.Text = value.Replace("\r", "").Replace("\n", Environment.NewLine);
  24. // Because ExpressionText is used before editor is displayed
  25. // and starts the TextChanged event
  26. textChanged = false;
  27. }
  28. }
  29. public string Brackets
  30. {
  31. get { return brackets; }
  32. set { brackets = value; }
  33. }
  34. public bool HideDataBar { get; set; }
  35. private string GetTextWithBrackets()
  36. {
  37. string text = tvData.SelectedItem;
  38. string[] brackets = Brackets.Split(',');
  39. // this check is needed if Brackets property is not "[,]"
  40. if (InsideBrackets(tbText.SelectionStart))
  41. {
  42. if (tvData.SelectedItemType == DataTreeSelectedItemType.Function ||
  43. tvData.SelectedItemType == DataTreeSelectedItemType.CustomItem)
  44. return text;
  45. return "[" + text + "]";
  46. }
  47. return brackets[0] + text + brackets[1];
  48. }
  49. private bool InsideBrackets(int pos)
  50. {
  51. string[] brackets = Brackets.Split(',');
  52. FindTextArgs args = new FindTextArgs();
  53. args.Text = new FastString(tbText.Text);
  54. args.OpenBracket = brackets[0];
  55. args.CloseBracket = brackets[1];
  56. args.StartIndex = pos;
  57. return CodeUtils.IndexInsideBrackets(args);
  58. }
  59. private void tbText_KeyDown(object sender, KeyEventArgs e)
  60. {
  61. if (e.KeyCode == Keys.Enter && e.Control)
  62. DialogResult = DialogResult.OK;
  63. else if (e.KeyData == (Keys.A | Keys.Control))
  64. tbText.SelectAll();
  65. }
  66. private void tvData_ItemDrag(object sender, ItemDragEventArgs e)
  67. {
  68. tvData.SelectedNode = e.Item as TreeNode;
  69. if (tvData.SelectedItem != "")
  70. tvData.DoDragDrop(e.Item, DragDropEffects.Move);
  71. else
  72. tvData.DoDragDrop(e.Item, DragDropEffects.None);
  73. }
  74. private void tbText_DragOver(object sender, DragEventArgs e)
  75. {
  76. int index = tbText.GetCharIndexFromPosition(tbText.PointToClient(new Point(e.X, e.Y)));
  77. if (index == tbText.Text.Length - 1)
  78. index++;
  79. tbText.Focus();
  80. tbText.Select(index, 0);
  81. e.Effect = e.AllowedEffect;
  82. }
  83. private void tbText_DragDrop(object sender, DragEventArgs e)
  84. {
  85. tbText.SelectedText = GetTextWithBrackets();
  86. tbText.Focus();
  87. }
  88. private void tvData_AfterSelect(object sender, TreeViewEventArgs e)
  89. {
  90. bool descrVisible = tvData.SelectedNode != null &&
  91. (tvData.SelectedNode.Tag is MethodInfo || tvData.SelectedNode.Tag is SystemVariable);
  92. expandableSplitter1.Visible = descrVisible;
  93. lblDescription.Visible = descrVisible;
  94. if (descrVisible)
  95. lblDescription.ShowDescription(report, tvData.SelectedNode.Tag);
  96. }
  97. private void tvData_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
  98. {
  99. if (tvData.SelectedItem != "")
  100. {
  101. tbText.SelectedText = GetTextWithBrackets();
  102. tbText.Focus();
  103. }
  104. }
  105. private void cbWordWrap_CheckedChanged(object sender, EventArgs e)
  106. {
  107. tbText.WordWrap = cbWordWrap.Checked;
  108. }
  109. private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
  110. {
  111. tbText.Focus();
  112. }
  113. private void tbText_TextChanged(object sender, EventArgs e)
  114. {
  115. textChanged = true;
  116. }
  117. private void TextEditorForm_Shown(object sender, EventArgs e)
  118. {
  119. tbText.Focus();
  120. tbText.Select(0, 0);
  121. }
  122. private void TextEditorForm_FormClosing(object sender, FormClosingEventArgs e)
  123. {
  124. if (DialogResult != DialogResult.OK && DialogResult != DialogResult.Abort && textChanged)
  125. {
  126. string askText = Res.Get("Forms,TextEditor,ConfirmChanges");
  127. DialogResult askResult = FRMessageBox.Confirm(askText, MessageBoxButtons.YesNoCancel);
  128. switch (askResult)
  129. {
  130. case DialogResult.Yes:
  131. DialogResult = DialogResult.OK;
  132. break;
  133. case DialogResult.No:
  134. break;
  135. case DialogResult.Cancel:
  136. e.Cancel = true;
  137. break;
  138. }
  139. }
  140. }
  141. private void Init()
  142. {
  143. textChanged = false;
  144. btnCancel.DialogResult = DialogResult.Abort;
  145. if (!HideDataBar)
  146. tvData.CreateNodes(report.Dictionary);
  147. if (HideDataBar)
  148. {
  149. tbText.Parent = this;
  150. tbText.Dock = DockStyle.None;
  151. tbText.Bounds = splitContainer1.Bounds;
  152. tbText.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
  153. splitContainer1.Visible = false;
  154. }
  155. }
  156. protected override void SaveState()
  157. {
  158. base.SaveState();
  159. Storage.SetBool("WordWrap", cbWordWrap.Checked);
  160. if (!HideDataBar)
  161. {
  162. Storage.SetDip("Splitter", splitContainer1.SplitterDistance);
  163. Storage.SetDip("DescriptionHeight", lblDescription.Height);
  164. expandedNodes = tvData.ExpandedNodes;
  165. }
  166. }
  167. protected override void RestoreState()
  168. {
  169. base.RestoreState();
  170. cbWordWrap.Checked = Storage.GetBool("WordWrap", true);
  171. if (!HideDataBar)
  172. {
  173. splitContainer1.SplitterDistance = Storage.GetDip("Splitter", 320, 50, Width - 50);
  174. lblDescription.Height = Storage.GetDip("DescriptionHeight", 50, 50, 200);
  175. if (expandedNodes != null)
  176. tvData.ExpandedNodes = expandedNodes;
  177. }
  178. }
  179. public override void Localize()
  180. {
  181. base.Localize();
  182. MyRes res = new MyRes("Forms,TextEditor");
  183. Text = res.Get("");
  184. cbWordWrap.Text = res.Get("WordWrap");
  185. }
  186. public override void UpdateDpiDependencies()
  187. {
  188. base.UpdateDpiDependencies();
  189. tvData.ImageList = GetImages();
  190. tbText.Font = this.LogicalToDevice(Storage.GetFont("TextFieldEditor", DrawUtils.DefaultReportFont), true);
  191. MinimumSize = this.LogicalToDevice(new Size(360, 230));
  192. }
  193. public new DialogResult ShowDialog()
  194. {
  195. Init();
  196. return base.ShowDialog();
  197. }
  198. public TextEditorForm(Report report)
  199. {
  200. this.report = report;
  201. brackets = "[,]";
  202. CanSaveRestoreState = true;
  203. InitializeComponent();
  204. Localize();
  205. UIUtils.CheckRTL(this);
  206. UpdateDpiDependencies();
  207. }
  208. }
  209. }