HTMLView.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using System;
  2. using System.ComponentModel;
  3. using System.Drawing;
  4. using System.Drawing.Design;
  5. using System.Drawing.Drawing2D;
  6. using System.Drawing.Imaging;
  7. using System.IO;
  8. using System.Threading;
  9. using System.Windows;
  10. using System.Windows.Forms;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Threading;
  14. using FastReport;
  15. using FastReport.Utils;
  16. using ikvm.extensions;
  17. using InABox.WPF;
  18. using TheArtOfDev.HtmlRenderer.Core;
  19. using TheArtOfDev.HtmlRenderer.WPF;
  20. using Color = System.Drawing.Color;
  21. using FontFamily = System.Drawing.FontFamily;
  22. using FontStyle = System.Drawing.FontStyle;
  23. using Size = System.Windows.Size;
  24. namespace InABox.Wpf.Reports.CustomObjects;
  25. internal class HTMLViewSmartTag : DataColumnSmartTag
  26. {
  27. protected override void ItemClicked()
  28. {
  29. (Obj as HTMLView).DataColumn = DataColumn;
  30. base.ItemClicked();
  31. }
  32. public HTMLViewSmartTag(ComponentBase obj) : base(obj)
  33. {
  34. DataColumn = (Obj as HTMLView).DataColumn;
  35. }
  36. }
  37. public class HTMLView : ReportComponentBase
  38. {
  39. [Category("Data")]
  40. [Editor("FastReport.TypeEditors.DataColumnEditor, FastReport", typeof(UITypeEditor))]
  41. public string? DataColumn { get; set; }
  42. [Category("Layout")]
  43. public Padding Padding { get; set; }
  44. public HTMLView()
  45. {
  46. Padding = Padding.Empty;
  47. SetFlags(Flags.HasSmartTag, true);
  48. CanGrow = true;
  49. }
  50. public override SmartTagBase GetSmartTag()
  51. {
  52. return new HTMLViewSmartTag(this);
  53. }
  54. public override SizeF GetPreferredSize()
  55. {
  56. if ((Page as ReportPage).IsImperialUnitsUsed)
  57. return new SizeF(Page.Width / Units.Inches, Units.Inches * 0.5f);
  58. return new SizeF(Page.Width / Units.Millimeters, Units.Millimeters * 10f);
  59. }
  60. public override void Serialize(FRWriter writer)
  61. {
  62. base.Serialize(writer);
  63. if (writer.DiffObject is HTMLView view)
  64. {
  65. if (Padding != view.Padding)
  66. writer.WriteValue("Padding", Padding);
  67. if (!string.Equals(DataColumn,view.DataColumn))
  68. writer.WriteValue("DataColumn", DataColumn);
  69. }
  70. }
  71. public override void Assign(Base source)
  72. {
  73. base.Assign(source);
  74. if (source is HTMLView src)
  75. {
  76. Padding = src.Padding;
  77. DataColumn = src.DataColumn;
  78. }
  79. }
  80. // public override void GetData()
  81. // {
  82. // base.GetData();
  83. // if (!string.IsNullOrEmpty(DataColumn))
  84. // {
  85. // object data = Report.GetColumnValueNullable(DataColumn);
  86. // Text = data as string;
  87. // }
  88. // }
  89. public override float CalcHeight()
  90. {
  91. if (IsDesigning || !CanGrow)
  92. return base.CalcHeight();
  93. var data = Report.GetColumnValueNullable(DataColumn) as string;
  94. if (String.IsNullOrWhiteSpace(data))
  95. return base.CalcHeight();
  96. var size = HtmlRender.Measure(data, Width - Padding.Horizontal);
  97. return ((float)size.Height + Padding.Vertical);
  98. }
  99. public static BitmapSource CreateBitmap(
  100. int width, int height, double dpiX, double dpiY, Action<DrawingContext> render)
  101. {
  102. DrawingVisual drawingVisual = new DrawingVisual();
  103. using (DrawingContext drawingContext = drawingVisual.RenderOpen())
  104. {
  105. render(drawingContext);
  106. }
  107. RenderTargetBitmap bitmap = new RenderTargetBitmap(
  108. width, height, dpiX, dpiY, PixelFormats.Default);
  109. bitmap.Render(drawingVisual);
  110. return bitmap;
  111. }
  112. public override void Draw(FRPaintEventArgs e)
  113. {
  114. base.Draw(e);
  115. DrawMarkers(e);
  116. IGraphics g = e.Graphics;
  117. RectangleF rect = new RectangleF(
  118. (AbsLeft + Padding.Left) * e.ScaleX,
  119. (AbsTop + Padding.Top) * e.ScaleY,
  120. (Width - Padding.Horizontal) * e.ScaleX,
  121. (Height - Padding.Vertical) * e.ScaleY);
  122. StringFormat format = e.Cache.GetStringFormat(
  123. StringAlignment.Near,
  124. StringAlignment.Near,
  125. StringTrimming.None,
  126. StringFormatFlags.NoWrap,
  127. 0f,
  128. 48f);
  129. Font font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular);
  130. var textBrush = new SolidBrush(Color.Black);
  131. if (IsDesigning)
  132. {
  133. g.DrawString(DataColumn ?? "", font, textBrush, rect, format);
  134. }
  135. else
  136. {
  137. g.ResetClip();
  138. g.SetClip(rect);
  139. Report report = Report;
  140. if (report != null && report.SmoothGraphics)
  141. {
  142. g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  143. g.SmoothingMode = SmoothingMode.AntiAlias;
  144. }
  145. if (!string.IsNullOrWhiteSpace(DataColumn))
  146. {
  147. var data = Report.GetColumnValueNullable(DataColumn) as string;
  148. BitmapSource image = CreateBitmap(
  149. (int)(Width * (e.Graphics.DpiX / 96f)) , (int)(Height * e.ScaleX * (e.Graphics.DpiY / 96f)), e.Graphics.DpiX , e.Graphics.DpiY ,
  150. context =>
  151. {
  152. HtmlRender.Render(context, data,0,0,(int)(Width));
  153. });
  154. var bmp = ImageUtils.BitmapSourceToBitmap(image);
  155. bmp.Save("c:\\development\\html.png");
  156. g.DrawImage(bmp, rect.X, rect.Y, bmp.Width * 96f * e.ScaleX / e.Graphics.DpiX, bmp.Height * 96f * e.ScaleY / e.Graphics.DpiY);
  157. }
  158. }
  159. Border.Draw(e, new RectangleF(AbsLeft, AbsTop, Width, Height));
  160. }
  161. }