StandardReportWizardForm.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using FastReport.Utils;
  9. using FastReport.Data;
  10. using FastReport.Design.PageDesigners.Page;
  11. namespace FastReport.Forms
  12. {
  13. internal partial class StandardReportWizardForm : BaseReportWizardForm
  14. {
  15. private Report sampleReportTabular;
  16. private Report sampleReportColumnar;
  17. private Report sampleStyleReport;
  18. private StyleSheet styleSheet;
  19. #region "Create Groups" page
  20. private List<Column> Groups
  21. {
  22. get
  23. {
  24. List<Column> groups = new List<Column>();
  25. foreach (ListViewItem item in lvGroups.Items)
  26. {
  27. groups.Add(item.Tag as Column);
  28. }
  29. return groups;
  30. }
  31. }
  32. public override void ColumnsChanged()
  33. {
  34. base.ColumnsChanged();
  35. UpdateGroups();
  36. }
  37. private void UpdateGroups()
  38. {
  39. lvAvailableColumns1.Items.Clear();
  40. lvGroups.Items.Clear();
  41. foreach (Column column in SelectedColumns)
  42. {
  43. ListViewItem item = lvAvailableColumns1.Items.Add(column.Alias, column.GetImageIndex());
  44. item.Tag = column;
  45. }
  46. if (lvAvailableColumns1.Items.Count > 0)
  47. lvAvailableColumns1.Items[0].Selected = true;
  48. UpdateGroupControls();
  49. }
  50. private void UpdateGroupControls()
  51. {
  52. btnAddGroup.Enabled = lvAvailableColumns1.SelectedItems.Count > 0;
  53. btnRemoveGroup.Enabled = lvGroups.SelectedItems.Count > 0;
  54. bool reorderEnabled = lvGroups.SelectedItems.Count == 1;
  55. btnGroupUp.Enabled = reorderEnabled;
  56. btnGroupDown.Enabled = reorderEnabled;
  57. if (reorderEnabled)
  58. {
  59. if (lvGroups.SelectedIndices[0] == 0)
  60. btnGroupUp.Enabled = false;
  61. if (lvGroups.SelectedIndices[0] == lvGroups.Items.Count - 1)
  62. btnGroupDown.Enabled = false;
  63. }
  64. }
  65. private void lvAvailableColumns1_SelectedIndexChanged(object sender, EventArgs e)
  66. {
  67. UpdateGroupControls();
  68. }
  69. private void lvGroups_SelectedIndexChanged(object sender, EventArgs e)
  70. {
  71. UpdateGroupControls();
  72. }
  73. private void btnAddGroup_Click(object sender, EventArgs e)
  74. {
  75. int index = 0;
  76. while (lvAvailableColumns1.SelectedItems.Count > 0)
  77. {
  78. ListViewItem item = lvAvailableColumns1.SelectedItems[0];
  79. index = item.Index;
  80. lvAvailableColumns1.Items.Remove(item);
  81. lvGroups.Items.Add(item);
  82. item.Selected = false;
  83. }
  84. if (index >= lvAvailableColumns1.Items.Count)
  85. index = lvAvailableColumns1.Items.Count - 1;
  86. if (index < 0)
  87. index = 0;
  88. if (index < lvAvailableColumns1.Items.Count)
  89. lvAvailableColumns1.Items[index].Selected = true;
  90. UpdateGroupControls();
  91. }
  92. private void btnRemoveGroup_Click(object sender, EventArgs e)
  93. {
  94. int index = 0;
  95. while (lvGroups.SelectedItems.Count > 0)
  96. {
  97. ListViewItem item = lvGroups.SelectedItems[0];
  98. index = item.Index;
  99. lvGroups.Items.Remove(item);
  100. lvAvailableColumns1.Items.Add(item);
  101. item.Selected = false;
  102. }
  103. if (index >= lvGroups.Items.Count)
  104. index = lvGroups.Items.Count - 1;
  105. if (index < 0)
  106. index = 0;
  107. if (index < lvGroups.Items.Count)
  108. lvGroups.Items[index].Selected = true;
  109. UpdateGroupControls();
  110. }
  111. private void btnGroupUp_Click(object sender, EventArgs e)
  112. {
  113. ListViewItem item = lvGroups.SelectedItems[0];
  114. int index = item.Index;
  115. lvGroups.Items.Remove(item);
  116. lvGroups.Items.Insert(index - 1, item);
  117. item.Selected = true;
  118. UpdateGroupControls();
  119. }
  120. private void btnGroupDown_Click(object sender, EventArgs e)
  121. {
  122. ListViewItem item = lvGroups.SelectedItems[0];
  123. int index = item.Index;
  124. lvGroups.Items.Remove(item);
  125. lvGroups.Items.Insert(index + 1, item);
  126. item.Selected = true;
  127. UpdateGroupControls();
  128. }
  129. #endregion
  130. #region "Layout" page
  131. private void InitSampleReports()
  132. {
  133. sampleReportTabular = new Report();
  134. sampleReportTabular.Load(ResourceLoader.GetStream("samplereporttabular.frx"));
  135. sampleReportColumnar = new Report();
  136. sampleReportColumnar.Load(ResourceLoader.GetStream("samplereportcolumnar.frx"));
  137. UpdateReportSample();
  138. }
  139. private void UpdateReportSample()
  140. {
  141. pnPreview.Report = rbTabular.Checked ? sampleReportTabular : sampleReportColumnar;
  142. }
  143. private void rbTabular_CheckedChanged(object sender, EventArgs e)
  144. {
  145. UpdateReportSample();
  146. }
  147. #endregion
  148. #region "Style" page
  149. private void InitStyles()
  150. {
  151. styleSheet = new StyleSheet();
  152. styleSheet.Load(ResourceLoader.GetStream("reportstyles.frss"));
  153. sampleStyleReport = new Report();
  154. sampleStyleReport.Load(ResourceLoader.GetStream("samplestylereport.frx"));
  155. // localize stylesheet names
  156. MyRes res = new MyRes("Forms,StandardReportWizard,Styles");
  157. foreach (StyleCollection s in styleSheet)
  158. {
  159. s.Name = res.Get(s.Name);
  160. }
  161. lbStyles.Items.AddRange(styleSheet.ToArray());
  162. if (lbStyles.Items.Count > 0)
  163. lbStyles.SelectedIndex = 0;
  164. }
  165. private void UpdateStyleSample()
  166. {
  167. if (lbStyles.SelectedIndex != -1)
  168. {
  169. StyleCollection style = styleSheet[styleSheet.IndexOf((string)lbStyles.SelectedItem)];
  170. sampleStyleReport.Styles = style;
  171. sampleStyleReport.ApplyStyles();
  172. }
  173. pnStylePreview.FullPagePreview = true;
  174. pnStylePreview.Report = sampleStyleReport;
  175. }
  176. private void lbStyles_SelectedIndexChanged(object sender, EventArgs e)
  177. {
  178. UpdateStyleSample();
  179. }
  180. #endregion
  181. #region Create the report
  182. private void btnFinish_Click(object sender, EventArgs e)
  183. {
  184. CreateReport();
  185. DialogResult = System.Windows.Forms.DialogResult.OK;
  186. }
  187. private void CreateReport()
  188. {
  189. // disable all datasources, enable selected only
  190. foreach (Base c in Report.Dictionary.AllObjects)
  191. {
  192. if (c is DataSourceBase && c != DataSource)
  193. (c as DataSourceBase).Enabled = false;
  194. }
  195. // create page layout
  196. // by default, empty report contains the following bands: ReportTitle, PageHeader, Data, PageFooter
  197. ReportPage page = Report.Pages[0] as ReportPage;
  198. page.Landscape = rbLandscape.Checked;
  199. float pageWidth = (page.PaperWidth - page.LeftMargin - page.RightMargin) * Units.Millimeters;
  200. float snapSize = ReportWorkspace.Grid.SnapSize;
  201. float defaultHeight = page.IsImperialUnitsUsed ? Units.Inches * 0.2f : Units.Millimeters * 5;
  202. // styles
  203. MyRes res = new MyRes("Forms,StandardReportWizard,Styles");
  204. if (lbStyles.SelectedIndex != -1)
  205. {
  206. StyleCollection style = styleSheet[styleSheet.IndexOf((string)lbStyles.SelectedItem)];
  207. styleSheet.Remove(style);
  208. sampleStyleReport.Styles = new StyleCollection();
  209. Report.Styles = style;
  210. // localize style names, fix fonts
  211. foreach (Style s in style)
  212. {
  213. s.Name = res.Get(s.Name);
  214. s.Font = new Font(DrawUtils.DefaultReportFont.Name, s.Font.Size, s.Font.Style);
  215. }
  216. }
  217. // title
  218. TextObject title = new TextObject();
  219. title.Parent = page.ReportTitle;
  220. title.CreateUniqueName();
  221. title.Dock = DockStyle.Fill;
  222. title.HorzAlign = HorzAlign.Center;
  223. title.VertAlign = VertAlign.Center;
  224. title.Text = DataSource.Alias;
  225. title.Style = res.Get("Title");
  226. // data and header
  227. List<Column> selectedColumns = SelectedColumns;
  228. DataBand dataBand = page.Bands[0] as DataBand;
  229. dataBand.DataSource = DataSource;
  230. if (rbTabular.Checked)
  231. {
  232. float[] columnWidths = new float[selectedColumns.Count];
  233. float columnWidth = pageWidth / selectedColumns.Count;
  234. // try fit to grid
  235. columnWidth = (int)(columnWidth / snapSize) * snapSize;
  236. for (int i = 0; i < selectedColumns.Count; i++)
  237. {
  238. columnWidths[i] = columnWidth;
  239. }
  240. // compensate column widths to fit pagewidth
  241. float extraWidth = pageWidth - columnWidth * selectedColumns.Count;
  242. for (int i = 0; i < selectedColumns.Count; i++)
  243. {
  244. if (extraWidth - snapSize < 0)
  245. break;
  246. columnWidths[i] += snapSize;
  247. extraWidth -= snapSize;
  248. }
  249. // create data and header
  250. float offsetX = 0;
  251. for (int i = 0; i < selectedColumns.Count; i++)
  252. {
  253. TextObject dataColumn = new TextObject();
  254. dataColumn.Parent = dataBand;
  255. dataColumn.CreateUniqueName();
  256. dataColumn.Bounds = new RectangleF(offsetX, 0, columnWidths[i], defaultHeight);
  257. dataColumn.Text = "[" + DataSource.Alias + "." + selectedColumns[i].Alias + "]";
  258. dataColumn.Style = res.Get("Data");
  259. TextObject headerColumn = new TextObject();
  260. headerColumn.Parent = page.PageHeader;
  261. headerColumn.CreateUniqueName();
  262. headerColumn.Bounds = new RectangleF(offsetX, 0, columnWidths[i], defaultHeight);
  263. headerColumn.Text = selectedColumns[i].Alias;
  264. headerColumn.Style = res.Get("Header");
  265. offsetX += columnWidths[i];
  266. }
  267. dataBand.Height = defaultHeight;
  268. dataBand.EvenStyle = res.Get("EvenRows");
  269. page.PageHeader.Height = defaultHeight + snapSize;
  270. }
  271. else
  272. {
  273. page.PageHeader = null;
  274. // calculate max header width
  275. float headerWidth = 0;
  276. using (TextObject tempHeader = new TextObject())
  277. {
  278. tempHeader.Parent = dataBand;
  279. tempHeader.Style = res.Get("Header");
  280. for (int i = 0; i < selectedColumns.Count; i++)
  281. {
  282. tempHeader.Text = selectedColumns[i].Alias;
  283. float width = (int)(tempHeader.CalcWidth() / snapSize + 1) * snapSize;
  284. if (width > headerWidth)
  285. headerWidth = width;
  286. }
  287. }
  288. // create data and header
  289. float dataWidth = (int)((pageWidth - headerWidth) / snapSize) * snapSize;
  290. float offsetY = 0;
  291. for (int i = 0; i < selectedColumns.Count; i++)
  292. {
  293. TextObject headerColumn = new TextObject();
  294. headerColumn.Parent = dataBand;
  295. headerColumn.CreateUniqueName();
  296. headerColumn.Bounds = new RectangleF(0, offsetY, headerWidth, defaultHeight);
  297. headerColumn.Text = selectedColumns[i].Alias;
  298. headerColumn.Style = res.Get("Header");
  299. TextObject dataColumn = new TextObject();
  300. dataColumn.Parent = dataBand;
  301. dataColumn.CreateUniqueName();
  302. dataColumn.Bounds = new RectangleF(headerWidth, offsetY, dataWidth, defaultHeight);
  303. dataColumn.Text = "[" + DataSource.Alias + "." + selectedColumns[i].Alias + "]";
  304. dataColumn.Style = res.Get("Data");
  305. offsetY += defaultHeight;
  306. }
  307. dataBand.Height = offsetY + snapSize;
  308. }
  309. // groups
  310. if (Groups.Count > 0)
  311. {
  312. // create group headers
  313. Base parent = page;
  314. foreach (Column column in Groups)
  315. {
  316. GroupHeaderBand groupHeader = new GroupHeaderBand();
  317. groupHeader.Parent = parent;
  318. groupHeader.CreateUniqueName();
  319. groupHeader.Height = defaultHeight;
  320. groupHeader.Condition = "[" + DataSource.Alias + "." + column.Alias + "]";
  321. groupHeader.GroupFooter = new GroupFooterBand();
  322. groupHeader.GroupFooter.CreateUniqueName();
  323. groupHeader.GroupFooter.Height = defaultHeight;
  324. TextObject groupText = new TextObject();
  325. groupText.Parent = groupHeader;
  326. groupText.CreateUniqueName();
  327. groupText.Dock = DockStyle.Fill;
  328. groupText.Text = groupHeader.Condition;
  329. groupText.Style = res.Get("Group");
  330. parent = groupHeader;
  331. }
  332. // connect last header to the data
  333. (parent as GroupHeaderBand).Data = dataBand;
  334. }
  335. // page footer
  336. TextObject pageN = new TextObject();
  337. pageN.Parent = page.PageFooter;
  338. pageN.CreateUniqueName();
  339. pageN.Dock = DockStyle.Fill;
  340. pageN.HorzAlign = HorzAlign.Right;
  341. pageN.Text = "[PageN]";
  342. pageN.Style = res.Get("Footer");
  343. page.PageFooter.Height = defaultHeight;
  344. // tell the designer to reflect changes
  345. Report.Designer.SetModified(null, "ChangeReport");
  346. }
  347. #endregion
  348. private void StandardReportWizardForm_FormClosed(object sender, FormClosedEventArgs e)
  349. {
  350. Done();
  351. }
  352. public override void InitWizard(Report report)
  353. {
  354. base.InitWizard(report);
  355. // mono fix #3194
  356. btnFinish.DialogResult = System.Windows.Forms.DialogResult.None;
  357. InitSampleReports();
  358. InitStyles();
  359. }
  360. private void Done()
  361. {
  362. sampleReportColumnar.Dispose();
  363. sampleReportTabular.Dispose();
  364. sampleStyleReport.Dispose();
  365. }
  366. public override void Localize()
  367. {
  368. base.Localize();
  369. MyRes res = new MyRes("Forms,StandardReportWizard");
  370. Text = res.Get("");
  371. panGroups.Text = res.Get("GroupsPage");
  372. lblCreateGroups.Text = res.Get("CreateGroups");
  373. lblAvailableColumns1.Text = Res.Get("Forms,BaseReportWizard,AvailableColumns");
  374. lblGroups.Text = res.Get("Groups");
  375. panLayout.Text = res.Get("LayoutPage");
  376. lblLayout.Text = res.Get("DefineLayout");
  377. gbOrientation.Text = res.Get("Orientation");
  378. rbPortrait.Text = res.Get("Portrait");
  379. rbLandscape.Text = res.Get("Landscape");
  380. gbLayout.Text = res.Get("Layout");
  381. rbTabular.Text = res.Get("Tabular");
  382. rbColumnar.Text = res.Get("Columnar");
  383. panStyle.Text = res.Get("StylePage");
  384. lblStyles.Text = res.Get("Styles");
  385. }
  386. public override void UpdateDpiDependencies()
  387. {
  388. base.UpdateDpiDependencies();
  389. lvAvailableColumns1.SmallImageList = GetImages();
  390. lvGroups.SmallImageList = GetImages();
  391. btnGroupUp.Image = GetImage(208);
  392. btnGroupDown.Image = GetImage(209);
  393. picIcon.Image = GetImage("Images.ReportWizard.png");
  394. }
  395. public StandardReportWizardForm()
  396. {
  397. InitializeComponent();
  398. Localize();
  399. UIUtils.CheckRTL(this);
  400. UpdateDpiDependencies();
  401. }
  402. }
  403. }