PrinterSetupForm.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. using System.Drawing.Printing;
  5. using FastReport.Utils;
  6. namespace FastReport.Forms
  7. {
  8. internal partial class PrinterSetupForm : BaseDialogForm
  9. {
  10. private Report report;
  11. private bool printDialog;
  12. private bool collapsed;
  13. private PrinterSettings printerSettings;
  14. private bool Collapsed
  15. {
  16. get { return collapsed; }
  17. set
  18. {
  19. collapsed = value;
  20. if (value)
  21. {
  22. gbOther.Visible = false;
  23. gbPrintMode.Visible = false;
  24. btnMoreOptions.Text = Res.Get("Buttons,MoreOptions");
  25. btnOk.Top = gbPageRange.Bottom + this.LogicalToDevice(15);
  26. btnCancel.Top = btnOk.Top;
  27. btnMoreOptions.Top = btnOk.Top;
  28. }
  29. else
  30. {
  31. gbOther.Visible = true;
  32. gbPrintMode.Visible = true;
  33. btnMoreOptions.Text = Res.Get("Buttons,LessOptions");
  34. btnOk.Top = gbOther.Bottom + this.LogicalToDevice(15);
  35. btnCancel.Top = btnOk.Top;
  36. btnMoreOptions.Top = btnOk.Top;
  37. }
  38. ClientSize = new Size(ClientSize.Width, btnOk.Bottom + this.LogicalToDevice(10));
  39. }
  40. }
  41. public Report Report
  42. {
  43. get { return report; }
  44. set
  45. {
  46. report = value;
  47. UpdateControls();
  48. }
  49. }
  50. public bool PrintDialog
  51. {
  52. get { return printDialog; }
  53. set
  54. {
  55. printDialog = value;
  56. if (value)
  57. {
  58. MyRes res = new MyRes("Forms,PrinterSetup");
  59. Text = res.Get("");
  60. cbSavePrinter.Visible = false;
  61. rbCurrent.Enabled = true;
  62. btnOk.Text = res.Get("Print");
  63. }
  64. }
  65. }
  66. public PrinterSettings PrinterSettings
  67. {
  68. get { return printerSettings; }
  69. set { printerSettings = value; }
  70. }
  71. private bool Equal(float a, float b)
  72. {
  73. return Math.Abs(a - b) < 2;
  74. }
  75. private bool PaperSizeEqual(PaperSize ps, float width, float height, int rawKind)
  76. {
  77. float psWidth = ps.Width / 100f * 25.4f;
  78. float psHeight = ps.Height / 100f * 25.4f;
  79. bool sizeEqual = (Equal(psWidth, width) && Equal(psHeight, height)) ||
  80. (Equal(psWidth, height) && Equal(psHeight, width));
  81. if (rawKind == 0)
  82. return sizeEqual;
  83. return sizeEqual && ps.RawKind == rawKind;
  84. }
  85. private void UpdateControls()
  86. {
  87. MyRes res = new MyRes("Forms,PrinterSetup");
  88. // Printer
  89. string savePrinter = printerSettings.PrinterName;
  90. printerSettings.PrinterName = Report.PrintSettings.Printer;
  91. if (!printerSettings.IsValid)
  92. printerSettings.PrinterName = savePrinter;
  93. try
  94. {
  95. foreach (string printer in PrinterSettings.InstalledPrinters)
  96. {
  97. cbxPrinter.Items.Add(printer);
  98. }
  99. }
  100. catch (System.ComponentModel.Win32Exception) { }
  101. cbxPrinter.SelectedItem = printerSettings.PrinterName;
  102. cbSavePrinter.Checked = Report.PrintSettings.SavePrinterWithReport;
  103. cbPrintToFile.Checked = Report.PrintSettings.PrintToFile;
  104. // Page range
  105. rbAll.Checked = Report.PrintSettings.PageRange == PageRange.All;
  106. rbCurrent.Checked = Report.PrintSettings.PageRange == PageRange.Current;
  107. rbNumbers.Checked = Report.PrintSettings.PageRange == PageRange.PageNumbers;
  108. tbNumbers.Text = Report.PrintSettings.PageNumbers;
  109. // Copies
  110. udCount.Value = Report.PrintSettings.Copies;
  111. cbCollate.Checked = Report.PrintSettings.Collate;
  112. // Other
  113. cbxOddEven.Items.Add(res.Get("AllPages"));
  114. cbxOddEven.Items.Add(res.Get("OddPages"));
  115. cbxOddEven.Items.Add(res.Get("EvenPages"));
  116. cbxOddEven.SelectedIndex = (int)Report.PrintSettings.PrintPages;
  117. cbxOrder.Items.Add(res.Get("OrderDirect"));
  118. cbxOrder.Items.Add(res.Get("OrderReverse"));
  119. cbxOrder.SelectedIndex = Report.PrintSettings.Reverse ? 1 : 0;
  120. cbxDuplex.Items.Add(Res.Get("Forms,PageSetup,DupDefault"));
  121. cbxDuplex.Items.Add(Res.Get("Forms,PageSetup,DupSimplex"));
  122. cbxDuplex.Items.Add(Res.Get("Forms,PageSetup,DupVertical"));
  123. cbxDuplex.Items.Add(Res.Get("Forms,PageSetup,DupHorizontal"));
  124. cbxDuplex.SelectedIndex = Report.PrintSettings.Duplex == Duplex.Default ? 0 : (int)Report.PrintSettings.Duplex;
  125. // Print mode
  126. cbxPrintMode.Items.Add(res.Get("PrintModeDefault"));
  127. cbxPrintMode.Items.Add(res.Get("PrintModeSplit"));
  128. cbxPrintMode.Items.Add(res.Get("PrintModeScale"));
  129. cbxPrintMode.SelectedIndex = (int)Report.PrintSettings.PrintMode;
  130. cbxPagesOnSheet.Items.Add(res.Get("PagesOnSheet1"));
  131. cbxPagesOnSheet.Items.Add(res.Get("PagesOnSheet2"));
  132. cbxPagesOnSheet.Items.Add(res.Get("PagesOnSheet4"));
  133. cbxPagesOnSheet.Items.Add(res.Get("PagesOnSheet8"));
  134. cbxPagesOnSheet.SelectedIndex = (int)Report.PrintSettings.PagesOnSheet;
  135. }
  136. private void UpdatePrintSettings()
  137. {
  138. PrintSettings ps = Report.PrintSettings;
  139. // Printer
  140. ps.Printer = (string)cbxPrinter.SelectedItem;
  141. if (cbSavePrinter.Visible)
  142. ps.SavePrinterWithReport = cbSavePrinter.Checked;
  143. ps.PrintToFile = cbPrintToFile.Checked && Config.PreviewSettings.AllowPrintToFile;
  144. if (PrintDialog && ps.PrintToFile)
  145. {
  146. using (SaveFileDialog dialog = new SaveFileDialog())
  147. {
  148. #if AVALONIA
  149. dialog.Filter = Res.Get("FileFilters,PdfFile");
  150. dialog.DefaultExt = "pdf";
  151. #else
  152. dialog.Filter = Res.Get("FileFilters,PrnFile");
  153. dialog.DefaultExt = "prn";
  154. #endif
  155. if (dialog.ShowDialog() == DialogResult.OK)
  156. ps.PrintToFileName = dialog.FileName;
  157. else
  158. DialogResult = DialogResult.Cancel;
  159. }
  160. }
  161. // Page range
  162. if (rbAll.Checked)
  163. ps.PageRange = PageRange.All;
  164. else if (rbCurrent.Checked)
  165. ps.PageRange = PageRange.Current;
  166. else
  167. ps.PageRange = PageRange.PageNumbers;
  168. ps.PageNumbers = tbNumbers.Text;
  169. // Copies
  170. ps.Copies = (int)udCount.Value;
  171. ps.Collate = cbCollate.Checked;
  172. // Other
  173. ps.PrintPages = (PrintPages)cbxOddEven.SelectedIndex;
  174. ps.Reverse = cbxOrder.SelectedIndex == 1;
  175. ps.Duplex = (Duplex)(cbxDuplex.SelectedIndex == 0 ? -1 : cbxDuplex.SelectedIndex);
  176. if (cbxSource.SelectedIndex != -1)
  177. ps.PaperSource = printerSettings.PaperSources[cbxSource.SelectedIndex].RawKind;
  178. // Print mode
  179. ps.PrintMode = (PrintMode)cbxPrintMode.SelectedIndex;
  180. if (ps.PrintMode != PrintMode.Default)
  181. {
  182. PaperSize sz = printerSettings.PaperSizes[cbxPrintOnSheet.SelectedIndex];
  183. ps.PrintOnSheetWidth = sz.Width / 100f * 25.4f;
  184. ps.PrintOnSheetHeight = sz.Height / 100f * 25.4f;
  185. ps.PrintOnSheetRawPaperSize = sz.RawKind;
  186. ps.PagesOnSheet = ps.PrintMode == PrintMode.Scale ?
  187. (PagesOnSheet)cbxPagesOnSheet.SelectedIndex : PagesOnSheet.One;
  188. }
  189. else
  190. {
  191. ps.PrintOnSheetWidth = 210;
  192. ps.PrintOnSheetHeight = 297;
  193. ps.PrintOnSheetRawPaperSize = 0;
  194. ps.PagesOnSheet = PagesOnSheet.One;
  195. }
  196. }
  197. private void cbxPrinter_DrawItem(object sender, DrawItemEventArgs e)
  198. {
  199. e.DrawBackground();
  200. if (e.Index >= 0)
  201. {
  202. cbxPrinter.DrawImageAndText(e, GetImage(88), (string)cbxPrinter.Items[e.Index]);
  203. }
  204. }
  205. private void btnMoreOptions_Click(object sender, EventArgs e)
  206. {
  207. Collapsed = !Collapsed;
  208. }
  209. private void btnSettings_Click(object sender, EventArgs e)
  210. {
  211. PrinterUtils.ShowPropertiesDialog(printerSettings);
  212. cbxDuplex.SelectedIndex = printerSettings.Duplex == Duplex.Default ? 0 : (int)printerSettings.Duplex;
  213. }
  214. private void pnCollate_Paint(object sender, PaintEventArgs e)
  215. {
  216. string resName = cbCollate.Checked ? "Images.Collate1.png" : "Images.Collate2.png";
  217. using (Bitmap bmp = GetImage(resName))
  218. {
  219. e.Graphics.DrawImage(bmp, 0, 0);
  220. }
  221. }
  222. private void cbCollate_CheckedChanged(object sender, EventArgs e)
  223. {
  224. pnCollate.Refresh();
  225. }
  226. private void cbxPrintMode_DrawItem(object sender, DrawItemEventArgs e)
  227. {
  228. e.DrawBackground();
  229. if (e.Index >= 0)
  230. {
  231. string[] resNames = new string[] { "Images.DefaultMode.png", "Images.SplitMode.png", "Images.ScaleMode.png" };
  232. using (Bitmap bmp = GetImage(resNames[e.Index]))
  233. {
  234. cbxPrintMode.DrawImageAndText(e, bmp, (string)cbxPrintMode.Items[e.Index]);
  235. }
  236. }
  237. }
  238. private void cbxPrinter_SelectedIndexChanged(object sender, EventArgs e)
  239. {
  240. printerSettings.PrinterName = (string)cbxPrinter.SelectedItem;
  241. // paper
  242. int indexOfDefaultPaper = -1;
  243. try
  244. {
  245. PaperSize defaultPaper = printerSettings.DefaultPageSettings.PaperSize;
  246. cbxPrintOnSheet.Items.Clear();
  247. foreach (PaperSize ps in printerSettings.PaperSizes)
  248. {
  249. cbxPrintOnSheet.Items.Add(ps.PaperName);
  250. if (ps == defaultPaper)
  251. indexOfDefaultPaper = cbxPrintOnSheet.Items.Count - 1;
  252. }
  253. // probe PaperWidth, PaperHeight, RawPaperSize
  254. if (Report.PrintSettings.PrintOnSheetRawPaperSize != 0)
  255. {
  256. foreach (PaperSize ps in printerSettings.PaperSizes)
  257. {
  258. if (cbxPrintOnSheet.SelectedIndex == -1 &&
  259. PaperSizeEqual(ps, Report.PrintSettings.PrintOnSheetWidth,
  260. Report.PrintSettings.PrintOnSheetHeight, Report.PrintSettings.PrintOnSheetRawPaperSize))
  261. cbxPrintOnSheet.SelectedIndex = cbxPrintOnSheet.Items.IndexOf(ps.PaperName);
  262. }
  263. }
  264. // probe PaperWidth, PaperHeight only
  265. if (cbxPrintOnSheet.SelectedIndex == -1)
  266. {
  267. foreach (PaperSize ps in printerSettings.PaperSizes)
  268. {
  269. if (cbxPrintOnSheet.SelectedIndex == -1 &&
  270. PaperSizeEqual(ps, Report.PrintSettings.PrintOnSheetWidth, Report.PrintSettings.PrintOnSheetHeight, 0))
  271. cbxPrintOnSheet.SelectedIndex = cbxPrintOnSheet.Items.IndexOf(ps.PaperName);
  272. }
  273. }
  274. if (cbxPrintOnSheet.SelectedIndex == -1 && indexOfDefaultPaper < cbxPrintOnSheet.Items.Count)
  275. cbxPrintOnSheet.SelectedIndex = indexOfDefaultPaper;
  276. // paper source
  277. cbxSource.Items.Clear();
  278. int indexOfAutofeed = -1;
  279. foreach (PaperSource ps in printerSettings.PaperSources)
  280. {
  281. cbxSource.Items.Add(ps.SourceName);
  282. if (ps.Kind == PaperSourceKind.AutomaticFeed)
  283. indexOfAutofeed = cbxSource.Items.Count - 1;
  284. if (Report.PrintSettings.PaperSource == ps.RawKind)
  285. cbxSource.SelectedIndex = cbxSource.Items.Count - 1;
  286. }
  287. if (cbxSource.SelectedIndex == -1 && indexOfAutofeed < cbxSource.Items.Count)
  288. cbxSource.SelectedIndex = indexOfAutofeed;
  289. }
  290. catch
  291. {
  292. //
  293. }
  294. }
  295. private void cbxPrintMode_SelectedIndexChanged(object sender, EventArgs e)
  296. {
  297. bool enabled = cbxPrintMode.SelectedIndex != 0;
  298. bool enabled1 = cbxPrintMode.SelectedIndex == 2;
  299. lblPrintOnSheet.Enabled = enabled;
  300. cbxPrintOnSheet.Enabled = enabled;
  301. lblPagesOnSheet.Enabled = enabled1;
  302. cbxPagesOnSheet.Enabled = enabled1;
  303. }
  304. private void tbNumbers_KeyPress(object sender, KeyPressEventArgs e)
  305. {
  306. rbNumbers.Checked = true;
  307. }
  308. private void rbCurrent_CheckedChanged(object sender, EventArgs e)
  309. {
  310. if ((sender as RadioButton).Checked)
  311. tbNumbers.Text = "";
  312. }
  313. private void PrinterSetupForm_FormClosed(object sender, FormClosedEventArgs e)
  314. {
  315. if (DialogResult == DialogResult.OK)
  316. UpdatePrintSettings();
  317. }
  318. private void PrinterSetupForm_FormClosing(object sender, FormClosingEventArgs e)
  319. {
  320. if (DialogResult == DialogResult.OK)
  321. {
  322. string s = tbNumbers.Text;
  323. foreach (char c in s)
  324. {
  325. if (!(c == ' ' || c == ',' || c == '-' || (c >= '0' && c <= '9')))
  326. {
  327. FRMessageBox.Error(Res.Get("Forms,PrinterSetup,Error") + "\r\n" +
  328. Res.Get("Forms,PrinterSetup,Hint"));
  329. tbNumbers.Focus();
  330. e.Cancel = true;
  331. break;
  332. }
  333. }
  334. }
  335. }
  336. public override void Localize()
  337. {
  338. base.Localize();
  339. MyRes res = new MyRes("Forms,PrinterSetup");
  340. Text = res.Get("PrinterSetup");
  341. gbPrinter.Text = res.Get("Printer");
  342. cbSavePrinter.Text = res.Get("SavePrinter");
  343. btnSettings.Text = res.Get("Settings");
  344. cbPrintToFile.Text = res.Get("PrintToFile");
  345. gbPageRange.Text = res.Get("PageRange");
  346. rbAll.Text = res.Get("All");
  347. rbCurrent.Text = res.Get("Current");
  348. rbNumbers.Text = res.Get("Numbers");
  349. lblHint.Text = res.Get("Hint");
  350. gbCopies.Text = res.Get("Copies");
  351. lblCount.Text = res.Get("Count");
  352. cbCollate.Text = res.Get("Collate");
  353. gbOther.Text = res.Get("Other");
  354. lblOddEven.Text = res.Get("OddEven");
  355. lblOrder.Text = res.Get("Order");
  356. lblDuplex.Text = res.Get("Duplex");
  357. lblSource.Text = res.Get("Source");
  358. gbPrintMode.Text = res.Get("PrintMode");
  359. lblPrintOnSheet.Text = res.Get("PrintOnSheet");
  360. lblPagesOnSheet.Text = res.Get("PagesOnSheet");
  361. }
  362. public override void UpdateDpiDependencies()
  363. {
  364. base.UpdateDpiDependencies();
  365. cbxPrinter.ItemHeight = this.LogicalToDevice(16);
  366. cbxPrintMode.ItemHeight = this.LogicalToDevice(39);
  367. }
  368. public PrinterSetupForm()
  369. {
  370. InitializeComponent();
  371. Localize();
  372. Collapsed = true;
  373. printerSettings = new PrinterSettings();
  374. cbPrintToFile.Enabled = Config.PreviewSettings.AllowPrintToFile;
  375. #if AVALONIA
  376. btnSettings.Enabled = false;
  377. cbxDuplex.Enabled = false;
  378. cbxSource.Enabled = false;
  379. cbCollate.Enabled = false;
  380. udCount.Enabled = false;
  381. #else
  382. btnSettings.Enabled = !Config.IsRunningOnMono;
  383. #endif
  384. UIUtils.CheckRTL(this);
  385. UpdateDpiDependencies();
  386. }
  387. }
  388. }