HTMLView.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. Width = 10.0f;
  50. }
  51. public override SmartTagBase GetSmartTag()
  52. {
  53. return new HTMLViewSmartTag(this);
  54. }
  55. public override SizeF GetPreferredSize()
  56. {
  57. if ((Page as ReportPage).IsImperialUnitsUsed)
  58. return new SizeF(Page.Width / Units.Inches, Units.Inches * 0.5f);
  59. return new SizeF(Page.Width / Units.Millimeters, Units.Millimeters * 10f);
  60. }
  61. public override void Serialize(FRWriter writer)
  62. {
  63. base.Serialize(writer);
  64. if (writer.DiffObject is HTMLView view)
  65. {
  66. if (Padding != view.Padding)
  67. writer.WriteValue("Padding", Padding);
  68. if (!string.Equals(DataColumn,view.DataColumn))
  69. writer.WriteValue("DataColumn", DataColumn);
  70. }
  71. }
  72. public override void Assign(Base source)
  73. {
  74. base.Assign(source);
  75. if (source is HTMLView src)
  76. {
  77. Padding = src.Padding;
  78. DataColumn = src.DataColumn;
  79. }
  80. }
  81. // public override void GetData()
  82. // {
  83. // base.GetData();
  84. // if (!string.IsNullOrEmpty(DataColumn))
  85. // {
  86. // object data = Report.GetColumnValueNullable(DataColumn);
  87. // Text = data as string;
  88. // }
  89. // }
  90. public override float CalcHeight()
  91. {
  92. if (IsDesigning || !CanGrow)
  93. return base.CalcHeight();
  94. var data = Report.GetColumnValueNullable(DataColumn.Replace("[","").Replace("]","")) as string;
  95. if (String.IsNullOrWhiteSpace(data))
  96. return base.CalcHeight();
  97. var size = HtmlRender.Measure(data, (Width - Padding.Horizontal) * 2f);
  98. return ((float)(size.Height + Padding.Vertical) * 2f);
  99. }
  100. public static BitmapSource CreateBitmap(
  101. int width, int height, double dpiX, double dpiY, Action<DrawingContext> render)
  102. {
  103. DrawingVisual drawingVisual = new DrawingVisual();
  104. using (DrawingContext drawingContext = drawingVisual.RenderOpen())
  105. {
  106. render(drawingContext);
  107. }
  108. RenderTargetBitmap bitmap = new RenderTargetBitmap(width * 2, height * 2, dpiX, dpiY, PixelFormats.Pbgra32);
  109. //width * (int)(dpiX/96.0), height * (int)(dpiY/96.0), 96.0, 96.0, PixelFormats.Pbgra32);
  110. bitmap.Render(drawingVisual);
  111. return bitmap;
  112. }
  113. public override void Draw(FRPaintEventArgs e)
  114. {
  115. base.Draw(e);
  116. DrawMarkers(e);
  117. IGraphics g = e.Graphics;
  118. RectangleF rect = new RectangleF(
  119. AbsLeft + Padding.Left,
  120. AbsTop + Padding.Top,
  121. Width - Padding.Horizontal,
  122. Height - Padding.Vertical
  123. );
  124. StringFormat format = e.Cache.GetStringFormat(
  125. StringAlignment.Near,
  126. StringAlignment.Near,
  127. StringTrimming.None,
  128. StringFormatFlags.NoWrap,
  129. 0f,
  130. 48f);
  131. Font font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular);
  132. var textBrush = new SolidBrush(Color.Black);
  133. if (IsDesigning)
  134. {
  135. g.DrawString(DataColumn ?? "", font, textBrush, rect, format);
  136. }
  137. else
  138. {
  139. g.ResetClip();
  140. g.SetClip(rect);
  141. Report report = Report;
  142. if (report != null && report.SmoothGraphics)
  143. {
  144. g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  145. g.SmoothingMode = SmoothingMode.AntiAlias;
  146. }
  147. if (!string.IsNullOrWhiteSpace(DataColumn))
  148. {
  149. var data = Report.GetColumnValueNullable(DataColumn.Replace("[","").Replace("]","")) as string;
  150. BitmapSource image = CreateBitmap((int)rect.Width, (int)rect.Height, 96f, 96f,
  151. //(int)(Width * e.ScaleX * (e.Graphics.DpiX / 96f)) , (int)(Height * e.ScaleY * (e.Graphics.DpiY / 96f)), e.Graphics.DpiX , e.Graphics.DpiY ,
  152. context =>
  153. {
  154. HtmlRender.Render(context, data,0,0,(int)(Width));
  155. });
  156. var bmp = ImageUtils.BitmapSourceToBitmap(image);
  157. bmp.Save("c:\\development\\html.png");
  158. g.DrawImage(bmp, rect.X, rect.Y, bmp.Width, bmp.Height);
  159. }
  160. }
  161. Border.Draw(e, new RectangleF(AbsLeft, AbsTop, Width, Height));
  162. }
  163. }