From 2e1d497aad57fc07f979a06ced3ba9cb8a70c06a Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Thu, 21 Sep 2017 08:59:08 +0200 Subject: [PATCH] (1) Output.Printers.Zapiska introduced, (2) Kempno component upgraded, dated 13..9.2017 --- .../Printers/Zapiska/ZapiskaPrintDocument.cs | 380 ++++++++++++ .../Printers/Zapiska/ZapiskaPrinterCfg.cs | 37 ++ Results/Results.csproj | 4 + .../Printers/Zapiska/FactoryCompound.cs | 26 + .../Printers/Zapiska/FactoryHeatMeters.cs | 26 + .../Output/Printers/Zapiska/FactorySingle.cs | 26 + .../Output/Printers/Zapiska/Printer.cs | 199 +++++++ .../Output/Printers/Zapiska/PrinterCfg.cs | 90 +++ .../Zapiska/PrinterCfgCtrl.Designer.cs | 544 ++++++++++++++++++ .../Output/Printers/Zapiska/PrinterCfgCtrl.cs | 478 +++++++++++++++ .../Printers/Zapiska/PrinterCfgCtrl.resx | 120 ++++ .../BenchControl/TbfComponents.cs | 3 + TestBenchFramework/TBF.csproj | 14 + .../Kempno_50/ControlComponent3U.dll | Bin 410624 -> 411648 bytes 14 files changed, 1947 insertions(+) create mode 100644 Results/Output/Printers/Zapiska/ZapiskaPrintDocument.cs create mode 100644 Results/Output/Printers/Zapiska/ZapiskaPrinterCfg.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactoryCompound.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactoryHeatMeters.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactorySingle.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/Zapiska/Printer.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfg.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.Designer.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.resx diff --git a/Results/Output/Printers/Zapiska/ZapiskaPrintDocument.cs b/Results/Output/Printers/Zapiska/ZapiskaPrintDocument.cs new file mode 100644 index 000000000..94dc4ea3d --- /dev/null +++ b/Results/Output/Printers/Zapiska/ZapiskaPrintDocument.cs @@ -0,0 +1,380 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using System.IO; +using Config.Entities; +using Results.Resources; + +namespace Results.Output.Printers.Zapiska +{ + public class ZapiskaPrintDocument : PrintDocument + { + /// Size of the printed area without margins, after taking into account 'pageOrientation' + readonly int printHeight; + readonly int printWidth; + + readonly int topMargin; + readonly int bottomMargin; + readonly int leftMargin; + readonly int leftMargin2; + readonly int leftMargin3; + readonly int TitleX; + readonly int TitleY; /// Depends on the size of the header + + readonly int SpacingOne; + readonly int SpacingOneAndHalf; + readonly int SpacingOne4Header; + readonly int SpacingOneAndHalf4Header; + + int CommonTop; /// = TitleY + 60 + int BodyTop; /// = HdrTop + 160 + /// + int titleHeight; + int commonHeight; + + /// + /// Property variable for the Font the user wishes to use + /// + Font font; + Font headerFont; + Font titleFont; + + /// + /// Data to print + /// + Results.Entities.Batch batch; + + ZapiskaPrinterCfg cfg; + + /// + /// Items to print + /// + string header; + IList commonItems1; + IList commonItems2; + IList commonItems3; + IList testItems; + string footer; + + /// + /// Layout and status + /// + int nrWMsOnFirstPage; + int nrWMsOnNextPage; + 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 ZapiskaPrintDocument(Results.Entities.Batch batch, ZapiskaPrinterCfg cfg) + { + this.batch = batch; + + this.cfg = cfg; + topMargin = cfg.TopMargin; + bottomMargin = cfg.BottomMargin; + leftMargin = cfg.LeftMargin; + + header = string.IsNullOrEmpty(cfg.Header) ? string.Empty : cfg.Header.Replace("~", Environment.NewLine); + commonItems1 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems1); + commonItems2 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems2); + commonItems3 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems3); + testItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.TestItems); /// TestID info will be overwritten later on + footer = string.IsNullOrEmpty(cfg.Footer) ? string.Empty : cfg.Footer.Replace("~", Environment.NewLine); + + /// Initialize fonts + titleFont = new Font((cfg.TitFntFml != null ? cfg.TitFntFml : "Arial"), (cfg.TitFntSz > 0 ? cfg.TitFntSz : 10), (FontStyle)cfg.TitFntSty); + headerFont = new Font((cfg.HdrFntFml != null ? cfg.HdrFntFml : "Arial"), (cfg.HdrFntSz > 0 ? cfg.HdrFntSz : 10), (FontStyle)cfg.HdrFntSty); + font = new Font((cfg.BodyFntFml != null ? cfg.BodyFntFml : "Arial"), (cfg.BodyFntSz > 0 ? cfg.BodyFntSz : 10), (FontStyle)cfg.BodyFntSty); + + /// Set print area size and margins (in dots using 100 dpi) + DefaultPageSettings.Landscape = (cfg.PageOrientation == PageOrientation.Landscape); + /// + if (DefaultPageSettings.Landscape) + { + printHeight = base.DefaultPageSettings.PaperSize.Width - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Height - leftMargin - leftMargin; + } + else + { + printHeight = base.DefaultPageSettings.PaperSize.Height - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Width - leftMargin - leftMargin; + } + + leftMargin2 = leftMargin + (int)(printWidth * cfg.ColW1Pct / 100.0f); + leftMargin3 = leftMargin + (int)(printWidth * (cfg.ColW1Pct + cfg.ColW2Pct) / 100.0f); + + SpacingOne = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", font).Height; + SpacingOneAndHalf = (3 * SpacingOne) / 2; + SpacingOne4Header = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", headerFont).Height; + SpacingOneAndHalf4Header = (3 * SpacingOne4Header) / 2; + + /// Calculate the tests count + int testsCount = 0; + if (batch.WaterMeters.Count > 0) + { + foreach (var mtr in batch.WaterMeters[0].MeterTestRslts) + { + if (mtr.Publish() == Config.Entities.Publish.Always && mtr.IsPilotRslt()) testsCount++; + } + } + + /// Prepare document outline + TitleX = cfg.LeftMargin; + TitleY = cfg.TopMargin; + + titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height; + CommonTop = TitleY + titleHeight + SpacingOne4Header; + + int commonCount = Math.Max(commonItems1.Count, Math.Max(commonItems2.Count, commonItems3.Count)); + commonHeight = commonCount * SpacingOne; + BodyTop = CommonTop + commonHeight + SpacingOne4Header; + + int wmSectionHeight = (testsCount + 1) * SpacingOne + 3 * SpacingOne4Header; + + nrWMsOnFirstPage = (printHeight - BodyTop + TitleY - 2 * SpacingOne) / wmSectionHeight; + nrWMsOnNextPage = (printHeight - 2 * SpacingOne) / wmSectionHeight; + nrWMsOnNextPage = Math.Max(nrWMsOnNextPage, 1); /// Prevent division by zero if there are too many WM tests + + nrPages = 1 + (batch.WaterMeters.Count - nrWMsOnFirstPage + nrWMsOnNextPage - 1) / nrWMsOnNextPage; + + 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); + } + + /// + /// 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("C:\\TBF\\header.png")) + { + Image img = Image.FromFile("C:\\TBF\\header.png"); + e.Graphics.DrawImage(new Bitmap(img), new Rectangle(0, 0, 827, 1169)); + } + + /// Use the StringFormat class for the text layout of our document + StringFormat format = new StringFormat(StringFormatFlags.LineLimit); + + if (pageNr == 1) + { + ///---------- + /// Title + ///---------- + RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, titleHeight); + e.Graphics.DrawString(header, titleFont, Brushes.Black, printArea); + + ///---------------- + /// Common items + ///---------------- + for (int n = 1; n <= 3; n++) + { + IList commonItems; + int lMargin; + switch (n) + { + default: + case 1: commonItems = commonItems1; lMargin = leftMargin; break; + case 2: commonItems = commonItems2; lMargin = leftMargin2; break; + case 3: commonItems = commonItems3; lMargin = leftMargin3; break; + } + + if (commonItems.Count == 0) continue; /// Common part is empty + + string[] leftColumn = new string[commonItems.Count]; + string[] rightColumn = new string[commonItems.Count]; + + int cnt = 0; + foreach (var v in commonItems) + { + leftColumn[cnt] = v.Caption; + rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty; + cnt++; + } + + /// Determine left column width + int leftColWidth = 0; + foreach (var s in leftColumn) + { + int itemWidth = (int)e.Graphics.MeasureString(s, font).Width; + if (itemWidth > leftColWidth) leftColWidth = itemWidth; + } + + /// Write aligned columns + for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) + { + PrintAt(e, lMargin, CommonTop + SpacingOne * i, leftColumn[i]); + PrintAt(e, lMargin + leftColWidth + 30, CommonTop + SpacingOne * i, rightColumn[i]); + } + } + } + + ///-------- + /// Body + ///-------- + + /// This variable represents the top coordinate of the area where WM results are printed + /// and it is updated (increased by) the value returned by PrintXyzWM() - the section size. + int nextWmTop = (pageNr == 1) ? BodyTop : TitleY; + + int nrWMsOnPage = (pageNr == 1) ? nrWMsOnFirstPage : nrWMsOnNextPage; + + for (int wmNr = nextWMNr; wmNr < Math.Min(nextWMNr + nrWMsOnPage, batch.WaterMeters.Count); wmNr++) /// wmNr is 0-based + { + int wmPosition = true ? batch.WaterMeters[wmNr].WMPosition : (wmNr + 1); + nextWmTop += PrintWM(e, batch.WaterMeters[wmNr], wmPosition, nextWmTop); + } + + nextWMNr += nrWMsOnPage; + e.HasMorePages = (nextWMNr < batch.WaterMeters.Count); + + ///---------- + /// Footer + ///---------- + int footerWidth = (int)e.Graphics.MeasureString(footer, font).Width; + PrintAt(e, leftMargin + (printWidth - footerWidth) / 2, topMargin + printHeight - 2 * SpacingOne, footer); + + string pageNrText = string.Format("{0} {1}/{2}", Strings.Page, pageNr++, nrPages); + int pageNrWidth = (int)e.Graphics.MeasureString(pageNrText, font).Width; + PrintAt(e, leftMargin + (printWidth - pageNrWidth) / 2, topMargin + printHeight - SpacingOne, pageNrText); + } + + + /// + /// Print one water meter results + /// + /// Water meter + /// Number of the water meter printed + /// Top coordinate of watermeter data + /// The height of the printed section + int PrintWM(System.Drawing.Printing.PrintPageEventArgs e, + Results.Entities.WaterMeter wm, int printedWMNr, int top) + { + /// Determin column widths + float[] columnPos = new float[testItems.Count + 1]; + columnPos[0] = (float)leftMargin; + + for (int i = 0; i < testItems.Count; i++) + { + float columnWidth = e.Graphics.MeasureString(testItems[i].Caption, headerFont).Width; + foreach (var mtr in wm.MeterTestRslts) + { + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + string itemText = testItems[i].Print(wm, mtr.Name()); + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + float width = e.Graphics.MeasureString(itemText, font).Width; + if (width > columnWidth) columnWidth = width; + } + } + columnPos[i + 1] = columnPos[i] + columnWidth + 20.0f; + } + int tableLeftX = (int)columnPos[0]; + int tableRightX = (int)columnPos[testItems.Count] - 20; + + string wmText = string.Format("{0} {1}", Strings.Water_Meter, printedWMNr); + PrintHeaderAt(e, leftMargin, top, wmText); + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + PrintHeaderAt(e, leftMargin + (int)e.Graphics.MeasureString(wmText, headerFont).Width, top, + string.Format(" {0} = {1}", Strings.sn, wm.SerialNr)); + } + + /// Horizontal line + int horY = top + SpacingOneAndHalf4Header; + e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); + + for (int i = 0; i < testItems.Count; i++) + { + PrintHeaderAt(e, (int)columnPos[i], top + (int)(1.6 * SpacingOne4Header), testItems[i].Caption); + } + + /// Horizontal line + horY = top + (int)(2.8 * SpacingOne4Header); + e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); + + int testsCount = 0; + foreach (var mtr in wm.MeterTestRslts) + { + if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always)) + { + testsCount++; + for (int i = 0; i < testItems.Count; i++) + { + string itemText = testItems[i].Print(wm, mtr.Name()); + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) + { + itemText = texts[0]; + Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); + /// TODO: How to print colors? + } + + PrintAt(e, (int)columnPos[i], top + 2 * SpacingOne4Header + SpacingOne * testsCount, itemText); + } + } + } + + /// Horizontal line + horY = top + 2 * SpacingOneAndHalf4Header + SpacingOne * testsCount; + e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); + + return (testsCount + 1) * SpacingOne + 3 * SpacingOne4Header; + } + + + 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, 2000, SpacingOne); + e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); + } + + + void PrintHeaderAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintHeaderAt(e, p.X, p.Y, text); + } + + + void PrintHeaderAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne4Header); + e.Graphics.DrawString(text, this.headerFont, Brushes.Black, printArea); + } + } +} diff --git a/Results/Output/Printers/Zapiska/ZapiskaPrinterCfg.cs b/Results/Output/Printers/Zapiska/ZapiskaPrinterCfg.cs new file mode 100644 index 000000000..edd5f5646 --- /dev/null +++ b/Results/Output/Printers/Zapiska/ZapiskaPrinterCfg.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Results.Output.Printers.Zapiska +{ + public class ZapiskaPrinterCfg + { + public Config.Entities.PageOrientation PageOrientation; + public int TopMargin; + public int BottomMargin; + public int LeftMargin; + public string TitFntFml; + public int TitFntSz; + public int TitFntSty; + public string HdrFntFml; + public int HdrFntSz; + public int HdrFntSty; + public string BodyFntFml; + public int BodyFntSz; + public int BodyFntSty; + public bool SupressPrinting; /// Bypass printing when true + public System.Globalization.CultureInfo CultureInfo; + public int ColW1Pct; + public int ColW2Pct; + public string[] CommonItems1; + public string[] CommonItems2; + public string[] CommonItems3; + public string[] TestItems; + public string Header; /// =Title + public string Footer; + } +} diff --git a/Results/Results.csproj b/Results/Results.csproj index 9cabccef7..061082460 100644 --- a/Results/Results.csproj +++ b/Results/Results.csproj @@ -111,6 +111,10 @@ Component + + Component + + diff --git a/TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactoryCompound.cs b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactoryCompound.cs new file mode 100644 index 000000000..a5439d061 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactoryCompound.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public class FactoryCompound : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.Zapiska.Compound", this, Config.Entities.MetersKind.Combined); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactoryHeatMeters.cs b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactoryHeatMeters.cs new file mode 100644 index 000000000..d58d02228 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactoryHeatMeters.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public class FactoryHeatMeters : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.Zapiska.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactorySingle.cs b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactorySingle.cs new file mode 100644 index 000000000..ac07ae640 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/FactorySingle.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.Zapiska.Single", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/Printers/Zapiska/Printer.cs b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/Printer.cs new file mode 100644 index 000000000..41a9c580e --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/Printer.cs @@ -0,0 +1,199 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using Results.Output.Printers.Zapiska; +using log4net; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + 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.CommonItems1); + 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.Header = newCfg.Header; + printerCfg.ColW1Pct = newCfg.ColW1Pct; + printerCfg.ColW2Pct = newCfg.ColW2Pct; + printerCfg.CommonItems1 = newCfg.CommonItems1; + printerCfg.CommonItems2 = newCfg.CommonItems2; + printerCfg.CommonItems3 = newCfg.CommonItems3; + printerCfg.SelectedItems = newCfg.SelectedItems; + 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) + { + ZapiskaPrinterCfg cfg = new ZapiskaPrinterCfg { + 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, + ColW1Pct = printerCfg.ColW1Pct, + ColW2Pct = printerCfg.ColW2Pct, + CommonItems1 = printerCfg.CommonItems1, + CommonItems2 = printerCfg.CommonItems2, + CommonItems3 = printerCfg.CommonItems3, + TestItems = printerCfg.SelectedItems, + Footer = printerCfg.Footer, + }; + + new Results.Output.Printers.Zapiska.ZapiskaPrintDocument(batch, cfg).Print(); + } + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfg.cs b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfg.cs new file mode 100644 index 000000000..922293b9d --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfg.cs @@ -0,0 +1,90 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public PageOrientation PageOrientation; + public int TopMargin; + public int BottomMargin; + public int LeftMargin; + public string TitFntFml; + public string HdrFntFml; + public string BodyFntFml; + public int TitFntSz; + public int HdrFntSz; + public int BodyFntSz; + public int TitFntSty; + public int HdrFntSty; + public int BodyFntSty; + public bool SupressPrinting; /// Bypass printing when true + public Culture Culture; + public int ColW1Pct; + public int ColW2Pct; + public string[] CommonItems1; + public string[] CommonItems2; + public string[] CommonItems3; + public string[] SelectedItems; + public string Header; /// =Title + public string Footer; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + PrinterCfg() + { + } + + public PrinterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + PageOrientation = PageOrientation.Portrait; + TopMargin = 100; + BottomMargin = 100; + LeftMargin = 100; + TitFntFml = "Arial"; + TitFntSz = 18; + TitFntSty = 1; + TitFntFml = "Arial"; + TitFntSz = 10; + TitFntSty = 0; + TitFntFml = "Arial"; + TitFntSz = 10; + TitFntSty = 0; + SupressPrinting = false; + Header = string.Empty; + Footer = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Orientation={1}, Margins T={2} B={3} L={4}, SupressPrinting={5}", + Name, + PageOrientation, + TopMargin, + BottomMargin, + LeftMargin, + SupressPrinting ? "yes" : "no" + ); + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.Designer.cs b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.Designer.cs new file mode 100644 index 000000000..cd94e07cd --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.Designer.cs @@ -0,0 +1,544 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + partial class PrinterCfgCtrl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox(); + this.orientationLabel = new System.Windows.Forms.Label(); + this.orientationComboBox = new System.Windows.Forms.ComboBox(); + this.topMarginTextBox = new System.Windows.Forms.TextBox(); + this.topMarginLabel = new System.Windows.Forms.Label(); + this.leftMarginTextBox = new System.Windows.Forms.TextBox(); + this.bottomMarginTextBox = new System.Windows.Forms.TextBox(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.commonItems1Button = new System.Windows.Forms.Button(); + this.footerButton = new System.Windows.Forms.Button(); + this.headerButton = new System.Windows.Forms.Button(); + this.testItemsButton = new System.Windows.Forms.Button(); + this.headerFontLabel = new System.Windows.Forms.Label(); + this.titleFontLabel = new System.Windows.Forms.Label(); + this.titleFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.headerFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.bodyFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.bodyFontLabel = new System.Windows.Forms.Label(); + this.titleFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.headerFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.bodyFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.titleBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.titleItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.headerItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.headerBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.bodyItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.bodyBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.commonItems2Button = new System.Windows.Forms.Button(); + this.commonItems3Button = new System.Windows.Forms.Button(); + this.colW2TextBox = new System.Windows.Forms.TextBox(); + this.colW1TextBox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(142, 40); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(218, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(16, 43); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(139, 16); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // supressPrintingCheckBox + // + this.supressPrintingCheckBox.AutoSize = true; + this.supressPrintingCheckBox.Enabled = false; + this.supressPrintingCheckBox.Location = new System.Drawing.Point(19, 313); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 38; + this.supressPrintingCheckBox.Text = "Supress printing"; + this.supressPrintingCheckBox.UseVisualStyleBackColor = true; + // + // orientationLabel + // + this.orientationLabel.AutoSize = true; + this.orientationLabel.Location = new System.Drawing.Point(16, 67); + this.orientationLabel.Name = "orientationLabel"; + this.orientationLabel.Size = new System.Drawing.Size(84, 13); + this.orientationLabel.TabIndex = 3; + this.orientationLabel.Text = "Page orientation"; + // + // orientationComboBox + // + this.orientationComboBox.Enabled = false; + this.orientationComboBox.FormattingEnabled = true; + this.orientationComboBox.Location = new System.Drawing.Point(142, 64); + this.orientationComboBox.Name = "orientationComboBox"; + this.orientationComboBox.Size = new System.Drawing.Size(218, 21); + this.orientationComboBox.TabIndex = 4; + // + // topMarginTextBox + // + this.topMarginTextBox.Enabled = false; + this.topMarginTextBox.Location = new System.Drawing.Point(142, 89); + this.topMarginTextBox.Name = "topMarginTextBox"; + this.topMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.topMarginTextBox.TabIndex = 6; + // + // topMarginLabel + // + this.topMarginLabel.AutoSize = true; + this.topMarginLabel.Location = new System.Drawing.Point(16, 92); + this.topMarginLabel.Name = "topMarginLabel"; + this.topMarginLabel.Size = new System.Drawing.Size(116, 13); + this.topMarginLabel.TabIndex = 5; + this.topMarginLabel.Text = "Top/bottom/left margin"; + // + // leftMarginTextBox + // + this.leftMarginTextBox.Enabled = false; + this.leftMarginTextBox.Location = new System.Drawing.Point(244, 89); + this.leftMarginTextBox.Name = "leftMarginTextBox"; + this.leftMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.leftMarginTextBox.TabIndex = 8; + // + // bottomMarginTextBox + // + this.bottomMarginTextBox.Enabled = false; + this.bottomMarginTextBox.Location = new System.Drawing.Point(193, 89); + this.bottomMarginTextBox.Name = "bottomMarginTextBox"; + this.bottomMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.bottomMarginTextBox.TabIndex = 7; + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(142, 185); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(218, 21); + this.cultureComboBox.TabIndex = 26; + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(16, 188); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 25; + this.cultureLabel.Text = "Cullture"; + // + // commonItems1Button + // + this.commonItems1Button.Enabled = false; + this.commonItems1Button.Location = new System.Drawing.Point(142, 259); + this.commonItems1Button.Name = "commonItems1Button"; + this.commonItems1Button.Size = new System.Drawing.Size(70, 23); + this.commonItems1Button.TabIndex = 33; + this.commonItems1Button.Text = "Common 1"; + this.commonItems1Button.UseVisualStyleBackColor = true; + this.commonItems1Button.Click += new System.EventHandler(this.commonItems1Button_Click); + // + // footerButton + // + this.footerButton.Enabled = false; + this.footerButton.Location = new System.Drawing.Point(142, 309); + this.footerButton.Name = "footerButton"; + this.footerButton.Size = new System.Drawing.Size(218, 23); + this.footerButton.TabIndex = 37; + this.footerButton.Text = "Footer"; + this.footerButton.UseVisualStyleBackColor = true; + this.footerButton.Click += new System.EventHandler(this.footerButton_Click); + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(142, 209); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(218, 23); + this.headerButton.TabIndex = 27; + this.headerButton.Text = "Title"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // testItemsButton + // + this.testItemsButton.Enabled = false; + this.testItemsButton.Location = new System.Drawing.Point(142, 284); + this.testItemsButton.Name = "testItemsButton"; + this.testItemsButton.Size = new System.Drawing.Size(218, 23); + this.testItemsButton.TabIndex = 36; + this.testItemsButton.Text = "Test items"; + this.testItemsButton.UseVisualStyleBackColor = true; + this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); + // + // headerFontLabel + // + this.headerFontLabel.AutoSize = true; + this.headerFontLabel.Location = new System.Drawing.Point(16, 140); + this.headerFontLabel.Name = "headerFontLabel"; + this.headerFontLabel.Size = new System.Drawing.Size(112, 13); + this.headerFontLabel.TabIndex = 14; + this.headerFontLabel.Text = "Header font/size/style"; + // + // titleFontLabel + // + this.titleFontLabel.AutoSize = true; + this.titleFontLabel.Location = new System.Drawing.Point(16, 116); + this.titleFontLabel.Name = "titleFontLabel"; + this.titleFontLabel.Size = new System.Drawing.Size(97, 13); + this.titleFontLabel.TabIndex = 9; + this.titleFontLabel.Text = "Title font/size/style"; + // + // titleFontFamilyComboBox + // + this.titleFontFamilyComboBox.Enabled = false; + this.titleFontFamilyComboBox.FormattingEnabled = true; + this.titleFontFamilyComboBox.Location = new System.Drawing.Point(142, 113); + this.titleFontFamilyComboBox.Name = "titleFontFamilyComboBox"; + this.titleFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.titleFontFamilyComboBox.TabIndex = 10; + // + // headerFontFamilyComboBox + // + this.headerFontFamilyComboBox.Enabled = false; + this.headerFontFamilyComboBox.FormattingEnabled = true; + this.headerFontFamilyComboBox.Location = new System.Drawing.Point(142, 137); + this.headerFontFamilyComboBox.Name = "headerFontFamilyComboBox"; + this.headerFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.headerFontFamilyComboBox.TabIndex = 15; + // + // bodyFontFamilyComboBox + // + this.bodyFontFamilyComboBox.Enabled = false; + this.bodyFontFamilyComboBox.FormattingEnabled = true; + this.bodyFontFamilyComboBox.Location = new System.Drawing.Point(142, 161); + this.bodyFontFamilyComboBox.Name = "bodyFontFamilyComboBox"; + this.bodyFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.bodyFontFamilyComboBox.TabIndex = 20; + // + // bodyFontLabel + // + this.bodyFontLabel.AutoSize = true; + this.bodyFontLabel.Location = new System.Drawing.Point(16, 164); + this.bodyFontLabel.Name = "bodyFontLabel"; + this.bodyFontLabel.Size = new System.Drawing.Size(101, 13); + this.bodyFontLabel.TabIndex = 19; + this.bodyFontLabel.Text = "Body font/size/style"; + // + // titleFontSizeTextBox + // + this.titleFontSizeTextBox.Enabled = false; + this.titleFontSizeTextBox.Location = new System.Drawing.Point(258, 113); + this.titleFontSizeTextBox.Name = "titleFontSizeTextBox"; + this.titleFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.titleFontSizeTextBox.TabIndex = 11; + // + // headerFontSizeTextBox + // + this.headerFontSizeTextBox.Enabled = false; + this.headerFontSizeTextBox.Location = new System.Drawing.Point(258, 137); + this.headerFontSizeTextBox.Name = "headerFontSizeTextBox"; + this.headerFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.headerFontSizeTextBox.TabIndex = 16; + // + // bodyFontSizeTextBox + // + this.bodyFontSizeTextBox.Enabled = false; + this.bodyFontSizeTextBox.Location = new System.Drawing.Point(258, 161); + this.bodyFontSizeTextBox.Name = "bodyFontSizeTextBox"; + this.bodyFontSizeTextBox.Size = new System.Drawing.Size(29, 20); + this.bodyFontSizeTextBox.TabIndex = 21; + // + // titleBoldCheckBox + // + this.titleBoldCheckBox.AutoSize = true; + this.titleBoldCheckBox.Enabled = false; + this.titleBoldCheckBox.Location = new System.Drawing.Point(306, 116); + this.titleBoldCheckBox.Name = "titleBoldCheckBox"; + this.titleBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.titleBoldCheckBox.TabIndex = 12; + this.titleBoldCheckBox.UseVisualStyleBackColor = true; + // + // titleItalicCheckBox + // + this.titleItalicCheckBox.AutoSize = true; + this.titleItalicCheckBox.Enabled = false; + this.titleItalicCheckBox.Location = new System.Drawing.Point(334, 116); + this.titleItalicCheckBox.Name = "titleItalicCheckBox"; + this.titleItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.titleItalicCheckBox.TabIndex = 13; + this.titleItalicCheckBox.UseVisualStyleBackColor = true; + // + // headerItalicCheckBox + // + this.headerItalicCheckBox.AutoSize = true; + this.headerItalicCheckBox.Enabled = false; + this.headerItalicCheckBox.Location = new System.Drawing.Point(334, 140); + this.headerItalicCheckBox.Name = "headerItalicCheckBox"; + this.headerItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.headerItalicCheckBox.TabIndex = 18; + this.headerItalicCheckBox.UseVisualStyleBackColor = true; + // + // headerBoldCheckBox + // + this.headerBoldCheckBox.AutoSize = true; + this.headerBoldCheckBox.Enabled = false; + this.headerBoldCheckBox.Location = new System.Drawing.Point(306, 140); + this.headerBoldCheckBox.Name = "headerBoldCheckBox"; + this.headerBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.headerBoldCheckBox.TabIndex = 17; + this.headerBoldCheckBox.UseVisualStyleBackColor = true; + // + // bodyItalicCheckBox + // + this.bodyItalicCheckBox.AutoSize = true; + this.bodyItalicCheckBox.Enabled = false; + this.bodyItalicCheckBox.Location = new System.Drawing.Point(334, 164); + this.bodyItalicCheckBox.Name = "bodyItalicCheckBox"; + this.bodyItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.bodyItalicCheckBox.TabIndex = 23; + this.bodyItalicCheckBox.UseVisualStyleBackColor = true; + // + // bodyBoldCheckBox + // + this.bodyBoldCheckBox.AutoSize = true; + this.bodyBoldCheckBox.Enabled = false; + this.bodyBoldCheckBox.Location = new System.Drawing.Point(306, 164); + this.bodyBoldCheckBox.Name = "bodyBoldCheckBox"; + this.bodyBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.bodyBoldCheckBox.TabIndex = 22; + this.bodyBoldCheckBox.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(296, 100); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(32, 13); + this.label1.TabIndex = 31; + this.label1.Text = "Bold"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(330, 100); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(24, 13); + this.label2.TabIndex = 32; + this.label2.Text = "Ital."; + // + // commonItems2Button + // + this.commonItems2Button.Enabled = false; + this.commonItems2Button.Location = new System.Drawing.Point(216, 259); + this.commonItems2Button.Name = "commonItems2Button"; + this.commonItems2Button.Size = new System.Drawing.Size(70, 23); + this.commonItems2Button.TabIndex = 34; + this.commonItems2Button.Text = "Common 2"; + this.commonItems2Button.UseVisualStyleBackColor = true; + this.commonItems2Button.Click += new System.EventHandler(this.commonItems2Button_Click); + // + // commonItems3Button + // + this.commonItems3Button.Enabled = false; + this.commonItems3Button.Location = new System.Drawing.Point(290, 259); + this.commonItems3Button.Name = "commonItems3Button"; + this.commonItems3Button.Size = new System.Drawing.Size(70, 23); + this.commonItems3Button.TabIndex = 35; + this.commonItems3Button.Text = "Common 3"; + this.commonItems3Button.UseVisualStyleBackColor = true; + this.commonItems3Button.Click += new System.EventHandler(this.commonItems3Button_Click); + // + // colW2TextBox + // + this.colW2TextBox.Enabled = false; + this.colW2TextBox.Location = new System.Drawing.Point(216, 236); + this.colW2TextBox.Name = "colW2TextBox"; + this.colW2TextBox.Size = new System.Drawing.Size(44, 20); + this.colW2TextBox.TabIndex = 31; + // + // colW1TextBox + // + this.colW1TextBox.Enabled = false; + this.colW1TextBox.Location = new System.Drawing.Point(142, 236); + this.colW1TextBox.Name = "colW1TextBox"; + this.colW1TextBox.Size = new System.Drawing.Size(44, 20); + this.colW1TextBox.TabIndex = 29; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(186, 239); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(15, 13); + this.label3.TabIndex = 30; + this.label3.Text = "%"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(260, 238); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(15, 13); + this.label4.TabIndex = 32; + this.label4.Text = "%"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(16, 239); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(97, 13); + this.label5.TabIndex = 28; + this.label5.Text = "Column widths in %"; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label5); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.colW2TextBox); + this.Controls.Add(this.colW1TextBox); + this.Controls.Add(this.commonItems3Button); + this.Controls.Add(this.commonItems2Button); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.bodyItalicCheckBox); + this.Controls.Add(this.bodyBoldCheckBox); + this.Controls.Add(this.headerItalicCheckBox); + this.Controls.Add(this.headerBoldCheckBox); + this.Controls.Add(this.titleItalicCheckBox); + this.Controls.Add(this.titleBoldCheckBox); + this.Controls.Add(this.bodyFontSizeTextBox); + this.Controls.Add(this.headerFontSizeTextBox); + this.Controls.Add(this.titleFontSizeTextBox); + this.Controls.Add(this.bodyFontFamilyComboBox); + this.Controls.Add(this.bodyFontLabel); + this.Controls.Add(this.headerFontFamilyComboBox); + this.Controls.Add(this.titleFontFamilyComboBox); + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.commonItems1Button); + this.Controls.Add(this.footerButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.testItemsButton); + this.Controls.Add(this.bottomMarginTextBox); + this.Controls.Add(this.titleFontLabel); + this.Controls.Add(this.leftMarginTextBox); + this.Controls.Add(this.headerFontLabel); + this.Controls.Add(this.topMarginTextBox); + this.Controls.Add(this.topMarginLabel); + this.Controls.Add(this.orientationComboBox); + this.Controls.Add(this.orientationLabel); + this.Controls.Add(this.supressPrintingCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PrinterCfgCtrl"; + this.Size = new System.Drawing.Size(400, 350); + this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox supressPrintingCheckBox; + private System.Windows.Forms.Label orientationLabel; + private System.Windows.Forms.ComboBox orientationComboBox; + private System.Windows.Forms.TextBox topMarginTextBox; + private System.Windows.Forms.Label topMarginLabel; + private System.Windows.Forms.TextBox leftMarginTextBox; + private System.Windows.Forms.TextBox bottomMarginTextBox; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.Button commonItems1Button; + private System.Windows.Forms.Button footerButton; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button testItemsButton; + private System.Windows.Forms.Label headerFontLabel; + private System.Windows.Forms.Label titleFontLabel; + private System.Windows.Forms.ComboBox titleFontFamilyComboBox; + private System.Windows.Forms.ComboBox headerFontFamilyComboBox; + private System.Windows.Forms.ComboBox bodyFontFamilyComboBox; + private System.Windows.Forms.Label bodyFontLabel; + private System.Windows.Forms.TextBox titleFontSizeTextBox; + private System.Windows.Forms.TextBox headerFontSizeTextBox; + private System.Windows.Forms.TextBox bodyFontSizeTextBox; + private System.Windows.Forms.CheckBox titleBoldCheckBox; + private System.Windows.Forms.CheckBox titleItalicCheckBox; + private System.Windows.Forms.CheckBox headerItalicCheckBox; + private System.Windows.Forms.CheckBox headerBoldCheckBox; + private System.Windows.Forms.CheckBox bodyItalicCheckBox; + private System.Windows.Forms.CheckBox bodyBoldCheckBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button commonItems2Button; + private System.Windows.Forms.Button commonItems3Button; + private System.Windows.Forms.TextBox colW2TextBox; + private System.Windows.Forms.TextBox colW1TextBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + } +} diff --git a/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.cs b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.cs new file mode 100644 index 000000000..a3848a628 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.cs @@ -0,0 +1,478 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public partial class PrinterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + PrinterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PrinterCfg; + Redraw(); + } + } + + string header; + string[] commonItems1; + string[] commonItems2; + string[] commonItems3; + string[] testItems; + string footer; + + public PrinterCfgCtrl() + { + InitializeComponent(); + Localize(); + + orientationComboBox.Items.Add(PageOrientation.Portrait.ToString()); + orientationComboBox.Items.Add(PageOrientation.Landscape.ToString()); + + foreach (var ff in System.Drawing.FontFamily.Families) + { + titleFontFamilyComboBox.Items.Add(ff.Name); + headerFontFamilyComboBox.Items.Add(ff.Name); + bodyFontFamilyComboBox.Items.Add(ff.Name); + } + } + + private void PrinterCfgCtrl_Load(object sender, EventArgs e) + { + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems1 = config.CommonItems1; + commonItems2 = config.CommonItems2; + commonItems3 = config.CommonItems3; + testItems = config.SelectedItems; + footer = config.Footer; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + cultureLabel.Text = "Culture"; + headerButton.Text = Strings.Header; + commonItems1Button.Text = "Common 1"; + commonItems2Button.Text = "Common 2"; + commonItems3Button.Text = "Common 3"; + testItemsButton.Text = "Test items"; + footerButton.Text = Strings.Footer; + } + + public void Closing() + { + } + + PageOrientation GetOrientation(string str) + { + if (str.Equals(PageOrientation.Landscape.ToString())) return PageOrientation.Landscape; + if (str.Equals(PageOrientation.Portrait.ToString())) return PageOrientation.Portrait; + return (PageOrientation)(-1); + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + orientationComboBox.Text = config.PageOrientation.ToString(); + topMarginTextBox.Text = config.TopMargin.ToString(); + bottomMarginTextBox.Text = config.BottomMargin.ToString(); + leftMarginTextBox.Text = config.LeftMargin.ToString(); + + titleFontFamilyComboBox.Text = config.TitFntFml; + titleFontSizeTextBox.Text = config.TitFntSz.ToString(); + titleBoldCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + titleItalicCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + headerFontFamilyComboBox.Text = config.HdrFntFml; + headerFontSizeTextBox.Text = config.HdrFntSz.ToString(); + headerBoldCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + headerItalicCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + bodyFontFamilyComboBox.Text = config.BodyFntFml; + bodyFontSizeTextBox.Text = config.BodyFntSz.ToString(); + bodyBoldCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + bodyItalicCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + colW1TextBox.Text = config.ColW1Pct.ToString(); + colW2TextBox.Text = config.ColW2Pct.ToString(); + + supressPrintingCheckBox.Checked = config.SupressPrinting; + cultureComboBox.Text = config.Culture.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + orientationComboBox.Enabled = true; + topMarginTextBox.Enabled = true; + bottomMarginTextBox.Enabled = true; + leftMarginTextBox.Enabled = true; + titleFontFamilyComboBox.Enabled = true; + titleFontSizeTextBox.Enabled = true; + titleBoldCheckBox.Enabled = true; + titleItalicCheckBox.Enabled = true; + headerFontFamilyComboBox.Enabled = true; + headerFontSizeTextBox.Enabled = true; + headerBoldCheckBox.Enabled = true; + headerItalicCheckBox.Enabled = true; + bodyFontFamilyComboBox.Enabled = true; + bodyFontSizeTextBox.Enabled = true; + bodyBoldCheckBox.Enabled = true; + bodyItalicCheckBox.Enabled = true; + supressPrintingCheckBox.Enabled = true; + cultureComboBox.Enabled = true; + headerButton.Enabled = true; + colW1TextBox.Enabled = true; + colW2TextBox.Enabled = true; + commonItems1Button.Enabled = true; + commonItems2Button.Enabled = true; + commonItems3Button.Enabled = true; + testItemsButton.Enabled = true; + footerButton.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if ((int)GetOrientation(orientationComboBox.Text) < 0) + { + message += Environment.NewLine + "Invalid 'Page orientation'"; + flags |= CfgUpdateFlags.Error; + } + + int dummy, dummy2; + if (!int.TryParse(topMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 500) + { + message += Environment.NewLine + "'Top margin' should be between 0 and 500"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(bottomMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "'Bottom margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(leftMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "Left margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(titleFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Title font size should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(headerFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Header font size should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(bodyFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Body font size should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + if (!int.TryParse(colW1TextBox.Text, out dummy) || dummy < 0 || dummy > 100) + { + message += Environment.NewLine + "Column width 1 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(colW2TextBox.Text, out dummy2) || dummy2 < 0 || dummy2 > 100) + { + message += Environment.NewLine + "Column width 2 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + + if (dummy + dummy2 > 100) + { + message += Environment.NewLine + "Sum of column widths should be <= 100"; + flags |= CfgUpdateFlags.Error; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.PageOrientation != GetOrientation(orientationComboBox.Text)) + { + config.PageOrientation = GetOrientation(orientationComboBox.Text); + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + int tmp = int.Parse(topMarginTextBox.Text); + if (config.TopMargin != tmp) + { + config.TopMargin = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + tmp = int.Parse(bottomMarginTextBox.Text); + if (config.BottomMargin != tmp) + { + config.BottomMargin = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + tmp = int.Parse(leftMarginTextBox.Text); + if (config.LeftMargin != tmp) + { + config.LeftMargin = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + /// Title font properties + if (config.TitFntFml != titleFontFamilyComboBox.Text) + { + config.TitFntFml = titleFontFamilyComboBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + tmp = int.Parse(titleFontSizeTextBox.Text); + if (config.TitFntSz != tmp) + { + config.TitFntSz = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + tmp = (titleBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (titleItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + if (config.TitFntSty != tmp) + { + config.TitFntSty = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + /// Header font properties + if (config.HdrFntFml != headerFontFamilyComboBox.Text) + { + config.HdrFntFml = headerFontFamilyComboBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + tmp = int.Parse(headerFontSizeTextBox.Text); + if (config.HdrFntSz != tmp) + { + config.HdrFntSz = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + tmp = (headerBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (headerItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + if (config.HdrFntSty != tmp) + { + config.HdrFntSty = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + /// Body font properties + if (config.BodyFntFml != bodyFontFamilyComboBox.Text) + { + config.BodyFntFml = bodyFontFamilyComboBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + tmp = int.Parse(bodyFontSizeTextBox.Text); + if (config.BodyFntSz != tmp) + { + config.BodyFntSz = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + tmp = (bodyBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (bodyItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + if (config.BodyFntSty != tmp) + { + config.BodyFntSty = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.SupressPrinting != supressPrintingCheckBox.Checked) + { + config.SupressPrinting = supressPrintingCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + tmp = int.Parse(colW1TextBox.Text); + if (config.ColW1Pct != tmp) + { + config.ColW1Pct = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + tmp = int.Parse(colW2TextBox.Text); + if (config.ColW2Pct != tmp) + { + config.ColW2Pct = tmp; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.CommonItems1 != commonItems1) + { + config.CommonItems1 = commonItems1; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + if (config.CommonItems2 != commonItems2) + { + config.CommonItems2 = commonItems2; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + if (config.CommonItems3 != commonItems3) + { + config.CommonItems3 = commonItems3; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.SelectedItems != testItems) + { + config.SelectedItems = testItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Header != header) + { + config.Header = header; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Footer != footer) + { + config.Footer = footer; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Printer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void headerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + header = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + private void commonItems1Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems1), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems1 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void commonItems2Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems2), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems2 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void commonItems3Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems3), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems3 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void testItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true) + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void footerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(false, string.IsNullOrEmpty(footer) ? string.Empty : footer.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + footer = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.resx b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TestBenchFramework/BenchControl/TbfComponents.cs b/TestBenchFramework/BenchControl/TbfComponents.cs index 2048ee64e..8a20b27e0 100644 --- a/TestBenchFramework/BenchControl/TbfComponents.cs +++ b/TestBenchFramework/BenchControl/TbfComponents.cs @@ -103,6 +103,9 @@ namespace TBF.BenchControl Factories.Add(new Output.Printers.OnePagePerMeter.FactorySingle()); Factories.Add(new Output.Printers.OnePagePerMeter.FactoryCompound()); Factories.Add(new Output.Printers.OnePagePerMeter.FactoryHeatMeters()); + Factories.Add(new Output.Printers.Zapiska.FactorySingle()); + Factories.Add(new Output.Printers.Zapiska.FactoryCompound()); + Factories.Add(new Output.Printers.Zapiska.FactoryHeatMeters()); Factories.Add(new Elde.PressureMeter.PressureMeterFactory()); Factories.Add(new Elde.PressureMeterInternal.PressureMeterFactory()); Factories.Add(new Elde.Pump.PumpFactory()); diff --git a/TestBenchFramework/TBF.csproj b/TestBenchFramework/TBF.csproj index 7d0441b6a..6ed562b89 100644 --- a/TestBenchFramework/TBF.csproj +++ b/TestBenchFramework/TBF.csproj @@ -774,6 +774,17 @@ PrinterCfgCtrl.cs + + + + + + + UserControl + + + PrinterCfgCtrl.cs + @@ -2143,6 +2154,9 @@ PrinterCfgCtrl.cs + + PrinterCfgCtrl.cs + PrinterCfgCtrl.cs diff --git a/packages/ControlBoard/Kempno_50/ControlComponent3U.dll b/packages/ControlBoard/Kempno_50/ControlComponent3U.dll index 4155fb461f9f11719d684936d5ec49afd5963704..787a56c0380c132bb10b63bfe4dc2f2caa04adcc 100644 GIT binary patch delta 92009 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 Mnp7{hh4YK`Ke(1k9RL6T delta 91146 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�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 HCjGwwaI=~N