RDLImport.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  1. using System;
  2. using System.IO;
  3. using System.Xml;
  4. using System.Drawing;
  5. using System.Windows.Forms;
  6. using FastReport.Data;
  7. using FastReport.Table;
  8. namespace FastReport.Import.RDL
  9. {
  10. /// <summary>
  11. /// Represents the RDL import plugin.
  12. /// </summary>
  13. public partial class RDLImport : ImportBase
  14. {
  15. #region Fields
  16. private ReportPage page;
  17. private ComponentBase component;
  18. private Base parent;
  19. private string defaultFontFamily;
  20. private BandBase curBand;
  21. private string dataSetName;
  22. private bool firstRun;
  23. private XmlNode reportNode;
  24. private string filename;
  25. private float sectionWidth = 0.0f;
  26. #endregion // Fields
  27. #region Constructors
  28. /// <summary>
  29. /// Initializes a new instance of the <see cref="RDLImport"/> class.
  30. /// </summary>
  31. public RDLImport() : base()
  32. {
  33. }
  34. #endregion // Constructors
  35. #region Private Methods
  36. private void LoadBorderColor(XmlNode borderColorNode, string border)
  37. {
  38. XmlNodeList nodeList = borderColorNode.ChildNodes;
  39. foreach (XmlNode node in nodeList)
  40. {
  41. if (border == "Default")
  42. {
  43. if (component is ReportComponentBase)
  44. {
  45. (component as ReportComponentBase).Border.Color = UnitsConverter.ConvertColor(node.InnerText);
  46. }
  47. }
  48. else if (border == "Top")
  49. {
  50. if (component is ReportComponentBase)
  51. {
  52. (component as ReportComponentBase).Border.TopLine.Color = UnitsConverter.ConvertColor(node.InnerText);
  53. }
  54. }
  55. else if (border == "Left")
  56. {
  57. if (component is ReportComponentBase)
  58. {
  59. (component as ReportComponentBase).Border.LeftLine.Color = UnitsConverter.ConvertColor(node.InnerText);
  60. }
  61. }
  62. else if (border == "Right")
  63. {
  64. if (component is ReportComponentBase)
  65. {
  66. (component as ReportComponentBase).Border.RightLine.Color = UnitsConverter.ConvertColor(node.InnerText);
  67. }
  68. }
  69. else if (border == "Bottom")
  70. {
  71. if (component is ReportComponentBase)
  72. {
  73. (component as ReportComponentBase).Border.BottomLine.Color = UnitsConverter.ConvertColor(node.InnerText);
  74. }
  75. }
  76. }
  77. }
  78. private void LoadBorder(XmlNode borderNode)
  79. {
  80. XmlNodeList nodeList = borderNode.ChildNodes;
  81. string border = "";
  82. if (borderNode.Name == "TopBorder")
  83. {
  84. border = "Top";
  85. }
  86. else if (borderNode.Name == "BottomBorder")
  87. {
  88. border = "Bottom";
  89. }
  90. else if (borderNode.Name == "LeftBorder")
  91. {
  92. border = "Left";
  93. }
  94. else if (borderNode.Name == "RightBorder")
  95. {
  96. border = "Right";
  97. }
  98. else
  99. {
  100. border = "default";
  101. }
  102. foreach (XmlNode node in nodeList)
  103. {
  104. if (node.Name == "Color")
  105. {
  106. LoadBorderColor(node, border);
  107. }
  108. else if (node.Name == "Style")
  109. {
  110. LoadBorderStyle(node, border);
  111. }
  112. else if (node.Name == "Width")
  113. {
  114. LoadBorderWidth(node, border);
  115. }
  116. }
  117. }
  118. private void LoadBorderStyle(XmlNode borderStyleNode, string border)
  119. {
  120. XmlNodeList nodeList = borderStyleNode.ChildNodes;
  121. foreach (XmlNode node in nodeList)
  122. {
  123. if (node.InnerText != "None")
  124. {
  125. if (border == "Default")
  126. {
  127. if (component is ReportComponentBase)
  128. {
  129. (component as ReportComponentBase).Border.Lines = BorderLines.All;
  130. (component as ReportComponentBase).Border.Style = UnitsConverter.ConvertBorderStyle(node.InnerText);
  131. }
  132. }
  133. else if (border == "Top")
  134. {
  135. if (component is ReportComponentBase)
  136. {
  137. (component as ReportComponentBase).Border.Lines |= BorderLines.Top;
  138. (component as ReportComponentBase).Border.TopLine.Style = UnitsConverter.ConvertBorderStyle(node.InnerText);
  139. }
  140. }
  141. else if (border == "Left")
  142. {
  143. if (component is ReportComponentBase)
  144. {
  145. (component as ReportComponentBase).Border.Lines |= BorderLines.Left;
  146. (component as ReportComponentBase).Border.LeftLine.Style = UnitsConverter.ConvertBorderStyle(node.InnerText);
  147. }
  148. }
  149. else if (border == "Right")
  150. {
  151. if (component is ReportComponentBase)
  152. {
  153. (component as ReportComponentBase).Border.Lines |= BorderLines.Right;
  154. (component as ReportComponentBase).Border.RightLine.Style = UnitsConverter.ConvertBorderStyle(node.InnerText);
  155. }
  156. }
  157. else if (border == "Bottom")
  158. {
  159. if (component is ReportComponentBase)
  160. {
  161. (component as ReportComponentBase).Border.Lines |= BorderLines.Bottom;
  162. (component as ReportComponentBase).Border.BottomLine.Style = UnitsConverter.ConvertBorderStyle(node.InnerText);
  163. }
  164. }
  165. }
  166. }
  167. }
  168. private void LoadBorderWidth(XmlNode borderWidthNode, string border)
  169. {
  170. XmlNodeList nodeList = borderWidthNode.ChildNodes;
  171. foreach (XmlNode node in nodeList)
  172. {
  173. if (border == "Default")
  174. {
  175. if (component is ReportComponentBase)
  176. {
  177. (component as ReportComponentBase).Border.Width = UnitsConverter.SizeToPixels(node.InnerText);
  178. }
  179. }
  180. else if (border == "Top")
  181. {
  182. if (component is ReportComponentBase)
  183. {
  184. (component as ReportComponentBase).Border.TopLine.Width = UnitsConverter.SizeToPixels(node.InnerText);
  185. }
  186. }
  187. else if (border == "Left")
  188. {
  189. if (component is ReportComponentBase)
  190. {
  191. (component as ReportComponentBase).Border.LeftLine.Width = UnitsConverter.SizeToPixels(node.InnerText);
  192. }
  193. }
  194. else if (border == "Right")
  195. {
  196. if (component is ReportComponentBase)
  197. {
  198. (component as ReportComponentBase).Border.RightLine.Width = UnitsConverter.SizeToPixels(node.InnerText);
  199. }
  200. }
  201. else if (border == "Bottom")
  202. {
  203. if (component is ReportComponentBase)
  204. {
  205. (component as ReportComponentBase).Border.BottomLine.Width = UnitsConverter.SizeToPixels(node.InnerText);
  206. }
  207. }
  208. }
  209. }
  210. private void LoadStyle(XmlNode styleNode)
  211. {
  212. FontStyle fontStyle = FontStyle.Regular;
  213. string fontFamily = "Arial";
  214. float fontSize = 10.0f;
  215. int paddingTop = 0;
  216. int paddingLeft = 2;
  217. int paddingRight = 2;
  218. int paddingBottom = 0;
  219. XmlNodeList nodeList = styleNode.ChildNodes;
  220. foreach (XmlNode node in nodeList)
  221. {
  222. if (node.Name.EndsWith("Border"))
  223. {
  224. LoadBorder(node);
  225. }
  226. else if (node.Name == "BackgroundColor")
  227. {
  228. if (component is ShapeObject)
  229. {
  230. (component as ShapeObject).FillColor = UnitsConverter.ConvertColor(node.InnerText);
  231. }
  232. else if (component is TableObject)
  233. {
  234. (component as TableObject).FillColor = UnitsConverter.ConvertColor(node.InnerText);
  235. }
  236. }
  237. else if (node.Name == "FontStyle")
  238. {
  239. fontStyle = UnitsConverter.ConvertFontStyle(node.InnerText);
  240. }
  241. else if (node.Name == "FontFamily")
  242. {
  243. fontFamily = node.InnerText;
  244. }
  245. else if (node.Name == "FontSize")
  246. {
  247. fontSize = Convert.ToSingle(UnitsConverter.ConvertFontSize(node.InnerText));
  248. }
  249. else if (node.Name == "TextAlign")
  250. {
  251. if (component is TextObject)
  252. {
  253. (component as TextObject).HorzAlign = UnitsConverter.ConvertTextAlign(node.InnerText);
  254. }
  255. }
  256. else if (node.Name == "VerticalAlign")
  257. {
  258. if (component is TextObject)
  259. {
  260. (component as TextObject).VertAlign = UnitsConverter.ConvertVerticalAlign(node.InnerText);
  261. }
  262. }
  263. else if (node.Name == "WritingMode")
  264. {
  265. if (component is TextObject)
  266. {
  267. (component as TextObject).Angle = UnitsConverter.ConvertWritingMode(node.InnerText);
  268. }
  269. }
  270. else if (node.Name == "Color")
  271. {
  272. if (component is TextObject)
  273. {
  274. (component as TextObject).TextColor = UnitsConverter.ConvertColor(node.InnerText);
  275. }
  276. }
  277. else if (node.Name == "PaddingLeft")
  278. {
  279. paddingLeft = UnitsConverter.SizeToInt(node.InnerText, SizeUnits.Point);
  280. }
  281. else if (node.Name == "PaddingRight")
  282. {
  283. paddingRight = UnitsConverter.SizeToInt(node.InnerText, SizeUnits.Point);
  284. }
  285. else if (node.Name == "PaddingTop")
  286. {
  287. paddingTop = UnitsConverter.SizeToInt(node.InnerText, SizeUnits.Point);
  288. }
  289. else if (node.Name == "PaddingBottom")
  290. {
  291. paddingBottom = UnitsConverter.SizeToInt(node.InnerText, SizeUnits.Point);
  292. }
  293. }
  294. if (component is TextObject)
  295. {
  296. (component as TextObject).Font = new Font(fontFamily, fontSize, fontStyle);
  297. (component as TextObject).Padding = new Padding(paddingLeft, paddingTop, paddingRight, paddingBottom);
  298. }
  299. else if (component is PictureObject)
  300. {
  301. (component as PictureObject).Padding = new Padding(paddingLeft, paddingTop, paddingRight, paddingBottom);
  302. }
  303. }
  304. private void LoadVisibility(XmlNode visibilityNode)
  305. {
  306. XmlNodeList nodeList = visibilityNode.ChildNodes;
  307. foreach (XmlNode node in nodeList)
  308. {
  309. if (node.Name == "Hidden")
  310. {
  311. component.Visible = !UnitsConverter.BooleanToBool(node.InnerText);
  312. }
  313. }
  314. }
  315. private void LoadPlotArea(XmlNode plotAreaNode)
  316. {
  317. XmlNodeList nodeList = plotAreaNode.ChildNodes;
  318. foreach (XmlNode node in nodeList)
  319. {
  320. if (node.Name == "Style")
  321. {
  322. LoadStyle(node);
  323. }
  324. }
  325. }
  326. private void LoadSubtotal(XmlNode subtotalNode)
  327. {
  328. XmlNodeList nodeList = subtotalNode.ChildNodes;
  329. foreach (XmlNode node in nodeList)
  330. {
  331. if (node.Name == "ReportItems")
  332. {
  333. //LoadReportItems(node);
  334. }
  335. else if (node.Name == "Style")
  336. {
  337. LoadStyle(node);
  338. }
  339. }
  340. }
  341. private void LoadReportItem(XmlNodeList nodeList)
  342. {
  343. foreach (XmlNode node in nodeList)
  344. {
  345. if (node.Name == "Top")
  346. {
  347. component.Top = UnitsConverter.SizeToPixels(node.InnerText);
  348. }
  349. else if (node.Name == "Left")
  350. {
  351. component.Left = UnitsConverter.SizeToPixels(node.InnerText);
  352. }
  353. else if (node.Name == "Height")
  354. {
  355. component.Height = UnitsConverter.SizeToPixels(node.InnerText);
  356. }
  357. else if (node.Name == "Width")
  358. {
  359. component.Width = UnitsConverter.SizeToPixels(node.InnerText);
  360. }
  361. else if (node.Name == "Visibility")
  362. {
  363. LoadVisibility(node);
  364. }
  365. else if (node.Name == "Style")
  366. {
  367. LoadStyle(node);
  368. }
  369. }
  370. if (parent is TableCell)
  371. {
  372. component.Width = (parent as TableCell).Width;
  373. component.Height = (parent as TableCell).Height;
  374. }
  375. }
  376. private void LoadLine(XmlNode lineNode)
  377. {
  378. component = ComponentsFactory.CreateLineObject(lineNode.Attributes["Name"].Value, parent);
  379. XmlNodeList nodeList = lineNode.ChildNodes;
  380. LoadReportItem(nodeList);
  381. }
  382. private void LoadRectangle(XmlNode rectangleNode)
  383. {
  384. XmlNodeList nodeList = rectangleNode.ChildNodes;
  385. if (RectangleExistReportItem(nodeList))
  386. {
  387. LoadContainerRectangle(rectangleNode);
  388. return;
  389. }
  390. component = ComponentsFactory.CreateShapeObject(rectangleNode.Attributes["Name"].Value, parent);
  391. (component as ShapeObject).Shape = ShapeKind.Rectangle;
  392. LoadReportItem(nodeList);
  393. foreach (XmlNode node in nodeList)
  394. {
  395. if (node.Name == "ReportItems")
  396. {
  397. LoadReportItems(node);
  398. }
  399. }
  400. }
  401. private void LoadContainerRectangle(XmlNode rectangleNode)
  402. {
  403. Base tempParent = parent;
  404. component = ComponentsFactory.CreateContainerObject(rectangleNode.Attributes["Name"].Value, parent);
  405. parent = component;
  406. XmlNodeList nodeList = rectangleNode.ChildNodes;
  407. (component as ContainerObject).Border.Lines = BorderLines.All;
  408. (component as ContainerObject).Border.Color = Color.Black;
  409. LoadReportItem(nodeList);
  410. foreach (XmlNode node in nodeList)
  411. {
  412. if (node.Name == "ReportItems")
  413. {
  414. LoadReportItems(node);
  415. }
  416. }
  417. parent = tempParent;
  418. }
  419. private bool RectangleExistReportItem(XmlNodeList reportItemsNode)
  420. {
  421. foreach (XmlNode node in reportItemsNode)
  422. {
  423. if (node.Name == "ReportItems")
  424. foreach (XmlNode itemNode in node)
  425. {
  426. switch (itemNode.Name)
  427. {
  428. case "Line":
  429. case "Rectangle":
  430. case "Textbox":
  431. case "Image":
  432. case "Subreport":
  433. case "Chart":
  434. case "Table":
  435. case "Matrix":
  436. return true;
  437. }
  438. }
  439. }
  440. return false;
  441. }
  442. private void LoadParagraphs(XmlNode paragraphs)
  443. {
  444. firstRun = true;
  445. foreach (XmlNode paragraph in paragraphs.ChildNodes)
  446. {
  447. if (paragraph.Name == "Paragraph")
  448. {
  449. foreach (XmlNode parChild in paragraph.ChildNodes)
  450. {
  451. if (parChild.Name == "TextRuns")
  452. {
  453. foreach (XmlNode runsChild in parChild.ChildNodes)
  454. {
  455. ParseTextRun(runsChild);
  456. }
  457. }
  458. }
  459. }
  460. if (firstRun)
  461. firstRun = false;
  462. }
  463. }
  464. private void ParseTextRun(XmlNode runsChild)
  465. {
  466. if (runsChild.Name == "TextRun")
  467. {
  468. foreach (XmlNode runChild in runsChild.ChildNodes)
  469. {
  470. if (runChild.Name == "Value")
  471. ParseTextBoxValue(runChild);
  472. else if (runChild.Name == "Style")
  473. ParseTextBoxStyle(runChild);
  474. }
  475. }
  476. }
  477. private void ParseTextBoxValue(XmlNode runChild)
  478. {
  479. if (!firstRun)
  480. (component as TextObject).Text += "\r\n";
  481. (component as TextObject).Text += GetValue(runChild.InnerText);
  482. }
  483. private void ParseTextBoxStyle(XmlNode runChild)
  484. {
  485. FontStyle style = FontStyle.Regular;
  486. Color textBoxForeColor = Color.Black;
  487. string fontFamily = String.Empty;
  488. int fontSize = 0;
  489. foreach (XmlNode styleChild in runChild.ChildNodes)
  490. {
  491. if (styleChild.Name == "FontFamily")
  492. fontFamily = styleChild.InnerText;
  493. else if (styleChild.Name == "FontSize")
  494. int.TryParse(styleChild.InnerText.Replace("pt", ""), out fontSize);
  495. else if (styleChild.Name == "FontWeight" && styleChild.InnerText == "Bold")
  496. style = style | FontStyle.Bold;
  497. else if (styleChild.Name == "FontStyle" && styleChild.InnerText == "Italic")
  498. style = style | FontStyle.Italic;
  499. else if (styleChild.Name == "TextDecoration" && styleChild.InnerText == "Underline")
  500. style = style | FontStyle.Underline;
  501. else if (styleChild.Name == "Color")
  502. textBoxForeColor = ColorTranslator.FromHtml(styleChild.InnerText);
  503. }
  504. if (fontFamily == string.Empty)
  505. fontFamily = defaultFontFamily;
  506. if (fontFamily == string.Empty && fontSize == 0)
  507. (component as TextObject).Font = new Font((component as TextObject).Font, style);
  508. else if (fontFamily == string.Empty)
  509. (component as TextObject).Font = new Font((component as TextObject).Font.FontFamily, fontSize, style);
  510. else if (fontSize == 0)
  511. (component as TextObject).Font = new Font(fontFamily, (component as TextObject).Font.Size, style);
  512. else
  513. (component as TextObject).Font = new Font(fontFamily, fontSize, style);
  514. (component as TextObject).TextColor = textBoxForeColor;
  515. }
  516. private string GetValue(string rdlValue)
  517. {
  518. //=Fields!VATIdentifierCaption.Value
  519. string frExpression = "[";
  520. if (!string.IsNullOrEmpty(rdlValue) && rdlValue[0] == '=') //is expression
  521. {
  522. if (rdlValue.IndexOf("Fields") == 1) //is sumple data source
  523. {
  524. frExpression += dataSetName + ".";
  525. int fieldStart = rdlValue.IndexOf("!") + 1;
  526. int fieldEnd = rdlValue.Substring(fieldStart).IndexOf(".") - 1;
  527. frExpression += rdlValue.Substring(fieldStart, fieldEnd + 1);
  528. frExpression += "]";
  529. return frExpression;
  530. }
  531. }
  532. return rdlValue;
  533. }
  534. private void LoadTextbox(XmlNode textboxNode)
  535. {
  536. if (parent is TableCell)
  537. component = (TableCell)parent;
  538. else
  539. component = ComponentsFactory.CreateTextObject(textboxNode.Attributes["Name"].Value, parent);
  540. XmlNodeList nodeList = textboxNode.ChildNodes;
  541. LoadReportItem(nodeList);
  542. foreach (XmlNode node in nodeList)
  543. {
  544. if (node.Name == "CanGrow")
  545. {
  546. (component as TextObject).CanGrow = UnitsConverter.BooleanToBool(node.InnerText);
  547. }
  548. else if (node.Name == "CanShrink")
  549. {
  550. (component as TextObject).CanShrink = UnitsConverter.BooleanToBool(node.InnerText);
  551. }
  552. else if (node.Name == "HideDuplicates")
  553. {
  554. (component as TextObject).Duplicates = Duplicates.Hide;
  555. }
  556. else if (node.Name == "Value")
  557. {
  558. (component as TextObject).Text = node.InnerText;
  559. }
  560. else if (node.Name == "Paragraphs")
  561. {
  562. LoadParagraphs(node);
  563. }
  564. }
  565. }
  566. private void LoadImage(XmlNode imageNode)
  567. {
  568. component = ComponentsFactory.CreatePictureObject(imageNode.Attributes["Name"].Value, parent);
  569. XmlNodeList nodeList = imageNode.ChildNodes;
  570. LoadReportItem(nodeList);
  571. string name = String.Empty;
  572. foreach (XmlNode node in nodeList)
  573. {
  574. //if (node.Name == "Source")
  575. //{
  576. //}
  577. /*else */
  578. if (node.Name == "Value")
  579. {
  580. if (File.Exists(node.InnerText))
  581. {
  582. (component as PictureObject).ImageLocation = node.InnerText;
  583. }
  584. }
  585. else if (node.Name == "Sizing")
  586. {
  587. (component as PictureObject).SizeMode = UnitsConverter.ConvertSizing(node.InnerText);
  588. }
  589. }
  590. }
  591. private void LoadSubreport(XmlNode subreportNode)
  592. {
  593. component = ComponentsFactory.CreateSubreportObject(subreportNode.Attributes["Name"].Value, parent);
  594. ReportPage subPage = ComponentsFactory.CreateReportPage(Report);
  595. (component as SubreportObject).ReportPage = subPage;
  596. XmlNodeList nodeList = subreportNode.ChildNodes;
  597. string path = Path.GetDirectoryName(filename);
  598. string reportName = String.Empty;
  599. foreach (XmlNode node in nodeList)
  600. {
  601. if (node.Name == "ReportName")
  602. reportName = node.InnerText;
  603. }
  604. string subFilename = Path.Combine(path, reportName + ".rdl");
  605. if (!File.Exists(subFilename))
  606. {
  607. subFilename = Path.Combine(path, reportName + ".rdlc");
  608. if (!File.Exists(subFilename))
  609. subFilename = String.Empty;
  610. }
  611. if (!String.IsNullOrEmpty(subFilename))
  612. {
  613. XmlDocument doc = new XmlDocument();
  614. doc.Load(subFilename);
  615. reportNode = doc.LastChild;
  616. ReportPage tempPage = page;
  617. page = subPage;
  618. LoadReport(reportNode);
  619. page = tempPage;
  620. }
  621. else
  622. {
  623. DataBand subBand = ComponentsFactory.CreateDataBand(subPage);
  624. subBand.Height = 2.0f * Utils.Units.Centimeters;
  625. LoadReportItem(nodeList);
  626. }
  627. }
  628. partial void LoadChart(XmlNode chartNode);
  629. private void LoadReportItems(XmlNode reportItemsNode)
  630. {
  631. XmlNodeList nodeList = reportItemsNode.ChildNodes;
  632. foreach (XmlNode node in nodeList)
  633. {
  634. if (node.Name == "Line")
  635. {
  636. LoadLine(node);
  637. }
  638. else if (node.Name == "Rectangle")
  639. {
  640. LoadRectangle(node);
  641. }
  642. else if (node.Name == "Textbox")
  643. {
  644. LoadTextbox(node);
  645. }
  646. else if (node.Name == "Image")
  647. {
  648. LoadImage(node);
  649. }
  650. else if (node.Name == "Subreport")
  651. {
  652. LoadSubreport(node);
  653. }
  654. else if (node.Name == "Chart")
  655. {
  656. LoadChart(node);
  657. }
  658. else if (node.Name == "Table" || (node.Name == "Tablix" && !IsTablixMatrix(node)))
  659. {
  660. LoadTable(node);
  661. }
  662. else if (node.Name == "Matrix" || (node.Name == "Tablix" && IsTablixMatrix(node)))
  663. {
  664. LoadMatrix(node);
  665. }
  666. }
  667. }
  668. private void LoadBody(XmlNode bodyNode)
  669. {
  670. parent = ComponentsFactory.CreateDataBand(page);
  671. curBand = (BandBase)parent;
  672. XmlNodeList nodeList = bodyNode.ChildNodes;
  673. foreach (XmlNode node in nodeList)
  674. {
  675. if (node.Name == "ReportItems")
  676. {
  677. LoadReportItems(node);
  678. }
  679. else if (node.Name == "Height")
  680. {
  681. (parent as DataBand).Height = UnitsConverter.SizeToPixels(node.InnerText);
  682. }
  683. }
  684. }
  685. private void LoadPageSection(XmlNode pageSectionNode)
  686. {
  687. if (pageSectionNode.Name == "PageHeader")
  688. {
  689. page.PageHeader = new PageHeaderBand();
  690. page.PageHeader.CreateUniqueName();
  691. page.PageHeader.PrintOn = PrintOn.EvenPages | PrintOn.OddPages | PrintOn.RepeatedBand;
  692. XmlNodeList nodeList = pageSectionNode.ChildNodes;
  693. foreach (XmlNode node in nodeList)
  694. {
  695. if (node.Name == "Height")
  696. {
  697. page.PageHeader.Height = UnitsConverter.SizeToPixels(node.InnerText);
  698. }
  699. else if (node.Name == "PrintOnFirstPage")
  700. {
  701. if (node.InnerText == "true")
  702. {
  703. page.PageHeader.PrintOn |= PrintOn.FirstPage;
  704. }
  705. }
  706. else if (node.Name == "PrintOnLastPage")
  707. {
  708. if (node.InnerText == "true")
  709. {
  710. page.PageHeader.PrintOn |= PrintOn.LastPage;
  711. }
  712. }
  713. else if (node.Name == "ReportItems")
  714. {
  715. parent = page.PageHeader;
  716. LoadReportItems(node);
  717. }
  718. }
  719. }
  720. else if (pageSectionNode.Name == "PageFooter")
  721. {
  722. page.PageFooter = new PageFooterBand();
  723. page.PageFooter.CreateUniqueName();
  724. page.PageFooter.PrintOn = PrintOn.EvenPages | PrintOn.OddPages | PrintOn.RepeatedBand;
  725. XmlNodeList nodeList = pageSectionNode.ChildNodes;
  726. foreach (XmlNode node in nodeList)
  727. {
  728. if (node.Name == "Height")
  729. {
  730. page.PageFooter.Height = UnitsConverter.SizeToPixels(node.InnerText);
  731. }
  732. else if (node.Name == "PrintOnFirstPage")
  733. {
  734. if (node.InnerText == "true")
  735. {
  736. page.PageFooter.PrintOn |= PrintOn.FirstPage;
  737. }
  738. }
  739. else if (node.Name == "PrintOnLastPage")
  740. {
  741. if (node.InnerText == "true")
  742. {
  743. page.PageFooter.PrintOn |= PrintOn.LastPage;
  744. }
  745. }
  746. else if (node.Name == "ReportItems")
  747. {
  748. parent = page.PageFooter;
  749. LoadReportItems(node);
  750. }
  751. }
  752. }
  753. }
  754. private void LoadPage(XmlNode pageNode)
  755. {
  756. XmlNodeList nodeList = pageNode.ChildNodes;
  757. bool pageWidthLoaded = false;
  758. foreach (XmlNode node in nodeList)
  759. {
  760. if (node.Name == "PageHeader")
  761. {
  762. LoadPageSection(node);
  763. }
  764. else if (node.Name == "PageFooter")
  765. {
  766. LoadPageSection(node);
  767. }
  768. else if (node.Name == "PageHeight")
  769. {
  770. page.PaperHeight = UnitsConverter.SizeToMillimeters(node.InnerText);
  771. }
  772. else if (node.Name == "PageWidth")
  773. {
  774. page.PaperWidth = UnitsConverter.SizeToMillimeters(node.InnerText);
  775. pageWidthLoaded = true;
  776. }
  777. else if (node.Name == "LeftMargin")
  778. {
  779. page.LeftMargin = UnitsConverter.SizeToMillimeters(node.InnerText);
  780. }
  781. else if (node.Name == "RightMargin")
  782. {
  783. page.RightMargin = UnitsConverter.SizeToMillimeters(node.InnerText);
  784. }
  785. else if (node.Name == "TopMargin")
  786. {
  787. page.TopMargin = UnitsConverter.SizeToMillimeters(node.InnerText);
  788. }
  789. else if (node.Name == "BottomMargin")
  790. {
  791. page.BottomMargin = UnitsConverter.SizeToMillimeters(node.InnerText);
  792. }
  793. else if (node.Name == "Style")
  794. {
  795. LoadStyle(node);
  796. }
  797. }
  798. if (!pageWidthLoaded && sectionWidth > 0)
  799. {
  800. page.PaperWidth = page.LeftMargin + sectionWidth + page.RightMargin;
  801. }
  802. }
  803. private void LoadParameters(XmlNode parametersNode)
  804. {
  805. foreach (XmlNode node in parametersNode.ChildNodes)
  806. {
  807. Parameter parameter = ComponentsFactory.CreateParameter(node.Attributes["Name"].Value, Report);
  808. foreach (XmlNode subNode in node.ChildNodes)
  809. {
  810. if (subNode.Name == "DataType")
  811. {
  812. Type type = Type.GetType("System." + subNode.InnerText);
  813. if (type != null)
  814. parameter.DataType = type;
  815. else if (subNode.InnerText == "Integer")
  816. parameter.DataType = typeof(Int32);
  817. else if (subNode.InnerText == "Float")
  818. parameter.DataType = typeof(float);
  819. }
  820. else if (subNode.Name == "Prompt")
  821. {
  822. parameter.Description = subNode.InnerText;
  823. }
  824. else if (subNode.Name == "DefaultValue")
  825. {
  826. }
  827. }
  828. }
  829. }
  830. private XmlNode GetEmbededImageNode(string objectName)
  831. {
  832. foreach (XmlNode node in reportNode.ChildNodes)
  833. {
  834. if (node.Name == "EmbeddedImages")
  835. {
  836. foreach (XmlNode embededImage in node.ChildNodes)
  837. {
  838. if (embededImage.Attributes[0].InnerText == objectName)
  839. return embededImage;
  840. }
  841. }
  842. }
  843. return null;
  844. }
  845. private void LoadReport(XmlNode reportNode)
  846. {
  847. int pageNbr = 0;
  848. XmlNodeList nodeList = reportNode.ChildNodes;
  849. foreach (XmlNode node in nodeList)
  850. {
  851. if (node.Name == "Description")
  852. {
  853. Report.ReportInfo.Description = node.InnerText;
  854. }
  855. else if (node.Name == "Author")
  856. {
  857. Report.ReportInfo.Author = node.InnerText;
  858. }
  859. else if (node.Name == "Body")
  860. {
  861. if (page == null)
  862. page = ComponentsFactory.CreateReportPage(Report);
  863. LoadBody(node);
  864. }
  865. else if (node.Name == "Page")
  866. {
  867. if (pageNbr > 0)
  868. page = ComponentsFactory.CreateReportPage(Report);
  869. LoadPage(node);
  870. pageNbr++;
  871. }
  872. else if (node.Name == "ReportSections")
  873. {
  874. if (node.HasChildNodes && node.FirstChild.Name == "ReportSection")
  875. foreach (XmlNode sectionItem in node.FirstChild)
  876. {
  877. if (sectionItem.Name == "Body")
  878. {
  879. if (page == null)
  880. page = ComponentsFactory.CreateReportPage(Report);
  881. LoadBody(sectionItem);
  882. }
  883. else if (sectionItem.Name == "Page")
  884. {
  885. if (pageNbr > 0)
  886. page = ComponentsFactory.CreateReportPage(Report);
  887. LoadPage(sectionItem);
  888. pageNbr++;
  889. }
  890. else if (sectionItem.Name == "Width")
  891. {
  892. sectionWidth = UnitsConverter.SizeToMillimeters(sectionItem.InnerText);
  893. }
  894. }
  895. }
  896. else if (node.Name == "df:DefaultFontFamily")
  897. {
  898. defaultFontFamily = node.InnerText;
  899. }
  900. else if (node.Name == "DataSets")
  901. {
  902. if (node.HasChildNodes)
  903. dataSetName = node.FirstChild.Attributes["Name"].Value;
  904. }
  905. else if (node.Name == "ReportParameters")
  906. {
  907. if (node.HasChildNodes)
  908. LoadParameters(node);
  909. }
  910. }
  911. if (page == null)
  912. {
  913. page = ComponentsFactory.CreateReportPage(Report);
  914. LoadPage(reportNode);
  915. }
  916. }
  917. #endregion // Private Methods
  918. #region Public Methods
  919. /// <inheritdoc/>
  920. public override void LoadReport(Report report, string filename)
  921. {
  922. this.filename = filename;
  923. using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
  924. {
  925. LoadReport(report, fs);
  926. }
  927. }
  928. /// <inheritdoc />
  929. public override void LoadReport(Report report, Stream content)
  930. {
  931. Report = report;
  932. Report.Clear();
  933. XmlDocument document = new XmlDocument();
  934. document.Load(content);
  935. reportNode = document.LastChild;
  936. defaultFontFamily = "";
  937. page = null;
  938. LoadReport(reportNode);
  939. }
  940. #endregion // Public Methods
  941. }
  942. }