/// /// Copyright (c) 2017 Sensus Metering Systems /// using System; using System.Collections.Generic; 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("ResultsPrinters.Basic({0})", Cfg.ToString(1)); } readonly PrinterCfg printerCfg; public bool SupressPrinting { get { return printerCfg.SupressPrinting; } } /// /// Items to print /// string header; IList commonItems; IList testItems; string footer; Thread thread; /// Thread where results are printed bool completed; /// Set to 'true' by the thread when printing results is completed bool abort; /// Set to 'true' by Stop() operation to abort printing results 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.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.SupressPrinting = newCfg.SupressPrinting; printerCfg.Culture = newCfg.Culture; printerCfg.CommonItems = newCfg.CommonItems; printerCfg.SelectedItems = newCfg.SelectedItems; printerCfg.Header = newCfg.Header; printerCfg.Footer = newCfg.Footer; ApplyConfig(); } } }; } #endregion Configuration Change Handling /// /// Prints the test cycle results, Events: Event.ResultsPrinted /// /// Batch results to print /// Reference to the operation public IOperation PrintResultsOp(Results.Entities.Batch batch) { thread = new Thread(() => { PrintResults(batch); completed = true; }); thread.CurrentCulture = Thread.CurrentThread.CurrentCulture; thread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture; if (printerCfg.Culture > Culture.system && printerCfg.Culture < Culture.Count) { thread.CurrentCulture = new CultureInfo(printerCfg.Culture.ToString()); } return this; } /// Start this operation public void Start() { completed = false; abort = false; thread.Start(); } /// Run this operation /// Event.ResultsPrinted public Event Run() { if (completed) return Event.ResultsPrinted; else return Event.Busy; } /// Stop this operation public void Stop() { if (!completed) abort = true; } void PrintResults(Results.Entities.Batch batch) { CultureInfo culture = Thread.CurrentThread.CurrentCulture; try { culture = new System.Globalization.CultureInfo(printerCfg.Culture.ToString()); } catch { } if (batch.WaterMeters.Count > 0) { EnhancedPrinterCfg cfg = new EnhancedPrinterCfg { PageOrientation = printerCfg.PageOrientation, TopMargin = printerCfg.TopMargin, BottomMargin = printerCfg.BottomMargin, LeftMargin = printerCfg.LeftMargin, TitFntFml = printerCfg.TitFntFml, HdrFntFml = printerCfg.HdrFntFml, BodyFntFml = printerCfg.BodyFntFml, TitFntSz = printerCfg.TitFntSz, HdrFntSz = printerCfg.HdrFntSz, BodyFntSz = printerCfg.BodyFntSz, TitFntSty = printerCfg.TitFntSty, HdrFntSty = printerCfg.HdrFntSty, BodyFntSty = printerCfg.BodyFntSty, SupressPrinting = printerCfg.SupressPrinting, CultureInfo = culture, Header = printerCfg.Header, CommonItems = printerCfg.CommonItems, TestItems = printerCfg.SelectedItems, Footer = printerCfg.Footer, }; new Results.Output.Printers.Enhanced.EnhancedPrintDocument(batch, cfg).Print(); } } } }