/// /// Copyright (c) 2015 Sensus Metering Systems /// using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Printing; using System.IO; using Config.Entities; using TBF.Resources; namespace TBF.BenchControl.ResultsPrinters.LabelPrinter { public class PrintLabelDocument : PrintDocument { const int FontSize = 9; const string FontFamilyName = "Arial"; //"Times New Roman"; readonly int paperWidth; readonly int paperHeight; readonly string templateFile; /// Property variable for the Font the user wishes to use Font font; /// /// Data to print /// readonly GenericDevices.IBenchInfo benchId; readonly Procedure procedure; readonly IList unsortedResults; readonly bool combined; readonly DateTime dateTime; /// /// Items to print /// readonly IList resultItems; /// /// Layout and status /// int nextWMNr; /// nr. of watermeter to be printed as the first one on the next page int nrPages; int pageNr; /// Page number to be printed at the bottom of the page /// /// Constructor /// /// Text to be printed public PrintLabelDocument(GenericDevices.IBenchInfo benchId, Procedure procedure, IList unsortedResults, PageOrientation pageOrientation, int paperWidth, int paperHeight, string templateFile) { this.benchId = benchId; this.procedure = procedure; this.unsortedResults = unsortedResults; this.paperWidth = paperWidth; this.paperHeight = paperHeight; this.templateFile = templateFile; DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape); dateTime = DateTime.Now; if ((unsortedResults != null) && (unsortedResults.Count != 0) && (unsortedResults[0].MetersKind == MetersKind.Single)) { resultItems = Config.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_SingleWM); combined = false; } else { resultItems = Config.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_CombinedWM); combined = true; } /// Set print area size and margins (in dots using 80 dpi) int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; int leftMargin = base.DefaultPageSettings.Margins.Left; /// X int topMargin = base.DefaultPageSettings.Margins.Top; /// Y /// Check if the user selected to print in Landscape mode /// if they did then we need to swap height/width parameters if (DefaultPageSettings.Landscape) { int tmp = printHeight; printHeight = printWidth; printWidth = tmp; } /// One watermeter per label/page nrPages = (combined ? Config.Data.CompoundWMsCount : Config.Data.WMsCount); pageNr = 1; nextWMNr = 0; } /// /// Override the default onbeginPrint method of the PrintDocument Object /// /// /// protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) { base.OnBeginPrint(e); if (font == null) { font = new Font(FontFamilyName, FontSize, FontStyle.Regular); } } /// /// Override the default OnPrintPage method of the PrintDocument. /// /// /// This provides the print logic for our document protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) { /// Run base code base.OnPrintPage(e); if (File.Exists(templateFile)) { Image img = Image.FromFile(templateFile); e.Graphics.DrawImage(new Bitmap(img), new Rectangle(0, 0, paperWidth, paperHeight)); } /// Set print area size and margins (in dots using 80 dpi) int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; int leftMargin = base.DefaultPageSettings.Margins.Left; /// X int topMargin = base.DefaultPageSettings.Margins.Top; /// Y /// Check if the user selected to print in Landscape mode /// if they did then we need to swap height/width parameters if (base.DefaultPageSettings.Landscape) { int tmp = printHeight; printHeight = printWidth; printWidth = tmp; } int x = leftMargin; int y = topMargin; /// Use the StringFormat class for the text layout of our document StringFormat format = new StringFormat(StringFormatFlags.LineLimit); ///-------- /// Body ///-------- if (combined) { PrintCombinedWM(e, nextWMNr + 1); nextWMNr++; e.HasMorePages = (nextWMNr < Config.Data.CompoundWMsCount); } else { /// Skip disabled water meters while ((nextWMNr < Config.Data.WMsCount) && unsortedResults[0].Meters[nextWMNr].Disabled) nextWMNr++; if (nextWMNr < Config.Data.WMsCount) { PrintSingleWM(e, nextWMNr); bool anyMore = false; for (int i = nextWMNr + 1; i < Config.Data.WMsCount; i++) { if (!unsortedResults[0].Meters[i].Disabled) { anyMore = true; break; } } e.HasMorePages = anyMore; } nextWMNr++; } } /// /// Print one water meter results /// /// Water meter number (0-based) void PrintSingleWM(System.Drawing.Printing.PrintPageEventArgs e, int wmNr) { /// Serial number if (!string.IsNullOrEmpty(unsortedResults[0].Meters[wmNr].SerialNr)) { PrintAt(e, 20, 62, unsortedResults[0].Meters[wmNr].SerialNr); } /// Watermeter type PrintAt(e, 20, 74, unsortedResults[0].ProtocolTitle); /// Date string dateTimeStr = string.Format("{0}/{1}/{2}", dateTime.Day.ToString("D2"), dateTime.Month.ToString("D2"), (dateTime.Year % 100).ToString("D2")); PrintAt(e, 135, 74, dateTimeStr); IList results = Utils.GetSortedTestResults(procedure, unsortedResults, Utils.PartNr(wmNr+1, combined)); for (int printPosition = 1; printPosition <= 3; printPosition++) { for (int r = 0; r < results.Count; r++) { if (results[r] != null && (r + 1) == printPosition) { if (resultItems.Count > 0) { string text = resultItems[0].Print(results[r].Meters[wmNr]); string[] texts = text.Split(new char[] { '|' }); if (texts.Length == 2) { Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); text = texts[0]; /// TODO: How to print colors? } PrintAt(e, 78, 6 + 14 * printPosition, string.Format("{0}%", text)); } } } } } /// /// Print one combined water meter results /// /// Water meter number (1-based) /// Top coordinate of watermeter data /// The height of the printed section void PrintCombinedWM(System.Drawing.Printing.PrintPageEventArgs e, int wmNr1) { /// Serial number if (!string.IsNullOrEmpty(unsortedResults[0].Meters[2 * wmNr1 - 2].SerialNr)) { PrintAt(e, 20, 62, unsortedResults[0].Meters[2 * wmNr1 - 2].SerialNr); } /// Watermeter type PrintAt(e, 20, 74, unsortedResults[0].ProtocolTitle); /// Date string dateTimeStr = string.Format("{0}/{1}/{2}", dateTime.Day.ToString("D2"), dateTime.Month.ToString("D2"), (dateTime.Year % 100).ToString("D2")); PrintAt(e, 135, 74, dateTimeStr); IList results = Utils.GetSortedTestResults(procedure, unsortedResults, Utils.PartNr(wmNr1, combined)); for (int printPosition = 1; printPosition <= 3; printPosition++) { for (int r = 0; r < results.Count; r++) { if (results[r] != null && (r + 1) == printPosition) { if (resultItems.Count > 0) { string text = resultItems[0].PrintCombined(results[r].Meters[2 * wmNr1 - 2], results[r].Meters[2 * wmNr1 - 1], results[r].CombinedMeters[wmNr1 - 1]); string[] texts = text.Split(new char[] { '|' }); if (texts.Length == 2) { Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); text = texts[0]; /// TODO: How to print colors? } PrintAt(e, 78, 6 + 14 * printPosition, string.Format("{0}%", text)); } } } } } void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) { PrintAt(e, p.X, p.Y, text); } void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) { RectangleF printArea = new RectangleF(x, y, 667, 18); e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); } } }