RDLExportPlugin.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. using System.Drawing;
  6. using System.Windows.Forms;
  7. using FastReport.DataVisualization.Charting;
  8. using FastReport.MSChart;
  9. using FastReport.Table;
  10. using FastReport.Matrix;
  11. namespace FastReport.Design.ExportPlugins.RDL
  12. {
  13. /// <summary>
  14. /// Represents the RDL export plugin.
  15. /// </summary>
  16. internal class RDLExportPlugin : ExportPlugin
  17. {
  18. #region Fields
  19. private StreamWriter writer;
  20. private ReportPage page;
  21. private Base parent;
  22. private ReportComponentBase component;
  23. #endregion // Fields
  24. #region Constructors
  25. /// <summary>
  26. /// Initializes a new instance of the <see cref="RDLExportPlugin"/> class.
  27. /// </summary>
  28. public RDLExportPlugin() : base()
  29. {
  30. }
  31. /// <summary>
  32. /// Initializes a new instance of the <see cref="RDLExportPlugin"/> class with a specified designer.
  33. /// </summary>
  34. /// <param name="designer">The report designer.</param>
  35. public RDLExportPlugin(Designer designer) : base(designer)
  36. {
  37. }
  38. #endregion // Constructors
  39. #region Private Methods
  40. private string ReplaceControlChars(string str)
  41. {
  42. str = str.Replace(Environment.NewLine, "&#13;&#10;");
  43. str = str.Replace("&", "&amp;");
  44. str = str.Replace("'", "&apos;");
  45. str = str.Replace("\"", "&quot;");
  46. str = str.Replace("<", "&lt;");
  47. str = str.Replace(">", "&gt;");
  48. return str;
  49. }
  50. private void WriteBorderStyle(string tab)
  51. {
  52. if (component.Border.Lines != BorderLines.None)
  53. {
  54. bool writeDefaultLine = true;
  55. bool writeLeftLine = true;
  56. bool writeRightLine = true;
  57. bool writeTopLine = true;
  58. bool writeBottomLine = true;
  59. if (component.Border.Lines != BorderLines.All)
  60. {
  61. writeDefaultLine = false;
  62. string borderLines = component.Border.Lines.ToString();
  63. writeLeftLine = borderLines.Contains(BorderLines.Left.ToString());
  64. writeRightLine = borderLines.Contains(BorderLines.Right.ToString());
  65. writeTopLine = borderLines.Contains(BorderLines.Top.ToString());
  66. writeBottomLine = borderLines.Contains(BorderLines.Bottom.ToString());
  67. }
  68. writer.WriteLine(tab + " <BorderStyle>");
  69. if (writeDefaultLine)
  70. {
  71. writer.WriteLine(tab + " <Default>" + UnitsConverter.ConvertLineStyle(component.Border.Style) + "</Default>");
  72. }
  73. if (writeLeftLine)
  74. {
  75. writer.WriteLine(tab + " <Left>" + UnitsConverter.ConvertLineStyle(component.Border.LeftLine.Style) + "</Left>");
  76. }
  77. if (writeRightLine)
  78. {
  79. writer.WriteLine(tab + " <Right>" + UnitsConverter.ConvertLineStyle(component.Border.RightLine.Style) + "</Right>");
  80. }
  81. if (writeTopLine)
  82. {
  83. writer.WriteLine(tab + " <Top>" + UnitsConverter.ConvertLineStyle(component.Border.TopLine.Style) + "</Top>");
  84. }
  85. if (writeBottomLine)
  86. {
  87. writer.WriteLine(tab + " <Bottom>" + UnitsConverter.ConvertLineStyle(component.Border.BottomLine.Style) + "</Bottom>");
  88. }
  89. writer.WriteLine(tab + " </BorderStyle>");
  90. }
  91. }
  92. private void WriteBorderColor(string tab)
  93. {
  94. writer.WriteLine(tab + " <BorderColor>");
  95. writer.WriteLine(tab + " <Default>" + UnitsConverter.ConvertColor(component.Border.Color) + "</Default>");
  96. writer.WriteLine(tab + " <Left>" + UnitsConverter.ConvertColor(component.Border.LeftLine.Color) + "</Left>");
  97. writer.WriteLine(tab + " <Right>" + UnitsConverter.ConvertColor(component.Border.RightLine.Color) + "</Right>");
  98. writer.WriteLine(tab + " <Top>" + UnitsConverter.ConvertColor(component.Border.TopLine.Color) + "</Top>");
  99. writer.WriteLine(tab + " <Bottom>" + UnitsConverter.ConvertColor(component.Border.BottomLine.Color) + "</Bottom>");
  100. writer.WriteLine(tab + " </BorderColor>");
  101. }
  102. private void WriteBorderWidth(string tab)
  103. {
  104. writer.WriteLine(tab + " <BorderWidth>");
  105. writer.WriteLine(tab + " <Default>" + UnitsConverter.PixelsToMillimeters(component.Border.Width) + "</Default>");
  106. writer.WriteLine(tab + " <Left>" + UnitsConverter.PixelsToMillimeters(component.Border.LeftLine.Width) + "</Left>");
  107. writer.WriteLine(tab + " <Right>" + UnitsConverter.PixelsToMillimeters(component.Border.RightLine.Width) + "</Right>");
  108. writer.WriteLine(tab + " <Top>" + UnitsConverter.PixelsToMillimeters(component.Border.TopLine.Width) + "</Top>");
  109. writer.WriteLine(tab + " <Bottom>" + UnitsConverter.PixelsToMillimeters(component.Border.BottomLine.Width) + "</Bottom>");
  110. writer.WriteLine(tab + " </BorderWidth>");
  111. }
  112. private void WriteStyle(string tab)
  113. {
  114. writer.WriteLine(tab + "<Style>");
  115. WriteBorderStyle(tab);
  116. WriteBorderColor(tab);
  117. WriteBorderWidth(tab);
  118. if (component is TextObject)
  119. {
  120. TextObject to = component as TextObject;
  121. writer.WriteLine(tab + " <FontStyle>" + UnitsConverter.ConvertFontStyle(to.Font.Style) + "</FontStyle>");
  122. writer.WriteLine(tab + " <FontFamily>" + UnitsConverter.ConvertFontFamily(to.Font.FontFamily) + "</FontFamily>");
  123. writer.WriteLine(tab + " <FontSize>" + UnitsConverter.ConvertFontSize(to.Font.Size) + "</FontSize>");
  124. writer.WriteLine(tab + " <TextAlign>" + UnitsConverter.ConvertHorzAlign(to.HorzAlign) + "</TextAlign>");
  125. writer.WriteLine(tab + " <VerticalAlign>" + UnitsConverter.ConvertVertAlign(to.VertAlign) + "</VerticalAlign>");
  126. writer.WriteLine(tab + " <WritingMode>" + UnitsConverter.ConvertAngleToWritingMode(to.Angle) + "</WritingMode>");
  127. writer.WriteLine(tab + " <Color>" + UnitsConverter.ConvertColor(to.TextColor) + "</Color>");
  128. writer.WriteLine(tab + " <PaddingBottom>" + UnitsConverter.ConvertPixels(to.Padding.Bottom) + "</PaddingBottom>");
  129. writer.WriteLine(tab + " <PaddingLeft>" + UnitsConverter.ConvertPixels(to.Padding.Left) + "</PaddingLeft>");
  130. writer.WriteLine(tab + " <PaddingRight>" + UnitsConverter.ConvertPixels(to.Padding.Right) + "</PaddingRight>");
  131. writer.WriteLine(tab + " <PaddingTop>" + UnitsConverter.ConvertPixels(to.Padding.Top) + "</PaddingTop>");
  132. writer.WriteLine(tab + " <BackgroundColor>" + UnitsConverter.ConvertColor(to.FillColor) + "</BackgroundColor>");
  133. }
  134. else if (component is ShapeObject)
  135. {
  136. writer.WriteLine(tab + " <BackgroundColor>" + UnitsConverter.ConvertColor((component as ShapeObject).FillColor) + "</BackgroundColor>");
  137. }
  138. else if (component is MSChartObject)
  139. {
  140. MSChartObject chart = component as MSChartObject;
  141. writer.WriteLine(tab + " <BackgroundColor>" + UnitsConverter.ConvertColor(chart.Chart.BackColor) + "</BackgroundColor>");
  142. writer.WriteLine(tab + " <BackgroundGradientType>" + UnitsConverter.ConvertGradientStyle(chart.Chart.BackGradientStyle) + "</BackgroundGradientType>");
  143. writer.WriteLine(tab + " <BackgroundGradientEndColor>" + UnitsConverter.ConvertColor(chart.Chart.BackSecondaryColor) + "</BackgroundGradientEndColor>");
  144. writer.WriteLine(tab + " <PaddingBottom>" + UnitsConverter.ConvertPixels(chart.Chart.Padding.Bottom) + "</PaddingBottom>");
  145. writer.WriteLine(tab + " <PaddingLeft>" + UnitsConverter.ConvertPixels(chart.Chart.Padding.Left) + "</PaddingLeft>");
  146. writer.WriteLine(tab + " <PaddingRight>" + UnitsConverter.ConvertPixels(chart.Chart.Padding.Right) + "</PaddingRight>");
  147. writer.WriteLine(tab + " <PaddingTop>" + UnitsConverter.ConvertPixels(chart.Chart.Padding.Top) + "</PaddingTop>");
  148. }
  149. else if (component is TableObject)
  150. {
  151. writer.WriteLine(tab + " <BackgroundColor>" + UnitsConverter.ConvertColor((component as TableObject).FillColor) + "</BackgroundColor>");
  152. }
  153. else if (component is PictureObject)
  154. {
  155. PictureObject pic = component as PictureObject;
  156. writer.WriteLine(tab + " <PaddingBottom>" + UnitsConverter.ConvertPixels(pic.Padding.Bottom) + "</PaddingBottom>");
  157. writer.WriteLine(tab + " <PaddingLeft>" + UnitsConverter.ConvertPixels(pic.Padding.Left) + "</PaddingLeft>");
  158. writer.WriteLine(tab + " <PaddingRight>" + UnitsConverter.ConvertPixels(pic.Padding.Right) + "</PaddingRight>");
  159. writer.WriteLine(tab + " <PaddingTop>" + UnitsConverter.ConvertPixels(pic.Padding.Top) + "</PaddingTop>");
  160. }
  161. writer.WriteLine(tab + "</Style>");
  162. }
  163. private void WriteStyleT(Title title, string tab)
  164. {
  165. writer.WriteLine(tab + "<Style>");
  166. writer.WriteLine(tab + " <BorderColor>");
  167. writer.WriteLine(tab + " <Default>" + UnitsConverter.ConvertColor(title.BorderColor) + "</Default>");
  168. writer.WriteLine(tab + " </BorderColor>");
  169. writer.WriteLine(tab + " <BorderStyle>");
  170. writer.WriteLine(tab + " <Default>" + UnitsConverter.ConvertChartDashStyle(title.BorderDashStyle) + "</Default>");
  171. writer.WriteLine(tab + " </BorderStyle>");
  172. writer.WriteLine(tab + " <BorderWidth>");
  173. writer.WriteLine(tab + " <Default>" + UnitsConverter.PixelsToMillimeters(title.BorderWidth) + "</Default>");
  174. writer.WriteLine(tab + " </BorderWidth>");
  175. writer.WriteLine(tab + " <BackgroundColor>" + UnitsConverter.ConvertColor(title.BackColor) + "</BackgroundColor>");
  176. writer.WriteLine(tab + " <BackgroundGradientType>" + UnitsConverter.ConvertGradientStyle(title.BackGradientStyle) + "</BackgroundGradientType>");
  177. writer.WriteLine(tab + " <BackgroundGradientEndColor>" + UnitsConverter.ConvertColor(title.BackSecondaryColor) + "</BackgroundGradientEndColor>");
  178. writer.WriteLine(tab + " <FontStyle>" + UnitsConverter.ConvertFontStyle(title.Font.Style) + "</FontStyle>");
  179. writer.WriteLine(tab + " <FontFamily>" + UnitsConverter.ConvertFontFamily(title.Font.FontFamily) + "</FontFamily>");
  180. writer.WriteLine(tab + " <FontSize>" + UnitsConverter.ConvertFontSize(title.Font.Size) + "</FontSize>");
  181. writer.WriteLine(tab + " <TextAlign>" + UnitsConverter.ContentAlignmentToTextAlign(title.Alignment) + "</TextAlign>");
  182. writer.WriteLine(tab + " <VerticalAlign>" + UnitsConverter.ContentAlignmentToVerticalAlign(title.Alignment) + "</VerticalAlign>");
  183. writer.WriteLine(tab + " <Color>" + UnitsConverter.ConvertColor(title.ForeColor) + "</Color>");
  184. writer.WriteLine(tab + "</Style>");
  185. }
  186. private void WriteVisibility(bool visible, string tab)
  187. {
  188. if (!visible)
  189. {
  190. writer.WriteLine(tab + "<Visibility>");
  191. writer.WriteLine(tab + " <Hidden>=true</Hidden>");
  192. writer.WriteLine(tab + "</Visibility>");
  193. }
  194. }
  195. private void WritePageSize()
  196. {
  197. writer.WriteLine(" <PageHeight>" + UnitsConverter.MillimetersToString(page.PaperHeight) + "</PageHeight>");
  198. writer.WriteLine(" <PageWidth>" + UnitsConverter.MillimetersToString(page.PaperWidth) + "</PageWidth>");
  199. }
  200. private void WriteLegend()
  201. {
  202. Legend legend = (component as MSChartObject).Chart.Legends[0];
  203. writer.WriteLine(" <Legend>");
  204. writer.WriteLine(" <Visible>" + UnitsConverter.ConvertBool(legend.Enabled) + "</Visible>");
  205. //WriteStyle(" ");
  206. writer.WriteLine(" <Position>" + UnitsConverter.ConvertLegendDockingAndAlignment(legend.Docking, legend.Alignment) + "</Position>");
  207. writer.WriteLine(" <Layout>" + UnitsConverter.ConvertLegendStyle(legend.LegendStyle) + "</Layout>");
  208. writer.WriteLine(" <InsidePlotArea>" + UnitsConverter.ConvertBool(legend.IsDockedInsideChartArea) + "</InsidePlotArea>");
  209. writer.WriteLine(" </Legend>");
  210. }
  211. private void WriteGrid(Grid grid)
  212. {
  213. writer.WriteLine(" <ShowGridLines>" + UnitsConverter.ConvertBool(grid.Enabled) + "</ShowGridLines>");
  214. writer.WriteLine(" <Style>");
  215. writer.WriteLine(" <BorderStyle>" + UnitsConverter.ConvertChartDashStyle(grid.LineDashStyle) + "</BorderStyle>");
  216. writer.WriteLine(" <BorderColor>" + UnitsConverter.ConvertColor(grid.LineColor) + "</BorderColor>");
  217. writer.WriteLine(" <BorderWidth>" + UnitsConverter.PixelsToMillimeters(grid.LineWidth) + "</BorderWidth>");
  218. writer.WriteLine(" </Style>");
  219. }
  220. private void WriteAxis(Axis axis)
  221. {
  222. writer.WriteLine(" <Axis>");
  223. writer.WriteLine(" <Visible>" + UnitsConverter.ConvertAxisEnabled(axis.Enabled) + "</Visible>");
  224. writer.WriteLine(" <Title>");
  225. writer.WriteLine(" <Caption>" + axis.Title + "</Caption>");
  226. writer.WriteLine(" <Style>");
  227. writer.WriteLine(" <FontStyle>" + UnitsConverter.ConvertFontStyle(axis.TitleFont.Style) + "</FontStyle>");
  228. writer.WriteLine(" <FontFamily>" + UnitsConverter.ConvertFontFamily(axis.TitleFont.FontFamily) + "</FontFamily>");
  229. writer.WriteLine(" <FontSize>" + UnitsConverter.ConvertFontSize(axis.TitleFont.Size) + "</FontSize>");
  230. writer.WriteLine(" <TextAlign>" + UnitsConverter.ConvertStringAlignment(axis.TitleAlignment) + "</TextAlign>");
  231. writer.WriteLine(" <Color>" + UnitsConverter.ConvertColor(axis.TitleForeColor) + "</Color>");
  232. writer.WriteLine(" </Style>");
  233. writer.WriteLine(" </Title>");
  234. writer.WriteLine(" <Margin>" + UnitsConverter.ConvertBool(axis.IsMarginVisible) + "</Margin>");
  235. writer.WriteLine(" <MajorTickMarks>" + UnitsConverter.ConvertTickMarkStyle(axis.MajorTickMark.TickMarkStyle) + "</MajorTickMarks>");
  236. writer.WriteLine(" <MinorTickMarks>" + UnitsConverter.ConvertTickMarkStyle(axis.MinorTickMark.TickMarkStyle) + "</MinorTickMarks>");
  237. writer.WriteLine(" <MajorGridLines>");
  238. WriteGrid(axis.MajorGrid);
  239. writer.WriteLine(" </MajorGridLines>");
  240. writer.WriteLine(" <MinorGridLines>");
  241. WriteGrid(axis.MinorGrid);
  242. writer.WriteLine(" </MinorGridLines>");
  243. writer.WriteLine(" <Reverse>" + UnitsConverter.ConvertBool(axis.IsReversed) + "</Reverse>");
  244. writer.WriteLine(" <Interlaced>" + UnitsConverter.ConvertBool(axis.IsInterlaced) + "</Interlaced>");
  245. writer.WriteLine(" </Axis>");
  246. }
  247. private void WriteCategoryAxis()
  248. {
  249. writer.WriteLine(" <CategoryAxis>");
  250. WriteAxis((component as MSChartObject).Chart.ChartAreas[0].AxisX);
  251. writer.WriteLine(" </CategoryAxis>");
  252. }
  253. private void WriteValueAxis()
  254. {
  255. writer.WriteLine(" <ValueAxis>");
  256. WriteAxis((component as MSChartObject).Chart.ChartAreas[0].AxisY);
  257. writer.WriteLine(" </ValueAxis>");
  258. }
  259. private void WriteTitle()
  260. {
  261. Title title = (component as MSChartObject).Chart.Titles[0];
  262. writer.WriteLine(" <Title>");
  263. writer.WriteLine(" <Caption>" + ReplaceControlChars(title.Text) + "</Caption>");
  264. WriteStyleT(title, " ");
  265. writer.WriteLine(" </Title>");
  266. }
  267. private void WriteThreeDProperties()
  268. {
  269. MSChartObject chart = component as MSChartObject;
  270. writer.WriteLine(" <ThreeDProperties>");
  271. writer.WriteLine(" <Enabled>" + UnitsConverter.ConvertBool(chart.Chart.ChartAreas[0].Area3DStyle.Enable3D) + "</Enabled>");
  272. writer.WriteLine(" <Rotation>" + chart.Chart.ChartAreas[0].Area3DStyle.Rotation.ToString() + "</Rotation>");
  273. writer.WriteLine(" <Inclination>" + chart.Chart.ChartAreas[0].Area3DStyle.Inclination.ToString() + "</Inclination>");
  274. writer.WriteLine(" <Perspective>" + chart.Chart.ChartAreas[0].Area3DStyle.Perspective.ToString() + "</Perspective>");
  275. writer.WriteLine(" <DepthRatio>" + chart.Chart.ChartAreas[0].Area3DStyle.PointDepth.ToString() + "</DepthRatio>");
  276. writer.WriteLine(" <Shading>" + UnitsConverter.ConvertLightStyle(chart.Chart.ChartAreas[0].Area3DStyle.LightStyle) + "</Shading>");
  277. writer.WriteLine(" <GapDepth>" + chart.Chart.ChartAreas[0].Area3DStyle.PointGapDepth.ToString() + "</GapDepth>");
  278. writer.WriteLine(" <WallThickness>" + chart.Chart.ChartAreas[0].Area3DStyle.WallWidth.ToString() + "</WallThickness>");
  279. writer.WriteLine(" <Clustered>" + UnitsConverter.ConvertBool(chart.Chart.ChartAreas[0].Area3DStyle.IsClustered) + "</Clustered>");
  280. writer.WriteLine(" </ThreeDProperties>");
  281. }
  282. private void WriteTableColumn(TableColumn column)
  283. {
  284. writer.WriteLine(" <TableColumn>");
  285. writer.WriteLine(" <Width>" + UnitsConverter.PixelsToMillimeters(column.Width) + "</Width>");
  286. WriteVisibility(column.Visible, " ");
  287. writer.WriteLine(" </TableColumn>");
  288. }
  289. private void WriteTableColumns()
  290. {
  291. writer.WriteLine(" <TableColumns>");
  292. foreach (TableColumn column in (component as TableObject).Columns)
  293. {
  294. WriteTableColumn(column);
  295. }
  296. writer.WriteLine(" </TableColumns>");
  297. }
  298. private void WriteTableCell(TableCell cell)
  299. {
  300. writer.WriteLine(" <TableCell>");
  301. writer.WriteLine(" <ReportItems>");
  302. writer.WriteLine(" <Textbox Name=\"" + cell.Name + "\">");
  303. ReportComponentBase tempComponent = component;
  304. component = cell;
  305. WriteStyle(" ");
  306. component = tempComponent;
  307. writer.WriteLine(" <CanGrow>" + UnitsConverter.ConvertBool(cell.CanGrow) + "</CanGrow>");
  308. writer.WriteLine(" <CanShrink>" + UnitsConverter.ConvertBool(cell.CanShrink) + "</CanShrink>");
  309. writer.WriteLine(" <Value>" + ReplaceControlChars(cell.Text) + "</Value>");
  310. writer.WriteLine(" </Textbox>");
  311. writer.WriteLine(" </ReportItems>");
  312. writer.WriteLine(" <ColSpan>" + cell.ColSpan.ToString() + "</ColSpan>");
  313. writer.WriteLine(" </TableCell>");
  314. }
  315. private void WriteTableRow(TableRow row, int rowNum)
  316. {
  317. writer.WriteLine(" <TableRow>");
  318. writer.WriteLine(" <TableCells>");
  319. for (int col = 0; col < (component as TableObject).ColumnCount; col++)
  320. {
  321. WriteTableCell((component as TableObject).GetCellData(col, rowNum).Cell);
  322. }
  323. writer.WriteLine(" </TableCells>");
  324. writer.WriteLine(" <Height>" + UnitsConverter.PixelsToMillimeters(row.Height) + "</Height>");
  325. WriteVisibility(row.Visible, " ");
  326. writer.WriteLine(" </TableRow>");
  327. }
  328. private void WriteHeader()
  329. {
  330. writer.WriteLine(" <Header>");
  331. writer.WriteLine(" <TableRows>");
  332. WriteTableRow((component as TableObject).Rows[0], 0);
  333. writer.WriteLine(" </TableRows>");
  334. writer.WriteLine(" </Header>");
  335. }
  336. private void WriteDetails()
  337. {
  338. TableObject table = component as TableObject;
  339. if (table.Rows.Count > 1)
  340. {
  341. writer.WriteLine(" <Details>");
  342. writer.WriteLine(" <TableRows>");
  343. WriteTableRow(table.Rows[1], 1);
  344. writer.WriteLine(" </TableRows>");
  345. WriteVisibility(table.Rows[1].Visible, " ");
  346. writer.WriteLine(" </Details>");
  347. }
  348. }
  349. private void WriteFooter()
  350. {
  351. TableObject table = component as TableObject;
  352. if (table.Rows.Count > 2)
  353. {
  354. writer.WriteLine(" <Footer>");
  355. writer.WriteLine(" <TableRows>");
  356. WriteTableRow(table.Rows[table.Rows.Count - 1], table.Rows.Count - 1);
  357. writer.WriteLine(" </TableRows>");
  358. writer.WriteLine(" </Footer>");
  359. }
  360. }
  361. private void WriteColumnGroupings()
  362. {
  363. MatrixObject matrix = component as MatrixObject;
  364. ReportComponentBase tempComponent = component;
  365. TableCell cell = matrix.GetCellData(0, 0).Cell;
  366. writer.WriteLine(" <ColumnGroupings>");
  367. writer.WriteLine(" <ColumnGrouping>");
  368. writer.WriteLine(" <Height>" + UnitsConverter.PixelsToMillimeters(matrix.Rows[0].Height) + "</Height>");
  369. writer.WriteLine(" <DynamicColumns>");
  370. writer.WriteLine(" <Grouping Name=\"DynamicColumnsGrouping1\">");
  371. writer.WriteLine(" <GroupExpressions>");
  372. writer.WriteLine(" <GroupExpression>" + "" + "</GroupExpression>");
  373. writer.WriteLine(" </GroupExpressions>");
  374. writer.WriteLine(" </Grouping>");
  375. writer.WriteLine(" <ReportItems>");
  376. cell = matrix.GetCellData(1, 0).Cell;
  377. writer.WriteLine(" <Textbox Name=\"" + cell.Name + "\">");
  378. tempComponent = component;
  379. component = cell;
  380. WriteStyle(" ");
  381. component = tempComponent;
  382. writer.WriteLine(" <CanGrow>" + UnitsConverter.ConvertBool(cell.CanGrow) + "</CanGrow>");
  383. writer.WriteLine(" <CanShrink>" + UnitsConverter.ConvertBool(cell.CanShrink) + "</CanShrink>");
  384. writer.WriteLine(" <Value>" + cell.Text + "</Value>");
  385. writer.WriteLine(" </Textbox>");
  386. writer.WriteLine(" </ReportItems>");
  387. writer.WriteLine(" <Subtotal>");
  388. writer.WriteLine(" <ReportItems>");
  389. cell = matrix.GetCellData(matrix.ColumnCount - 1, 0).Cell;
  390. writer.WriteLine(" <Textbox Name=\"" + cell.Name + "\">");
  391. tempComponent = component;
  392. component = cell;
  393. WriteStyle(" ");
  394. component = tempComponent;
  395. writer.WriteLine(" <CanGrow>" + UnitsConverter.ConvertBool(cell.CanGrow) + "</CanGrow>");
  396. writer.WriteLine(" <CanShrink>" + UnitsConverter.ConvertBool(cell.CanShrink) + "</CanShrink>");
  397. writer.WriteLine(" <Value>" + cell.Text + "</Value>");
  398. writer.WriteLine(" </Textbox>");
  399. writer.WriteLine(" </ReportItems>");
  400. writer.WriteLine(" </Subtotal>");
  401. WriteVisibility(cell.Visible, " ");
  402. writer.WriteLine(" </DynamicColumns>");
  403. writer.WriteLine(" </ColumnGrouping>");
  404. writer.WriteLine(" </ColumnGroupings>");
  405. }
  406. private void WriteRowGroupings()
  407. {
  408. MatrixObject matrix = component as MatrixObject;
  409. ReportComponentBase tempComponent = component;
  410. TableCell cell = matrix.GetCellData(0, 0).Cell;
  411. writer.WriteLine(" <RowGroupings>");
  412. writer.WriteLine(" <RowGrouping>");
  413. writer.WriteLine(" <Width>" + UnitsConverter.PixelsToMillimeters(matrix.Columns[0].Width) + "</Width>");
  414. writer.WriteLine(" <DynamicRows>");
  415. writer.WriteLine(" <Grouping Name=\"DynamicRowsGrouping1\">");
  416. writer.WriteLine(" <GroupExpressions>");
  417. writer.WriteLine(" <GroupExpression>" + "" + "</GroupExpression>");
  418. writer.WriteLine(" </GroupExpressions>");
  419. writer.WriteLine(" </Grouping>");
  420. writer.WriteLine(" <ReportItems>");
  421. cell = matrix.GetCellData(0, 1).Cell;
  422. writer.WriteLine(" <Textbox Name=\"" + cell.Name + "\">");
  423. tempComponent = component;
  424. component = cell;
  425. WriteStyle(" ");
  426. component = tempComponent;
  427. writer.WriteLine(" <CanGrow>" + UnitsConverter.ConvertBool(cell.CanGrow) + "</CanGrow>");
  428. writer.WriteLine(" <CanShrink>" + UnitsConverter.ConvertBool(cell.CanShrink) + "</CanShrink>");
  429. writer.WriteLine(" <Value>" + cell.Text + "</Value>");
  430. writer.WriteLine(" </Textbox>");
  431. writer.WriteLine(" </ReportItems>");
  432. writer.WriteLine(" <Subtotal>");
  433. writer.WriteLine(" <ReportItems>");
  434. cell = matrix.GetCellData(0, matrix.RowCount - 1).Cell;
  435. writer.WriteLine(" <Textbox Name=\"" + cell.Name + "\">");
  436. tempComponent = component;
  437. component = cell;
  438. WriteStyle(" ");
  439. component = tempComponent;
  440. writer.WriteLine(" <CanGrow>" + UnitsConverter.ConvertBool(cell.CanGrow) + "</CanGrow>");
  441. writer.WriteLine(" <CanShrink>" + UnitsConverter.ConvertBool(cell.CanShrink) + "</CanShrink>");
  442. writer.WriteLine(" <Value>" + cell.Text + "</Value>");
  443. writer.WriteLine(" </Textbox>");
  444. writer.WriteLine(" </ReportItems>");
  445. writer.WriteLine(" </Subtotal>");
  446. WriteVisibility(cell.Visible, " ");
  447. writer.WriteLine(" </DynamicRows>");
  448. writer.WriteLine(" </RowGrouping>");
  449. writer.WriteLine(" </RowGroupings>");
  450. }
  451. private void WriteMatrixColumns()
  452. {
  453. MatrixObject matrix = component as MatrixObject;
  454. writer.WriteLine(" <MatrixColumns>");
  455. writer.WriteLine(" <MatrixColumn>");
  456. writer.WriteLine(" <Width>" + UnitsConverter.PixelsToMillimeters(matrix.Columns[0].Width) + "</Width>");
  457. writer.WriteLine(" </MatrixColumn>");
  458. writer.WriteLine(" </MatrixColumns>");
  459. }
  460. private void WriteMatrixRows()
  461. {
  462. MatrixObject matrix = component as MatrixObject;
  463. writer.WriteLine(" <MatrixRows>");
  464. writer.WriteLine(" <MatrixRow>");
  465. writer.WriteLine(" <Height>" + UnitsConverter.PixelsToMillimeters(matrix.Rows[1].Height) + "</Height>");
  466. writer.WriteLine(" <MatrixCells>");
  467. TableCell cell = matrix.GetCellData(1, 1).Cell;
  468. writer.WriteLine(" <MatrixCell>");
  469. writer.WriteLine(" <ReportItems>");
  470. writer.WriteLine(" <Textbox Name=\"" + cell.Name + "\">");
  471. ReportComponentBase tempComponent = component;
  472. component = cell;
  473. WriteStyle(" ");
  474. component = tempComponent;
  475. writer.WriteLine(" <CanGrow>" + UnitsConverter.ConvertBool(cell.CanGrow) + "</CanGrow>");
  476. writer.WriteLine(" <CanShrink>" + UnitsConverter.ConvertBool(cell.CanShrink) + "</CanShrink>");
  477. writer.WriteLine(" <Value>" + cell.Text + "</Value>");
  478. writer.WriteLine(" </Textbox>");
  479. writer.WriteLine(" </ReportItems>");
  480. writer.WriteLine(" </MatrixCell>");
  481. writer.WriteLine(" </MatrixCells>");
  482. writer.WriteLine(" </MatrixRow>");
  483. writer.WriteLine(" </MatrixRows>");
  484. }
  485. private void WriteReportItem()
  486. {
  487. writer.WriteLine(" <Top>" + UnitsConverter.PixelsToMillimeters(component.Top) + "</Top>");
  488. writer.WriteLine(" <Left>" + UnitsConverter.PixelsToMillimeters(component.Left) + "</Left>");
  489. writer.WriteLine(" <Height>" + UnitsConverter.PixelsToMillimeters(component.Height) + "</Height>");
  490. writer.WriteLine(" <Width>" + UnitsConverter.PixelsToMillimeters(component.Width) + "</Width>");
  491. WriteStyle(" ");
  492. WriteVisibility(component.Visible, " ");
  493. }
  494. private void WriteLine(LineObject line)
  495. {
  496. writer.WriteLine(" <Line Name=\"" + line.Name + "\">");
  497. component = line;
  498. WriteReportItem();
  499. writer.WriteLine(" </Line>");
  500. }
  501. private void WriteRectangle(ShapeObject rectangle)
  502. {
  503. writer.WriteLine(" <Rectangle Name=\"" + rectangle.Name + "\">");
  504. component = rectangle;
  505. WriteReportItem();
  506. writer.WriteLine(" </Rectangle>");
  507. }
  508. private void WriteTextbox(TextObject textbox)
  509. {
  510. writer.WriteLine(" <Textbox Name=\"" + textbox.Name + "\">");
  511. component = textbox;
  512. WriteReportItem();
  513. writer.WriteLine(" <CanGrow>" + UnitsConverter.ConvertBool(textbox.CanGrow) + "</CanGrow>");
  514. writer.WriteLine(" <CanShrink>" + UnitsConverter.ConvertBool(textbox.CanShrink) + "</CanShrink>");
  515. writer.WriteLine(" <Value>" + ReplaceControlChars(textbox.Text) + "</Value>");
  516. writer.WriteLine(" </Textbox>");
  517. }
  518. private void WriteImage(PictureObject image)
  519. {
  520. writer.WriteLine(" <Image Name=\"" + image.Name + "\">");
  521. component = image;
  522. WriteReportItem();
  523. writer.WriteLine(" <Source>External</Source>");
  524. writer.WriteLine(" <Value>" + image.ImageLocation + "</Value>");
  525. writer.WriteLine(" <Sizing>" + UnitsConverter.ConvertSizeMode(image.SizeMode) + "</Sizing>");
  526. writer.WriteLine(" </Image>");
  527. }
  528. private void WriteSubreport(SubreportObject subreport)
  529. {
  530. writer.WriteLine(" <Subreport Name=\"" + subreport.Name + "\">");
  531. component = subreport;
  532. WriteReportItem();
  533. writer.WriteLine(" <ReportName>" + subreport.Name + "</ReportName>");
  534. writer.WriteLine(" </Subreport>");
  535. }
  536. private void WriteChart(MSChartObject chart)
  537. {
  538. writer.WriteLine(" <Chart Name=\"" + chart.Name + "\">");
  539. component = chart;
  540. WriteReportItem();
  541. writer.WriteLine(" <Type>" + UnitsConverter.ConvertChartType(chart.Series[0].SeriesSettings.ChartType) + "</Type>");
  542. WriteLegend();
  543. WriteCategoryAxis();
  544. WriteValueAxis();
  545. WriteTitle();
  546. writer.WriteLine(" <Palette>" + UnitsConverter.ConvertChartPalette(chart.Chart.Palette) + "</Palette>");
  547. WriteThreeDProperties();
  548. writer.WriteLine(" <CategoryGroupings>");
  549. writer.WriteLine(" <CategoryGrouping>");
  550. writer.WriteLine(" <DynamicCategories>");
  551. writer.WriteLine(" <Grouping Name=\"DynamicCategoriesGroup1\">");
  552. writer.WriteLine(" <GroupExpressions>");
  553. writer.WriteLine(" <GroupExpression></GroupExpression>");
  554. writer.WriteLine(" </GroupExpressions>");
  555. writer.WriteLine(" </Grouping>");
  556. writer.WriteLine(" </DynamicCategories>");
  557. writer.WriteLine(" </CategoryGrouping>");
  558. writer.WriteLine(" </CategoryGroupings>");
  559. writer.WriteLine(" </Chart>");
  560. }
  561. private void WriteTable(TableObject table)
  562. {
  563. writer.WriteLine(" <Table Name=\"" + table.Name + "\">");
  564. component = table;
  565. WriteReportItem();
  566. WriteTableColumns();
  567. WriteHeader();
  568. WriteDetails();
  569. WriteFooter();
  570. writer.WriteLine(" </Table>");
  571. }
  572. private void WriteMatrix(MatrixObject matrix)
  573. {
  574. writer.WriteLine(" <Matrix Name=\"" + matrix.Name + "\">");
  575. component = matrix;
  576. WriteReportItem();
  577. WriteColumnGroupings();
  578. WriteRowGroupings();
  579. WriteMatrixColumns();
  580. WriteMatrixRows();
  581. writer.WriteLine(" </Matrix>");
  582. }
  583. private void WriteReportItems()
  584. {
  585. if (parent.AllObjects.Count != 0)
  586. {
  587. writer.WriteLine(" <ReportItems>");
  588. foreach (Object obj in parent.AllObjects)
  589. {
  590. if (obj is LineObject)
  591. {
  592. WriteLine(obj as LineObject);
  593. }
  594. else if (obj is ShapeObject)
  595. {
  596. WriteRectangle(obj as ShapeObject);
  597. }
  598. else if (obj is TextObject)
  599. {
  600. if (!(obj is TableCell))
  601. {
  602. WriteTextbox(obj as TextObject);
  603. }
  604. }
  605. else if (obj is PictureObject)
  606. {
  607. WriteImage(obj as PictureObject);
  608. }
  609. else if (obj is SubreportObject)
  610. {
  611. WriteSubreport(obj as SubreportObject);
  612. }
  613. else if (obj is MSChartObject)
  614. {
  615. WriteChart(obj as MSChartObject);
  616. }
  617. else if (obj is TableObject)
  618. {
  619. WriteTable(obj as TableObject);
  620. }
  621. else if (obj is MatrixObject)
  622. {
  623. WriteMatrix(obj as MatrixObject);
  624. }
  625. else
  626. {
  627. TextObject text = new TextObject();
  628. ReportComponentBase c = obj as ReportComponentBase;
  629. text.Name = c.Name;
  630. text.Text = c.Name;
  631. text.Top = c.Top;
  632. text.Left = c.Left;
  633. text.Width = c.Width;
  634. text.Height = c.Height;
  635. text.Visible = c.Visible;
  636. WriteTextbox(text);
  637. }
  638. }
  639. writer.WriteLine(" </ReportItems>");
  640. }
  641. }
  642. private void WritePageHeader()
  643. {
  644. writer.WriteLine(" <PageHeader>");
  645. string height = "0.0pt";
  646. string printOn = "";
  647. if (page.ReportTitle != null)
  648. {
  649. ReportTitleBand reportTitle = page.ReportTitle;
  650. height = UnitsConverter.PixelsToMillimeters(reportTitle.Height);
  651. printOn = reportTitle.PrintOn.ToString();
  652. parent = reportTitle;
  653. WriteReportItems();
  654. }
  655. else if (page.PageHeader != null)
  656. {
  657. PageHeaderBand pageHeader = page.PageHeader;
  658. height = UnitsConverter.PixelsToMillimeters(pageHeader.Height);
  659. printOn = pageHeader.PrintOn.ToString();
  660. parent = pageHeader;
  661. WriteReportItems();
  662. }
  663. string printOnFPage = printOn.Contains(PrintOn.FirstPage.ToString()).ToString().ToLower();
  664. string printOnLPage = printOn.Contains(PrintOn.LastPage.ToString()).ToString().ToLower();
  665. writer.WriteLine(" <Height>" + height + "</Height>");
  666. writer.WriteLine(" <PrintOnFirstPage>" + printOnFPage + "</PrintOnFirstPage>");
  667. writer.WriteLine(" <PrintOnLastPage>" + printOnLPage + "</PrintOnLastPage>");
  668. writer.WriteLine(" </PageHeader>");
  669. }
  670. private void WriteBody()
  671. {
  672. writer.WriteLine(" <Body>");
  673. if ((page.Bands.Count != 0) && (page.Bands[0] is DataBand))
  674. {
  675. writer.WriteLine(" <Height>" + UnitsConverter.PixelsToMillimeters(page.Bands[0].Height) + "</Height>");
  676. parent = page.Bands[0] as DataBand;
  677. WriteReportItems();
  678. }
  679. else
  680. {
  681. writer.WriteLine(" <Height>" + "0.0pt" + "</Height>");
  682. }
  683. writer.WriteLine(" </Body>");
  684. }
  685. private void WritePageFooter()
  686. {
  687. writer.WriteLine(" <PageFooter>");
  688. PageFooterBand pageFooter = page.PageFooter;
  689. if (pageFooter != null)
  690. {
  691. writer.WriteLine(" <Height>" + UnitsConverter.PixelsToMillimeters(pageFooter.Height) + "</Height>");
  692. string printOn = pageFooter.PrintOn.ToString();
  693. bool printOnFirstPage = printOn.Contains(PrintOn.FirstPage.ToString());
  694. bool printOnLastPage = printOn.Contains(PrintOn.LastPage.ToString());
  695. writer.WriteLine(" <PrintOnFirstPage>" + printOnFirstPage.ToString().ToLower() + "</PrintOnFirstPage>");
  696. writer.WriteLine(" <PrintOnLastPage>" + printOnLastPage.ToString().ToLower() + "</PrintOnLastPage>");
  697. parent = pageFooter;
  698. WriteReportItems();
  699. }
  700. else
  701. {
  702. writer.WriteLine(" <Height>" + "0.0pt" + "</Height>");
  703. writer.WriteLine(" <PrintOnFirstPage>" + "true" + "</PrintOnFirstPage>");
  704. writer.WriteLine(" <PrintOnLastPage>" + "true" + "</PrintOnLastPage>");
  705. }
  706. writer.WriteLine(" </PageFooter>");
  707. }
  708. private void WritePageMargins()
  709. {
  710. writer.WriteLine(" <BottomMargin>" + UnitsConverter.MillimetersToString(page.BottomMargin) + "</BottomMargin>");
  711. writer.WriteLine(" <LeftMargin>" + UnitsConverter.MillimetersToString(page.LeftMargin) + "</LeftMargin>");
  712. writer.WriteLine(" <RightMargin>" + UnitsConverter.MillimetersToString(page.RightMargin) + "</RightMargin>");
  713. writer.WriteLine(" <TopMargin>" + UnitsConverter.MillimetersToString(page.TopMargin) + "</TopMargin>");
  714. }
  715. private void WriteReport()
  716. {
  717. writer.WriteLine(" <Description>" + ReplaceControlChars(Report.ReportInfo.Description) + "</Description>");
  718. writer.WriteLine(" <Author>" + Report.ReportInfo.Author + "</Author>");
  719. WritePageSize();
  720. WritePageHeader();
  721. WriteBody();
  722. WritePageFooter();
  723. writer.WriteLine(" <Width>" + UnitsConverter.MillimetersToString(page.PaperWidth) + "</Width>");
  724. WritePageMargins();
  725. }
  726. #endregion // Private Methods
  727. #region Protected Methods
  728. /// <inheritdoc/>
  729. protected override string GetFilter()
  730. {
  731. return new FastReport.Utils.MyRes("FileFilters").Get("RdlFile");
  732. }
  733. #endregion // Protected Methods
  734. #region Public Methods
  735. /// <inheritdoc/>
  736. public override void SaveReport(Report report, string filename)
  737. {
  738. DialogResult result = MessageBox.Show(new FastReport.Utils.MyRes("Messages").Get("WarningSaveRDL"),
  739. new FastReport.Utils.MyRes("Messages").Get("Attention"), MessageBoxButtons.YesNo);
  740. if (result == DialogResult.Yes)
  741. {
  742. Report = report;
  743. page = Report.Pages[0] as ReportPage;
  744. if (page != null)
  745. {
  746. using (writer = new StreamWriter(new FileStream(filename, FileMode.Create)))
  747. {
  748. writer.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
  749. writer.WriteLine("<Report xmlns:rd=\"http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition\" xmlns=\"http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition\">");
  750. WriteReport();
  751. writer.WriteLine("</Report>");
  752. }
  753. }
  754. }
  755. }
  756. #endregion // Public Methods
  757. }
  758. }