123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- using FastReport.Utils;
- using System;
- using System.Drawing.Printing;
- namespace FastReport.Print
- {
- internal abstract class PrintControllerBase
- {
- #region Fields
- private Report report;
- private PrintDocument doc;
- private PageNumbersParser pages;
- private ReportPage page;
- private int pageNo;
- private int printedPageCount;
- #endregion
- #region Properties
- public Report Report
- {
- get { return report; }
- }
- public PrintDocument Doc
- {
- get { return doc; }
- }
- public PageNumbersParser Pages
- {
- get { return pages; }
- }
- public ReportPage Page
- {
- get { return page; }
- set { page = value; }
- }
- public int PageNo
- {
- get { return pageNo; }
- set { pageNo = value; }
- }
- #endregion
- #region Private Methods
- private PaperSize FindPaperSize(PrinterSettings.PaperSizeCollection paperSizes,
- float paperWidth, float paperHeight, int rawKind)
- {
- if (paperSizes == null)
- return null;
- foreach (PaperSize ps in paperSizes)
- {
- // convert hundreds of inches to mm
- float psWidth = ps.Width / 100f * 25.4f;
- float psHeight = ps.Height / 100f * 25.4f;
- // check if page has the same kind and size
- bool sizeEqual = Math.Abs(paperWidth - psWidth) < 5 && Math.Abs(paperHeight - psHeight) < 5;
- if (sizeEqual)
- {
- if (rawKind == 0 || ps.RawKind == rawKind)
- return ps;
- }
- }
- return null;
- }
- #endregion
- #region Protected methods
- protected ReportPage GetNextPage()
- {
- pageNo = 0;
- if (Pages.GetPage(ref pageNo))
- return Report.PreparedPages.GetPage(pageNo);
- return null;
- }
- protected bool HasMorePages()
- {
- return Pages.Count > 0;
- }
- protected void SetPaperSize(ReportPage page, QueryPageSettingsEventArgs e)
- {
- float width = page.PaperWidth;
- float height = page.PaperHeight;
- if (page.Landscape)
- {
- width = page.PaperHeight;
- height = page.PaperWidth;
- }
- SetPaperSize(width, height, page.RawPaperSize, e);
- }
- protected void SetPaperSize(float paperWidth, float paperHeight, int rawKind, QueryPageSettingsEventArgs e)
- {
- PaperSize ps = null;
- // check PaperWidth, PaperHeight, RawKind
- if (rawKind != 0)
- ps = FindPaperSize(e.PageSettings.PrinterSettings.PaperSizes, paperWidth, paperHeight, rawKind);
- // check PaperWidth, PaperHeight only
- if (ps == null)
- ps = FindPaperSize(e.PageSettings.PrinterSettings.PaperSizes, paperWidth, paperHeight, 0);
- // paper size not found, create custom one
- if (ps == null)
- {
- ps = new PaperSize();
- ps.Width = (int)Math.Round(paperWidth / 25.4f * 100);
- ps.Height = (int)Math.Round(paperHeight / 25.4f * 100);
- }
- e.PageSettings.PaperSize = ps;
- }
- protected void SetPaperSource(ReportPage page, QueryPageSettingsEventArgs e)
- {
- int rawKind = Report.PrintSettings.PaperSource;
- // it's set to Automatic, try page.PaperSource
- if (rawKind == 7)
- {
- if (PageNo == 0)
- {
- rawKind = page.FirstPageSource;
- }
- else if (PageNo == Report.PreparedPages.Count - 1)
- {
- rawKind = page.LastPageSource;
- }
- else
- {
- rawKind = page.OtherPagesSource;
- }
- }
- // do not change paper source if it is AutomaticFeed
- if (rawKind == 7)
- return;
- foreach (PaperSource ps in e.PageSettings.PrinterSettings.PaperSources)
- {
- if (ps.RawKind == rawKind)
- {
- e.PageSettings.PaperSource = ps;
- return;
- }
- }
- }
- protected void StartPage(PrintPageEventArgs e)
- {
- printedPageCount++;
- Config.ReportSettings.OnProgress(Report,
- String.Format(Res.Get("Messages,PrintingPage"), printedPageCount), printedPageCount, 0);
- }
- protected void FinishPage(PrintPageEventArgs e)
- {
- if (Report.Aborted)
- e.Cancel = true;
- }
- #endregion
- #region Public methods
- public abstract void QueryPageSettings(object sender, QueryPageSettingsEventArgs e);
- public abstract void PrintPage(object sender, PrintPageEventArgs e);
- #endregion
- public PrintControllerBase(Report report, PrintDocument doc, int curPage)
- {
- this.report = report;
- this.doc = doc;
- pages = new PageNumbersParser(report, curPage);
- // select the printer
- if (!String.IsNullOrEmpty(report.PrintSettings.Printer))
- this.doc.PrinterSettings.PrinterName = report.PrintSettings.Printer;
- // print to file
- if (report.PrintSettings.PrintToFile)
- {
- this.doc.PrinterSettings.PrintFileName = report.PrintSettings.PrintToFileName;
- this.doc.PrinterSettings.PrintToFile = true;
- }
- // set job name
- if (!String.IsNullOrEmpty(report.ReportInfo.Name))
- this.doc.DocumentName = report.ReportInfo.Name;
- else
- this.doc.DocumentName = report.FileName;
- // set copies and collation
- if (report.PrintSettings.Copies < 1)
- report.PrintSettings.Copies = 1;
- this.doc.PrinterSettings.Copies = (short)report.PrintSettings.Copies;
- this.doc.PrinterSettings.Collate = report.PrintSettings.Collate;
- }
- }
- }
|