PageSetupForm.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. using System.Drawing.Printing;
  5. using FastReport.Utils;
  6. using FastReport.TypeConverters;
  7. namespace FastReport.Forms
  8. {
  9. internal partial class PageSetupForm : BaseDialogForm
  10. {
  11. private PrinterSettings printerSettings;
  12. private ReportPage page;
  13. private bool updating;
  14. private Watermark watermark;
  15. public ReportPage Page
  16. {
  17. get { return page; }
  18. set
  19. {
  20. page = value;
  21. watermark = page.Watermark.Clone();
  22. UpdateControls();
  23. }
  24. }
  25. private bool Equal(float a, float b)
  26. {
  27. return Math.Abs(a - b) < 2;
  28. }
  29. private bool PaperSizeEqual(PaperSize ps, float width, float height, int rawKind)
  30. {
  31. float psWidth = ps.Width / 100f * 25.4f;
  32. float psHeight = ps.Height / 100f * 25.4f;
  33. bool sizeEqual = (Equal(psWidth, width) && Equal(psHeight, height)) ||
  34. (Equal(psWidth, height) && Equal(psHeight, width));
  35. if (rawKind == 0)
  36. return sizeEqual;
  37. return sizeEqual && ps.RawKind == rawKind;
  38. }
  39. private void Swap(ref float a, ref float b)
  40. {
  41. float c = a;
  42. a = b;
  43. b = c;
  44. }
  45. private void UpdateControls()
  46. {
  47. updating = true;
  48. MyRes res = new MyRes("Forms,PageSetup");
  49. string savePrinterName = printerSettings.PrinterName;
  50. printerSettings.PrinterName = Page.Report.PrintSettings.Printer;
  51. if (!printerSettings.IsValid)
  52. printerSettings.PrinterName = savePrinterName;
  53. // paper
  54. cbxPaper.Items.Add(res.Get("Custom"));
  55. foreach (PaperSize ps in printerSettings.PaperSizes)
  56. {
  57. cbxPaper.Items.Add(ps.PaperName);
  58. }
  59. // probe PaperWidth, PaperHeight, RawPaperSize
  60. if (Page.RawPaperSize != 0)
  61. {
  62. foreach (PaperSize ps in printerSettings.PaperSizes)
  63. {
  64. if (cbxPaper.SelectedIndex == -1 && PaperSizeEqual(ps, Page.PaperWidth, Page.PaperHeight, Page.RawPaperSize))
  65. cbxPaper.SelectedIndex = cbxPaper.Items.IndexOf(ps.PaperName);
  66. }
  67. }
  68. // probe PaperWidth, PaperHeight only
  69. if (cbxPaper.SelectedIndex == -1)
  70. {
  71. foreach (PaperSize ps in printerSettings.PaperSizes)
  72. {
  73. if (cbxPaper.SelectedIndex == -1 && PaperSizeEqual(ps, Page.PaperWidth, Page.PaperHeight, 0))
  74. cbxPaper.SelectedIndex = cbxPaper.Items.IndexOf(ps.PaperName);
  75. }
  76. }
  77. if (cbxPaper.SelectedIndex == -1 && cbxPaper.Items.Count > 0)
  78. cbxPaper.SelectedIndex = 0;
  79. tbWidth.Text = Converter.ToString(Page.PaperWidth, typeof(PaperConverter));
  80. tbHeight.Text = Converter.ToString(Page.PaperHeight, typeof(PaperConverter));
  81. // orientation
  82. rbPortrait.Checked = !Page.Landscape;
  83. rbLandscape.Checked = Page.Landscape;
  84. // margins
  85. tbLeft.Text = Converter.ToString(Page.LeftMargin, typeof(PaperConverter));
  86. tbRight.Text = Converter.ToString(Page.RightMargin, typeof(PaperConverter));
  87. tbTop.Text = Converter.ToString(Page.TopMargin, typeof(PaperConverter));
  88. tbBottom.Text = Converter.ToString(Page.BottomMargin, typeof(PaperConverter));
  89. cbMirrorMargins.Checked = Page.MirrorMargins;
  90. // sources
  91. int indexOfAutofeed = 0;
  92. foreach (PaperSource ps in printerSettings.PaperSources)
  93. {
  94. cbxFirstPage.Items.Add(ps.SourceName);
  95. cbxOtherPages.Items.Add(ps.SourceName);
  96. cbxLastPage.Items.Add(ps.SourceName);
  97. if (ps.Kind == PaperSourceKind.AutomaticFeed)
  98. indexOfAutofeed = cbxFirstPage.Items.Count - 1;
  99. if (Page.FirstPageSource == ps.RawKind)
  100. cbxFirstPage.SelectedIndex = cbxFirstPage.Items.Count - 1;
  101. if (Page.OtherPagesSource == ps.RawKind)
  102. cbxOtherPages.SelectedIndex = cbxOtherPages.Items.Count - 1;
  103. if (Page.LastPageSource == ps.RawKind)
  104. cbxLastPage.SelectedIndex = cbxLastPage.Items.Count - 1;
  105. }
  106. if (cbxFirstPage.SelectedIndex == -1 && cbxFirstPage.Items.Count > 0)
  107. cbxFirstPage.SelectedIndex = indexOfAutofeed;
  108. if (cbxOtherPages.SelectedIndex == -1 && cbxOtherPages.Items.Count > 0)
  109. cbxOtherPages.SelectedIndex = indexOfAutofeed;
  110. if (cbxLastPage.SelectedIndex == -1 && cbxLastPage.Items.Count > 0)
  111. cbxLastPage.SelectedIndex = indexOfAutofeed;
  112. // columns
  113. udCount.Value = Page.Columns.Count;
  114. tbColumnWidth.Text = Converter.ToString(Page.Columns.Width, typeof(PaperConverter));
  115. string s = "";
  116. foreach (float pos in Page.Columns.Positions)
  117. {
  118. s += Converter.ToString(pos, typeof(PaperConverter)) + "\r\n";
  119. }
  120. tbPositions.Text = s;
  121. // duplex
  122. cbxDuplex.Items.Add(res.Get("DupDefault"));
  123. cbxDuplex.Items.Add(res.Get("DupSimplex"));
  124. cbxDuplex.Items.Add(res.Get("DupVertical"));
  125. cbxDuplex.Items.Add(res.Get("DupHorizontal"));
  126. cbxDuplex.SelectedIndex = Page.Duplex == Duplex.Default ? 0 : (int)Page.Duplex;
  127. cbExtraWidth.Checked = Page.ExtraDesignWidth;
  128. cbUnlimitedWidth.Checked = Page.UnlimitedWidth;
  129. cbUnlimitedHeight.Checked = Page.UnlimitedHeight;
  130. updating = false;
  131. }
  132. private void UpdateColumns()
  133. {
  134. float paperWidth = (float)Converter.FromString(tbWidth.Text, typeof(PaperConverter));
  135. float leftMargin = (float)Converter.FromString(tbLeft.Text, typeof(PaperConverter));
  136. float rightMargin = (float)Converter.FromString(tbRight.Text, typeof(PaperConverter));
  137. float columnWidth = (paperWidth - leftMargin - rightMargin) / (float)udCount.Value;
  138. tbColumnWidth.Text = Converter.ToString(columnWidth, typeof(PaperConverter));
  139. string s = "";
  140. for (int i = 0; i < udCount.Value; i++)
  141. {
  142. float pos = i * columnWidth;
  143. s += Converter.ToString(pos, typeof(PaperConverter)) + "\r\n";
  144. }
  145. tbPositions.Text = s;
  146. }
  147. private void cbxPaper_SelectedIndexChanged(object sender, EventArgs e)
  148. {
  149. if (updating || cbxPaper.SelectedIndex == 0)
  150. return;
  151. foreach (PaperSize ps in printerSettings.PaperSizes)
  152. {
  153. if (ps.PaperName == (string)cbxPaper.SelectedItem)
  154. {
  155. float psWidth = ps.Width / 100f * 25.4f;
  156. float psHeight = ps.Height / 100f * 25.4f;
  157. if (ps.Kind == PaperKind.A4)
  158. {
  159. psWidth = 210;
  160. psHeight = 297;
  161. }
  162. if (rbLandscape.Checked)
  163. Swap(ref psWidth, ref psHeight);
  164. updating = true;
  165. tbWidth.Text = Converter.ToString(psWidth, typeof(PaperConverter));
  166. tbHeight.Text = Converter.ToString(psHeight, typeof(PaperConverter));
  167. UpdateColumns();
  168. updating = false;
  169. break;
  170. }
  171. }
  172. }
  173. private void rbPortrait_CheckedChanged(object sender, EventArgs e)
  174. {
  175. if (updating || !(sender as RadioButton).Checked)
  176. return;
  177. string m1 = tbLeft.Text; // m3
  178. string m2 = tbRight.Text; // m1 m2
  179. string m3 = tbTop.Text; // m4
  180. string m4 = tbBottom.Text; //
  181. string w = tbWidth.Text;
  182. string h = tbHeight.Text;
  183. // avoid reset papersize to custom
  184. updating = true;
  185. tbWidth.Text = h;
  186. tbHeight.Text = w;
  187. if (rbLandscape.Checked)
  188. {
  189. tbLeft.Text = m3; // rotate counter-clockwise
  190. tbRight.Text = m4;
  191. tbTop.Text = m2;
  192. tbBottom.Text = m1;
  193. }
  194. else
  195. {
  196. tbLeft.Text = m4; // rotate clockwise
  197. tbRight.Text = m3;
  198. tbTop.Text = m1;
  199. tbBottom.Text = m2;
  200. }
  201. updating = false;
  202. UpdateColumns();
  203. pnOrientation.Refresh();
  204. }
  205. private void tbHeight_TextChanged(object sender, EventArgs e)
  206. {
  207. if (updating)
  208. return;
  209. cbxPaper.SelectedIndex = 0;
  210. UpdateColumns();
  211. }
  212. private void tbLeft_TextChanged(object sender, EventArgs e)
  213. {
  214. if (updating)
  215. return;
  216. UpdateColumns();
  217. }
  218. private void udCount_ValueChanged(object sender, EventArgs e)
  219. {
  220. if (updating)
  221. return;
  222. UpdateColumns();
  223. }
  224. private void btnEdit_Click(object sender, EventArgs e)
  225. {
  226. using (WatermarkEditorForm form = new WatermarkEditorForm())
  227. {
  228. form.Watermark = watermark;
  229. form.HideApplyToAll();
  230. if (form.ShowDialog() == DialogResult.OK)
  231. watermark = form.Watermark;
  232. }
  233. }
  234. private void pnOrientation_Paint(object sender, PaintEventArgs e)
  235. {
  236. using (Bitmap bmp = this.GetImage(rbPortrait.Checked ? "Images.Portrait.png" : "Images.Landscape.png"))
  237. {
  238. e.Graphics.DrawImage(bmp, (pnOrientation.Width - bmp.Width) / 2, (pnOrientation.Height - bmp.Height) / 2);
  239. }
  240. }
  241. private void PageSetupForm_Shown(object sender, EventArgs e)
  242. {
  243. // needed for 120dpi mode
  244. tbPositions.Height = pnColumns.Height - tbPositions.Top - 16;
  245. cbMirrorMargins.Width = pnMargins.Width - cbMirrorMargins.Left * 2;
  246. }
  247. private void PageSetupForm_FormClosed(object sender, FormClosedEventArgs e)
  248. {
  249. if (DialogResult == DialogResult.OK)
  250. UpdatePage();
  251. }
  252. private void UpdatePage()
  253. {
  254. Page.Landscape = rbLandscape.Checked;
  255. Page.PaperWidth = (float)Converter.FromString(tbWidth.Text, typeof(PaperConverter));
  256. Page.PaperHeight = (float)Converter.FromString(tbHeight.Text, typeof(PaperConverter));
  257. Page.RawPaperSize = cbxPaper.SelectedIndex == 0 ? 0 : printerSettings.PaperSizes[cbxPaper.SelectedIndex - 1].RawKind;
  258. Page.LeftMargin = (float)Converter.FromString(tbLeft.Text, typeof(PaperConverter));
  259. Page.RightMargin = (float)Converter.FromString(tbRight.Text, typeof(PaperConverter));
  260. Page.TopMargin = (float)Converter.FromString(tbTop.Text, typeof(PaperConverter));
  261. Page.BottomMargin = (float)Converter.FromString(tbBottom.Text, typeof(PaperConverter));
  262. Page.MirrorMargins = cbMirrorMargins.Checked;
  263. if (cbxFirstPage.Items.Count > 0)
  264. {
  265. Page.FirstPageSource = printerSettings.PaperSources[cbxFirstPage.SelectedIndex].RawKind;
  266. Page.OtherPagesSource = printerSettings.PaperSources[cbxOtherPages.SelectedIndex].RawKind;
  267. Page.LastPageSource = printerSettings.PaperSources[cbxLastPage.SelectedIndex].RawKind;
  268. }
  269. Page.Columns.Count = (int)udCount.Value;
  270. Page.Columns.Width = (float)Converter.FromString(tbColumnWidth.Text, typeof(PaperConverter));
  271. string s = tbPositions.Text;
  272. s = s.Replace("\r\n", ";");
  273. string[] positions = s.Split(';');
  274. Page.Columns.Positions.Clear();
  275. foreach (string pos in positions)
  276. {
  277. if (!String.IsNullOrEmpty(pos.Trim()))
  278. Page.Columns.Positions.Add((float)Converter.FromString(pos, typeof(PaperConverter)));
  279. }
  280. Page.Duplex = (Duplex)(cbxDuplex.SelectedIndex == 0 ? -1 : cbxDuplex.SelectedIndex);
  281. Page.Watermark = watermark;
  282. Page.ExtraDesignWidth = cbExtraWidth.Checked;
  283. Page.UnlimitedWidth = cbUnlimitedWidth.Checked;
  284. Page.UnlimitedHeight = cbUnlimitedHeight.Checked;
  285. Page.Report.Designer.Refresh();
  286. }
  287. public override void Localize()
  288. {
  289. base.Localize();
  290. MyRes res = new MyRes("Forms,PageSetup");
  291. Text = res.Get("");
  292. pnPaper.Text = res.Get("Paper");
  293. pnMargins.Text = res.Get("Margins");
  294. pnSource.Text = res.Get("Source");
  295. pnColumns.Text = res.Get("Columns");
  296. pnOther.Text = res.Get("Other");
  297. lblWidth.Text = res.Get("Width");
  298. lblHeight.Text = res.Get("Height");
  299. gbOrientation.Text = res.Get("Orientation");
  300. rbPortrait.Text = res.Get("Portrait");
  301. rbLandscape.Text = res.Get("Landscape");
  302. lblLeft.Text = res.Get("Left");
  303. lblRight.Text = res.Get("Right");
  304. lblTop.Text = res.Get("Top");
  305. lblBottom.Text = res.Get("Bottom");
  306. cbMirrorMargins.Text = res.Get("MirrorMargins");
  307. lblFirstPage.Text = res.Get("FirstPage");
  308. lblOtherPages.Text = res.Get("OtherPages");
  309. lblLastPage.Text = res.Get("LastPage");
  310. lblCount.Text = res.Get("Count");
  311. lblColumnWidth.Text = res.Get("ColumnWidth");
  312. lblPositions.Text = res.Get("Positions");
  313. lblDuplex.Text = res.Get("Duplex");
  314. btnEdit.Text = res.Get("EditWatermark");
  315. cbExtraWidth.Text = res.Get("ExtraWidth");
  316. cbUnlimitedWidth.Text = res.Get("UnlimitedWidth");
  317. cbUnlimitedHeight.Text = res.Get("UnlimitedHeight");
  318. }
  319. public PageSetupForm()
  320. {
  321. InitializeComponent();
  322. Localize();
  323. printerSettings = new PrinterSettings();
  324. UIUtils.CheckRTL(this);
  325. }
  326. }
  327. }