/// /// Copyright (c) 2017-2020 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Drawing.Printing; using System.Globalization; using System.Threading; using Results.Output.Printers.Enhanced; using log4net; namespace TBF.BenchControl.Output.Printers.Enhanced { public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter { private static readonly ILog log = LogManager.GetLogger(typeof(Printer)); public override string ToString() { return string.Format("Output.Printers.Enhanced({0})", Cfg.ToString(1)); } readonly PrinterCfg printerCfg; public bool SupressPrinting { get { return printerCfg.SupressPrinting; } } /// Data to print Results.Entities.Batch batch; /// /// Items to print /// string header; IList commonItems; IList testItems; string footer; public Printer() { } public Printer(Generic.IComponentCfg cfg) : base(cfg) { printerCfg = cfg as PrinterCfg; ApplyConfig(); log.Debug(this.ToString()); } void ApplyConfig() { header = string.IsNullOrEmpty(printerCfg.Header) ? string.Empty : printerCfg.Header.Replace("~", Environment.NewLine); commonItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.CommonItems); testItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.SelectedItems); /// TestID info will be overwritten later on footer = string.IsNullOrEmpty(printerCfg.Footer) ? string.Empty : printerCfg.Footer.Replace("~", Environment.NewLine); } #region Configuration Change Handling public static void OnCfgChange(object sender, CfgChangeArgs args) { if (CfgChangeHandler == null) return; try { CfgChangeHandler(sender, args); } catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } } public static event EventHandler CfgChangeHandler; public override void StartChangeHandler() { CfgChangeHandler += delegate(object sender, CfgChangeArgs args) { PrinterCfg newCfg = args.Cfg as PrinterCfg; if (newCfg != null && newCfg.Name.Equals(Name)) { if (args.Command == CfgChangeCmd.CfgChange) { printerCfg.PageOrientation = newCfg.PageOrientation; printerCfg.Template = newCfg.Template; printerCfg.TopMargin = newCfg.TopMargin; printerCfg.BottomMargin = newCfg.BottomMargin; printerCfg.LeftMargin = newCfg.LeftMargin; printerCfg.TitFntFml = newCfg.TitFntFml; printerCfg.TitFntSz = newCfg.TitFntSz; printerCfg.TitFntSty = newCfg.TitFntSty; printerCfg.HdrFntFml = newCfg.HdrFntFml; printerCfg.HdrFntSz = newCfg.HdrFntSz; printerCfg.HdrFntSty = newCfg.HdrFntSty; printerCfg.BodyFntFml = newCfg.BodyFntFml; printerCfg.BodyFntSz = newCfg.BodyFntSz; printerCfg.BodyFntSty = newCfg.BodyFntSty; printerCfg.FooterFntFml = newCfg.FooterFntFml; printerCfg.FooterFntSz = newCfg.FooterFntSz; printerCfg.FooterFntSty = newCfg.FooterFntSty; printerCfg.GoodOnly = newCfg.GoodOnly; printerCfg.SupressPrinting = newCfg.SupressPrinting; printerCfg.Culture = newCfg.Culture; printerCfg.CommonItems = newCfg.CommonItems; printerCfg.SelectedItems = newCfg.SelectedItems; printerCfg.Header = newCfg.Header; printerCfg.Footer = newCfg.Footer; printerCfg.DocName = newCfg.DocName; printerCfg.NrOfCopies = newCfg.NrOfCopies; printerCfg.BarcodeType = newCfg.BarcodeType; printerCfg.BarcodeWidth = newCfg.BarcodeWidth; printerCfg.BarcodeHeight = newCfg.BarcodeHeight; ApplyConfig(); } } }; } #endregion Configuration Change Handling /// /// Prints the test cycle results, Events: Event.ResultsPrinted /// /// Batch results to print /// Reference to the operation public IOperation ProcessResultsOp(Results.Entities.Batch batch) { this.batch = batch; return this; } /// Start this operation public void Start() { CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; if (printerCfg.Culture != Culture.system) { Thread.CurrentThread.CurrentCulture = new CultureInfo(printerCfg.Culture.ToString()); } string documentName; try { if (string.IsNullOrEmpty(printerCfg.DocName)) throw (new Exception()); documentName = string.Format(printerCfg.DocName, batch.StartTime, batch.EndTime, batch.BatchNr); } catch { documentName = string.Format("{0:yyyyMMdd-HHmm}", batch.EndTime); } PrintResults(batch, documentName); Thread.CurrentThread.CurrentCulture = oriCulture; } /// Run this operation /// Event.ResultsPrinted public Event Run() { return Event.ResultsPrinted; } /// Stop this operation public void Stop() { } void PrintResults(Results.Entities.Batch batch, string documentName) { if (batch.WaterMeters.Count > 0) { EnhancedPrinterCfg cfg = new EnhancedPrinterCfg { PageOrientation = printerCfg.PageOrientation, Template = printerCfg.Template, TopMargin = printerCfg.TopMargin, BottomMargin = printerCfg.BottomMargin, LeftMargin = printerCfg.LeftMargin, TitFntFml = printerCfg.TitFntFml, TitFntSz = printerCfg.TitFntSz, TitFntSty = printerCfg.TitFntSty, HdrFntFml = printerCfg.HdrFntFml, HdrFntSz = printerCfg.HdrFntSz, HdrFntSty = printerCfg.HdrFntSty, BodyFntFml = printerCfg.BodyFntFml, BodyFntSz = printerCfg.BodyFntSz, BodyFntSty = printerCfg.BodyFntSty, FooterFntFml = printerCfg.FooterFntFml, FooterFntSz = printerCfg.FooterFntSz, FooterFntSty = printerCfg.FooterFntSty, GoodOnly = printerCfg.GoodOnly, SupressPrinting = printerCfg.SupressPrinting, CultureInfo = (printerCfg.Culture == Culture.system) ? Thread.CurrentThread.CurrentCulture : new CultureInfo(printerCfg.Culture.ToString()), Header = printerCfg.Header, CommonItems = printerCfg.CommonItems, TestItems = printerCfg.SelectedItems, Footer = printerCfg.Footer, BarcodeType = printerCfg.BarcodeType, BarcodeWidth = printerCfg.BarcodeWidth, BarcodeHeight = printerCfg.BarcodeHeight, }; for (int i = 1; i <= printerCfg.NrOfCopies; i++) { string docName = string.Format(((printerCfg.NrOfCopies == 1) ? "{0}" : "{0}-{1}"), documentName, i); new Results.Output.Printers.Enhanced.EnhancedPrintDocument(batch, cfg, docName).Print(); } } } } }