ConfigureBandsForm.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. using FastReport.Utils;
  5. using FastReport.Design;
  6. namespace FastReport.Forms
  7. {
  8. internal partial class ConfigureBandsForm : BaseDialogForm
  9. {
  10. private Designer designer;
  11. private ReportPage page;
  12. private BandBase lastSelectedBand;
  13. public ReportPage Page
  14. {
  15. get { return page; }
  16. set
  17. {
  18. page = value;
  19. UpdateBands();
  20. }
  21. }
  22. private TreeNodeCollection AddBand(BandBase band, TreeNodeCollection nodes)
  23. {
  24. if (band != null)
  25. {
  26. ObjectInfo info = RegisteredObjects.FindObject(band);
  27. string infoText = Res.Get(info.Text);
  28. infoText += ": " + band.Name;
  29. if (band is DataBand || band is GroupHeaderBand)
  30. {
  31. if (!String.IsNullOrEmpty(band.GetInfoText()))
  32. infoText += " (" + band.GetInfoText() + ")";
  33. }
  34. TreeNode node = nodes.Add(infoText);
  35. int imageIndex = info.ImageIndex;
  36. node.ImageIndex = imageIndex;
  37. node.SelectedImageIndex = imageIndex;
  38. node.Tag = band;
  39. if (band == lastSelectedBand)
  40. tvBands.SelectedNode = node;
  41. AddBand(band.Child, node.Nodes);
  42. return node.Nodes;
  43. }
  44. return null;
  45. }
  46. private void EnumDataBand(DataBand band, TreeNodeCollection nodes)
  47. {
  48. if (band == null)
  49. return;
  50. AddBand(band.Header, nodes);
  51. TreeNodeCollection dataNodes = AddBand(band, nodes);
  52. foreach (BandBase b in band.Bands)
  53. {
  54. EnumBand(b, dataNodes);
  55. }
  56. AddBand(band.Footer, nodes);
  57. }
  58. private void EnumGroupHeaderBand(GroupHeaderBand band, TreeNodeCollection nodes)
  59. {
  60. if (band == null)
  61. return;
  62. AddBand(band.Header, nodes);
  63. TreeNodeCollection groupNodes = AddBand(band, nodes);
  64. EnumGroupHeaderBand(band.NestedGroup, groupNodes);
  65. EnumDataBand(band.Data, groupNodes);
  66. AddBand(band.GroupFooter, nodes);
  67. AddBand(band.Footer, nodes);
  68. }
  69. private void EnumBand(BandBase band, TreeNodeCollection nodes)
  70. {
  71. if (band is DataBand)
  72. EnumDataBand(band as DataBand, nodes);
  73. else if (band is GroupHeaderBand)
  74. EnumGroupHeaderBand(band as GroupHeaderBand, nodes);
  75. }
  76. private void EnumBands(TreeNodeCollection nodes)
  77. {
  78. if (Page.TitleBeforeHeader)
  79. {
  80. AddBand(Page.ReportTitle, nodes);
  81. AddBand(Page.PageHeader, nodes);
  82. }
  83. else
  84. {
  85. AddBand(Page.PageHeader, nodes);
  86. AddBand(Page.ReportTitle, nodes);
  87. }
  88. AddBand(Page.ColumnHeader, nodes);
  89. foreach (BandBase b in Page.Bands)
  90. {
  91. EnumBand(b, nodes);
  92. }
  93. AddBand(Page.ColumnFooter, nodes);
  94. AddBand(Page.ReportSummary, nodes);
  95. AddBand(Page.PageFooter, nodes);
  96. AddBand(Page.Overlay, nodes);
  97. }
  98. private void SetDefaults(BandBase band)
  99. {
  100. band.CreateUniqueName();
  101. band.Height = band.GetPreferredSize().Height;
  102. }
  103. private void Change()
  104. {
  105. UpdateBands();
  106. UpdateControls();
  107. designer.SetModified(null, "ChangeReport");
  108. }
  109. private void btnAdd_Click(object sender, EventArgs e)
  110. {
  111. miDelete.Visible = false;
  112. sep1.Visible = false;
  113. mnuBands.Show(btnAdd.PointToScreen(new Point(0, btnAdd.Height)));
  114. }
  115. private void btnDelete_Click(object sender, EventArgs e)
  116. {
  117. BandBase band = tvBands.SelectedNode.Tag as BandBase;
  118. band.Delete();
  119. tvBands.SelectedNode = tvBands.SelectedNode.NextVisibleNode;
  120. Change();
  121. }
  122. private void btnUp_Click(object sender, EventArgs e)
  123. {
  124. BandBase band = tvBands.SelectedNode.Tag as BandBase;
  125. if (band.Parent == Page || band is DataBand)
  126. band.ZOrder--;
  127. else if (band is ChildBand && band.Parent is ChildBand)
  128. {
  129. ChildBand parent = band.Parent as ChildBand;
  130. BandBase newParent = parent.Parent as BandBase;
  131. parent.Parent = null;
  132. band.Parent = newParent;
  133. parent.Child = band.Child;
  134. band.Child = parent;
  135. }
  136. else if (band is GroupHeaderBand && band.Parent is GroupHeaderBand)
  137. {
  138. GroupHeaderBand group = band as GroupHeaderBand;
  139. GroupHeaderBand parent = band.Parent as GroupHeaderBand;
  140. Base newParent = parent.Parent;
  141. BandBase child = null;
  142. if (group.Data != null)
  143. child = group.Data;
  144. else
  145. child = group.NestedGroup;
  146. int zOrder = parent.ZOrder;
  147. parent.Parent = null;
  148. group.Parent = newParent;
  149. group.ZOrder = zOrder;
  150. child.Parent = parent;
  151. parent.Parent = group;
  152. }
  153. Change();
  154. }
  155. private void btnDown_Click(object sender, EventArgs e)
  156. {
  157. BandBase band = tvBands.SelectedNode.Tag as BandBase;
  158. if (band.Parent == Page || band is DataBand)
  159. band.ZOrder += 2;
  160. else if (band is ChildBand && band.Child != null)
  161. {
  162. BandBase parent = band.Parent as BandBase;
  163. ChildBand child = band.Child;
  164. band.Parent = null;
  165. child.Parent = parent;
  166. band.Child = child.Child;
  167. band.Parent = child;
  168. }
  169. else if (band is GroupHeaderBand && (band as GroupHeaderBand).NestedGroup != null)
  170. {
  171. GroupHeaderBand group = band as GroupHeaderBand;
  172. Base parent = band.Parent;
  173. GroupHeaderBand child = group.NestedGroup;
  174. int zOrder = group.ZOrder;
  175. group.Parent = null;
  176. child.Parent = parent;
  177. child.ZOrder = zOrder;
  178. if (child.Data != null)
  179. group.Data = child.Data;
  180. else
  181. group.NestedGroup = child.NestedGroup;
  182. group.Parent = child;
  183. }
  184. Change();
  185. }
  186. private void tvBands_AfterSelect(object sender, TreeViewEventArgs e)
  187. {
  188. UpdateControls();
  189. }
  190. private void tvBands_MouseDown(object sender, MouseEventArgs e)
  191. {
  192. tvBands.SelectedNode = tvBands.GetNodeAt(e.Location);
  193. UpdateControls();
  194. }
  195. private void tvBands_MouseUp(object sender, MouseEventArgs e)
  196. {
  197. if (e.Button == MouseButtons.Right)
  198. {
  199. miDelete.Visible = true;
  200. sep1.Visible = true;
  201. mnuBands.Show(tvBands.PointToScreen(e.Location));
  202. }
  203. }
  204. private void miPageHeader_Click(object sender, EventArgs e)
  205. {
  206. Page.PageHeader = new PageHeaderBand();
  207. SetDefaults(Page.PageHeader);
  208. Change();
  209. }
  210. private void miReportTitle_Click(object sender, EventArgs e)
  211. {
  212. Page.ReportTitle = new ReportTitleBand();
  213. SetDefaults(Page.ReportTitle);
  214. Change();
  215. }
  216. private void miColumnHeader_Click(object sender, EventArgs e)
  217. {
  218. Page.ColumnHeader = new ColumnHeaderBand();
  219. SetDefaults(Page.ColumnHeader);
  220. Change();
  221. }
  222. private void miDataHeader_Click(object sender, EventArgs e)
  223. {
  224. if (tvBands.SelectedNode.Tag is DataBand)
  225. {
  226. DataBand data = tvBands.SelectedNode.Tag as DataBand;
  227. data.Header = new DataHeaderBand();
  228. SetDefaults(data.Header);
  229. }
  230. else if (tvBands.SelectedNode.Tag is GroupHeaderBand)
  231. {
  232. GroupHeaderBand group = tvBands.SelectedNode.Tag as GroupHeaderBand;
  233. group.Header = new DataHeaderBand();
  234. SetDefaults(group.Header);
  235. }
  236. Change();
  237. }
  238. private void miData_Click(object sender, EventArgs e)
  239. {
  240. BandBase band = tvBands.SelectedNode != null ? tvBands.SelectedNode.Tag as BandBase : null;
  241. DataBand newBand = new DataBand();
  242. if (band is DataBand)
  243. (band as DataBand).Bands.Add(newBand);
  244. else
  245. Page.Bands.Add(newBand);
  246. SetDefaults(newBand);
  247. Change();
  248. }
  249. private void miGroup_Click(object sender, EventArgs e)
  250. {
  251. BandBase band = tvBands.SelectedNode != null ? tvBands.SelectedNode.Tag as BandBase : null;
  252. GroupHeaderBand group = new GroupHeaderBand();
  253. // if we select something other than databand or a group, add a group to the first page databand.
  254. if (!(band is DataBand) && !(band is GroupHeaderBand))
  255. {
  256. foreach (BandBase b in Page.Bands)
  257. {
  258. if (b is DataBand)
  259. {
  260. band = b;
  261. break;
  262. }
  263. }
  264. }
  265. if (band is GroupHeaderBand)
  266. {
  267. GroupHeaderBand parent = band as GroupHeaderBand;
  268. if (parent.Data != null)
  269. {
  270. group.Data = parent.Data;
  271. parent.NestedGroup = group;
  272. }
  273. else if (parent.NestedGroup != null)
  274. {
  275. group.NestedGroup = parent.NestedGroup;
  276. parent.NestedGroup = group;
  277. }
  278. }
  279. else if (band is DataBand)
  280. {
  281. if (band.Parent is GroupHeaderBand)
  282. {
  283. GroupHeaderBand parent = band.Parent as GroupHeaderBand;
  284. group.Data = band as DataBand;
  285. parent.NestedGroup = group;
  286. }
  287. else
  288. {
  289. int zOrder = band.ZOrder;
  290. Base parent = band.Parent;
  291. group.Data = band as DataBand;
  292. group.Parent = parent;
  293. group.ZOrder = zOrder;
  294. }
  295. }
  296. else
  297. {
  298. Page.Bands.Add(group);
  299. group.Data = new DataBand();
  300. SetDefaults(group.Data);
  301. }
  302. SetDefaults(group);
  303. group.GroupFooter = new GroupFooterBand();
  304. SetDefaults(group.GroupFooter);
  305. Change();
  306. }
  307. private void miChild_Click(object sender, EventArgs e)
  308. {
  309. BandBase band = tvBands.SelectedNode.Tag as BandBase;
  310. band.Child = new ChildBand();
  311. SetDefaults(band.Child);
  312. Change();
  313. }
  314. private void miDataFooter_Click(object sender, EventArgs e)
  315. {
  316. if (tvBands.SelectedNode.Tag is DataBand)
  317. {
  318. DataBand data = tvBands.SelectedNode.Tag as DataBand;
  319. data.Footer = new DataFooterBand();
  320. SetDefaults(data.Footer);
  321. }
  322. else if (tvBands.SelectedNode.Tag is GroupHeaderBand)
  323. {
  324. GroupHeaderBand group = tvBands.SelectedNode.Tag as GroupHeaderBand;
  325. group.Footer = new DataFooterBand();
  326. SetDefaults(group.Footer);
  327. }
  328. Change();
  329. }
  330. private void miGroupFooter_Click(object sender, EventArgs e)
  331. {
  332. GroupHeaderBand groupHeader = tvBands.SelectedNode.Tag as GroupHeaderBand;
  333. groupHeader.GroupFooter = new GroupFooterBand();
  334. SetDefaults(groupHeader.GroupFooter);
  335. Change();
  336. }
  337. private void miColumnFooter_Click(object sender, EventArgs e)
  338. {
  339. Page.ColumnFooter = new ColumnFooterBand();
  340. SetDefaults(Page.ColumnFooter);
  341. Change();
  342. }
  343. private void miReportSummary_Click(object sender, EventArgs e)
  344. {
  345. Page.ReportSummary = new ReportSummaryBand();
  346. SetDefaults(Page.ReportSummary);
  347. Change();
  348. }
  349. private void miPageFooter_Click(object sender, EventArgs e)
  350. {
  351. Page.PageFooter = new PageFooterBand();
  352. SetDefaults(Page.PageFooter);
  353. Change();
  354. }
  355. private void miOverlay_Click(object sender, EventArgs e)
  356. {
  357. Page.Overlay = new OverlayBand();
  358. SetDefaults(Page.Overlay);
  359. Change();
  360. }
  361. private void UpdateBands()
  362. {
  363. lastSelectedBand = tvBands.SelectedNode != null ? tvBands.SelectedNode.Tag as BandBase : null;
  364. tvBands.BeginUpdate();
  365. tvBands.Nodes.Clear();
  366. EnumBands(tvBands.Nodes);
  367. tvBands.ExpandAll();
  368. tvBands.EndUpdate();
  369. if (lastSelectedBand == null && tvBands.Nodes.Count > 0)
  370. tvBands.SelectedNode = tvBands.Nodes[0];
  371. }
  372. private void UpdateControls()
  373. {
  374. BandBase selected = tvBands.SelectedNode != null ? tvBands.SelectedNode.Tag as BandBase : null;
  375. bool isSubreport = Page.Subreport != null;
  376. miPageHeader.Enabled = Page.PageHeader == null && !isSubreport;
  377. miReportTitle.Enabled = Page.ReportTitle == null && !isSubreport;
  378. miColumnHeader.Enabled = Page.ColumnHeader == null && !isSubreport;
  379. miDataHeader.Enabled = (selected is DataBand && (selected as DataBand).Header == null) ||
  380. (selected is GroupHeaderBand && (selected as GroupHeaderBand).Header == null);
  381. miDataFooter.Enabled = (selected is DataBand && (selected as DataBand).Footer == null) ||
  382. (selected is GroupHeaderBand && (selected as GroupHeaderBand).Footer == null);
  383. miGroupFooter.Enabled = selected is GroupHeaderBand && (selected as GroupHeaderBand).GroupFooter == null;
  384. miColumnFooter.Enabled = Page.ColumnFooter == null && !isSubreport;
  385. miReportSummary.Enabled = Page.ReportSummary == null && !isSubreport;
  386. miPageFooter.Enabled = Page.PageFooter == null && !isSubreport;
  387. miChild.Enabled = selected != null && selected.Child == null;
  388. miOverlay.Enabled = Page.Overlay == null && !isSubreport;
  389. btnUp.Enabled = selected is GroupHeaderBand || selected is DataBand || selected is ChildBand;
  390. btnDown.Enabled = btnUp.Enabled;
  391. btnDelete.Enabled = selected != null && !(selected is DataBand && selected.Parent is GroupHeaderBand);
  392. miDelete.Enabled = btnDelete.Enabled;
  393. designer.CancelPaste();
  394. designer.SelectedObjects.Clear();
  395. designer.SelectedObjects.Add(selected);
  396. designer.SelectionChanged(null);
  397. }
  398. private void ConfigureBandsForm_FormClosing(object sender, FormClosingEventArgs e)
  399. {
  400. Config.SaveFormState(this);
  401. }
  402. public override void Localize()
  403. {
  404. base.Localize();
  405. MyRes res = new MyRes("Forms,ConfigureBands");
  406. MyRes res1 = new MyRes("Objects,Bands");
  407. Text = res.Get("");
  408. btnAdd.Text = res.Get("Add");
  409. btnDelete.Text = res.Get("Delete");
  410. btnOk.Text = Res.Get("Buttons,Close");
  411. miDelete.Text = res.Get("Delete");
  412. miPageHeader.Text = res1.Get("PageHeader");
  413. miReportTitle.Text = res1.Get("ReportTitle");
  414. miColumnHeader.Text = res1.Get("ColumnHeader");
  415. miDataHeader.Text = res1.Get("DataHeader");
  416. miData.Text = res1.Get("Data");
  417. miGroup.Text = res1.Get("GroupHeader");
  418. miDataFooter.Text = res1.Get("DataFooter");
  419. miGroupFooter.Text = res1.Get("GroupFooter");
  420. miColumnFooter.Text = res1.Get("ColumnFooter");
  421. miReportSummary.Text = res1.Get("ReportSummary");
  422. miPageFooter.Text = res1.Get("PageFooter");
  423. miChild.Text = res1.Get("Child");
  424. miOverlay.Text = res1.Get("Overlay");
  425. }
  426. public override void UpdateDpiDependencies()
  427. {
  428. base.UpdateDpiDependencies();
  429. tvBands.ImageList = GetImages();
  430. mnuBands.Font = Font;
  431. miDelete.Image = GetImage(51);
  432. btnUp.Image = GetImage(208);
  433. btnDown.Image = GetImage(209);
  434. miPageHeader.Image = GetImage(156);
  435. miReportTitle.Image = GetImage(154);
  436. miColumnHeader.Image = GetImage(158);
  437. miDataHeader.Image = GetImage(160);
  438. miData.Image = GetImage(162);
  439. miGroup.Image = GetImage(163);
  440. miDataFooter.Image = GetImage(161);
  441. miGroupFooter.Image = GetImage(164);
  442. miColumnFooter.Image = GetImage(159);
  443. miReportSummary.Image = GetImage(155);
  444. miPageFooter.Image = GetImage(157);
  445. miChild.Image = GetImage(165);
  446. miOverlay.Image = GetImage(166);
  447. MinimumSize = this.LogicalToDevice(new Size(380, 300));
  448. }
  449. public ConfigureBandsForm(Designer designer)
  450. {
  451. this.designer = designer;
  452. InitializeComponent();
  453. Localize();
  454. mnuBands.Renderer = Config.DesignerSettings.ToolStripRenderer;
  455. Config.RestoreFormState(this);
  456. UIUtils.CheckRTL(this);
  457. UpdateDpiDependencies();
  458. }
  459. }
  460. }