DialogPage.DesignExt.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. using System;
  2. using System.ComponentModel;
  3. using System.Drawing;
  4. using System.Drawing.Drawing2D;
  5. using System.Windows.Forms;
  6. using FastReport.Design;
  7. using FastReport.Design.PageDesigners.Dialog;
  8. using FastReport.Utils;
  9. namespace FastReport.Dialog
  10. {
  11. partial class DialogPage
  12. {
  13. #region Private Fields
  14. private Bitmap formBitmap;
  15. #endregion Private Fields
  16. #region Public Properties
  17. /// <inheritdoc/>
  18. [Browsable(false)]
  19. public override float Left
  20. {
  21. get { return base.Left; }
  22. set { base.Left = value; }
  23. }
  24. /// <inheritdoc/>
  25. [Browsable(false)]
  26. public override float Top
  27. {
  28. get { return base.Top; }
  29. set { base.Top = value; }
  30. }
  31. /// <inheritdoc/>
  32. public override SizeF SnapSize
  33. {
  34. get { return new SizeF(DialogWorkspace.Grid.SnapSize, DialogWorkspace.Grid.SnapSize); }
  35. }
  36. #endregion Public Properties
  37. #region Internal Properties
  38. [Browsable(false)]
  39. internal Bitmap FormBitmap
  40. {
  41. get
  42. {
  43. if (formBitmap == null)
  44. ResetFormBitmap();
  45. return formBitmap;
  46. }
  47. }
  48. #endregion Internal Properties
  49. #region Public Methods
  50. /// <inheritdoc/>
  51. public override void DrawSelection(FRPaintEventArgs e)
  52. {
  53. float m = Form.DpiMultiplier();
  54. Pen pen = e.Cache.GetPen(Color.Gray, m, DashStyle.Dot);
  55. e.Graphics.DrawRectangle(pen,
  56. -Form.ClientAreaOffset().X - 2 * m,
  57. -Form.ClientAreaOffset().Y - 2 * m,
  58. Form.FrameSize().Width + 3.5f * m,
  59. Form.FrameSize().Height + 3.5f * m);
  60. base.DrawSelection(e);
  61. }
  62. /// <inheritdoc/>
  63. public override Type GetPageDesignerType()
  64. {
  65. return typeof(DialogPageDesigner);
  66. }
  67. /// <inheritdoc/>
  68. public override ContextMenuBase GetContextMenu()
  69. {
  70. return new DialogPageMenu(Report.Designer);
  71. }
  72. /// <inheritdoc/>
  73. public override void HandleDoubleClick()
  74. {
  75. Report.Designer.ActiveReportTab.SwitchToCode();
  76. if (String.IsNullOrEmpty(LoadEvent))
  77. {
  78. string newEventName = Name + "_Load";
  79. if (Report.CodeHelper.AddHandler(typeof(EventHandler), newEventName))
  80. {
  81. LoadEvent = newEventName;
  82. Report.Designer.SetModified(null, "Change");
  83. }
  84. }
  85. else
  86. {
  87. Report.CodeHelper.LocateHandler(LoadEvent);
  88. }
  89. }
  90. /// <inheritdoc/>
  91. public override void HandleMouseDown(FRMouseEventArgs e)
  92. {
  93. e.handled = true;
  94. e.mode = WorkspaceMode2.SelectionRect;
  95. e.activeObject = this;
  96. }
  97. /// <inheritdoc/>
  98. public override void HandleMouseHover(FRMouseEventArgs e)
  99. {
  100. base.HandleMouseHover(e);
  101. if (e.handled)
  102. e.cursor = Cursors.Default;
  103. }
  104. /// <inheritdoc/>
  105. public override void HandleMouseUp(FRMouseEventArgs e)
  106. {
  107. base.HandleMouseUp(e);
  108. if (e.mode == WorkspaceMode2.SelectionRect)
  109. {
  110. SelectedObjectCollection selection = Report.Designer.SelectedObjects;
  111. selection.Clear();
  112. // find objects inside the selection rect
  113. foreach (DialogComponentBase c in Controls)
  114. {
  115. e.handled = false;
  116. c.HandleMouseUp(e);
  117. // object is inside
  118. if (e.handled)
  119. selection.Add(c);
  120. }
  121. if (selection.Count == 0)
  122. selection.Add(this);
  123. }
  124. }
  125. /// <inheritdoc/>
  126. public override void SetDefaults()
  127. {
  128. ButtonControl btnOk = new ButtonControl();
  129. btnOk.Parent = this;
  130. btnOk.Name = CreateButtonName("btnOk");
  131. btnOk.Text = Res.Get("Buttons,OK");
  132. btnOk.Location = new Point((int)ClientSize.Width - 166, (int)ClientSize.Height - 31);
  133. btnOk.Size = new Size(75, 23);
  134. btnOk.DialogResult = DialogResult.OK;
  135. btnOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
  136. ButtonControl btnCancel = new ButtonControl();
  137. btnCancel.Parent = this;
  138. btnCancel.Name = CreateButtonName("btnCancel");
  139. btnCancel.Text = Res.Get("Buttons,Cancel");
  140. btnCancel.Location = new Point((int)ClientSize.Width - 83, (int)ClientSize.Height - 31);
  141. btnCancel.Size = new Size(75, 23);
  142. btnCancel.DialogResult = DialogResult.Cancel;
  143. btnCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
  144. AcceptButton = btnOk;
  145. CancelButton = btnCancel;
  146. Form.AutoScaleDimensions = new SizeF(96f, 96f);
  147. Form.AutoScaleMode = AutoScaleMode.Dpi;
  148. base.SetDefaults();
  149. }
  150. #endregion Public Methods
  151. #region Internal Methods
  152. internal void ResetFormBitmap()
  153. {
  154. if (formBitmap != null)
  155. {
  156. formBitmap.Dispose();
  157. formBitmap = null;
  158. }
  159. if (!IsDesigning)
  160. return;
  161. formBitmap = DrawUtils.DrawToBitmap(Form, false);
  162. }
  163. #endregion
  164. #region Protected Methods
  165. /// <inheritdoc/>
  166. protected override SelectionPoint[] GetSelectionPoints()
  167. {
  168. return new SelectionPoint[]
  169. {
  170. new SelectionPoint(
  171. Form.FrameSize().Width - Form.ClientAreaOffset().X + 1,
  172. Form.FrameSize().Height - Form.ClientAreaOffset().Y + 1, SizingPoint.RightBottom),
  173. new SelectionPoint(
  174. Form.FrameSize().Width / 2 - Form.ClientAreaOffset().X,
  175. Form.FrameSize().Height - Form.ClientAreaOffset().Y + 1, SizingPoint.BottomCenter),
  176. new SelectionPoint(
  177. Form.FrameSize().Width - Form.ClientAreaOffset().X + 1,
  178. Form.FrameSize().Height / 2 - Form.ClientAreaOffset().Y, SizingPoint.RightCenter)
  179. };
  180. }
  181. #endregion Protected Methods
  182. #region Private Methods
  183. private bool ShouldSerializeBackColor()
  184. {
  185. return BackColor != SystemColors.Control;
  186. }
  187. //private bool ShouldSerializeFont()
  188. //{
  189. // return Font.Name != "Tahoma" || Font.Size != 8 || Font.Style != FontStyle.Regular;
  190. //}
  191. #endregion Private Methods
  192. }
  193. internal static class DialogPageFormMixins
  194. {
  195. #if AVALONIA
  196. public static Size FrameSize(this Form form) => new Size(form.Width + (int)(8 * form.DpiScale), form.Height + (int)(30 * form.DpiScale));
  197. public static Point ClientAreaOffset(this Form form) => new Point((int)(4 * form.DpiScale), (int)(26 * form.DpiScale));
  198. #else
  199. public static Size FrameSize(this Form form) => new Size(form.Width, form.Height);
  200. public static Point ClientAreaOffset(this Form form)
  201. {
  202. Point offset = new Point(0, 0);
  203. try
  204. {
  205. offset = form.PointToScreen(offset);
  206. }
  207. catch (ObjectDisposedException)
  208. {
  209. return offset;
  210. }
  211. offset.X -= form.Left;
  212. offset.Y -= form.Top;
  213. return offset;
  214. }
  215. #endif
  216. }
  217. internal class DialogPageMenu : ComponentBaseMenu
  218. {
  219. #region Private Methods
  220. private void miCopy_Click(object sender, EventArgs e)
  221. {
  222. Designer.cmdCopyPage.Invoke();
  223. }
  224. private void miDelete_Click(object sender, EventArgs e)
  225. {
  226. Designer.cmdDeletePage.Invoke();
  227. }
  228. #endregion // Private Methods
  229. #region Constructors
  230. public DialogPageMenu(Designer designer) : base(designer)
  231. {
  232. miEdit.Visible = Designer.cmdEdit.Enabled;
  233. miCut.Visible = false;
  234. miPaste.Visible = true;
  235. miBringToFront.Visible = false;
  236. miSendToBack.Visible = false;
  237. miCopy.BeginGroup = true;
  238. // remove from QAT. This menu is too short
  239. miEdit.QatItem = miCopy.QatItem = miPaste.QatItem = miDelete.QatItem = false;
  240. miCopy.Text = Res.Get("Designer,Menu,Edit,CopyPage");
  241. miCopy.Enabled = Designer.cmdCopyPage.Enabled;
  242. miPaste.Enabled = Designer.cmdPaste.Enabled;
  243. miDelete.Enabled = Designer.cmdDeletePage.Enabled;
  244. miCopy.Click += miCopy_Click;
  245. miDelete.Click += miDelete_Click;
  246. }
  247. #endregion // Constructors
  248. }
  249. }