From 74d5688936eb199e65beb04eb6eef0a425eca4bc Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Sun, 23 Jul 2017 12:53:27 +0300 Subject: [PATCH] FileWriters.ImageArchiver, FileWriters.OneFilePerMeter and Printers.OnePagePerMeter components added. --- Results/Entities/WaterMeter.cs | 4 +- Results/Mappings/WaterMeterMap.cs | 3 +- .../Printers/Enhanced/EnhancedPrinterCfg.cs | 5 +- .../OnePagePerMeter/EnhancedPrintDocument.cs | 245 +++++----- .../OnePagePerMeter/EnhancedPrinterCfg.cs | 33 ++ Results/Properties/AssemblyInfo.cs | 4 +- Results/Results.csproj | 6 +- .../FileWriters/ImageArchiver/Archiver.cs | 173 +++++++ .../FileWriters/ImageArchiver/ArchiverCfg.cs | 64 +++ .../ImageArchiver/ArchiverCfgCtrl.cs | 175 +++++++ .../ImageArchiver/ArchiverCfgCtrl.designer.cs | 267 ++++++++++ .../ImageArchiver/ArchiverCfgCtrl.resx | 120 +++++ .../FileWriters/ImageArchiver/Factory.cs | 29 ++ .../OneFilePerMeter/FactoryCompound.cs | 29 ++ .../OneFilePerMeter/FactoryHeatMeters.cs | 29 ++ .../OneFilePerMeter/FactorySingle.cs | 29 ++ .../FileWriters/OneFilePerMeter/Writer.cs | 439 +++++++++++++++++ .../FileWriters/OneFilePerMeter/WriterCfg.cs | 71 +++ .../OneFilePerMeter/WriterCfgCtrl.cs | 338 +++++++++++++ .../OneFilePerMeter/WriterCfgCtrl.designer.cs | 371 ++++++++++++++ .../OneFilePerMeter/WriterCfgCtrl.resx | 120 +++++ .../OnePagePerMeter/FactoryCompound.cs | 26 + .../OnePagePerMeter/FactoryHeatMeters.cs | 26 + .../Printers/OnePagePerMeter/FactorySingle.cs | 26 + .../Printers/OnePagePerMeter/Printer.cs | 191 ++++++++ .../Printers/OnePagePerMeter/PrinterCfg.cs | 86 ++++ .../PrinterCfgCtrl.Designer.cs | 458 ++++++++++++++++++ .../OnePagePerMeter/PrinterCfgCtrl.cs | 396 +++++++++++++++ .../OnePagePerMeter/PrinterCfgCtrl.resx | 120 +++++ .../BenchControl/TbfComponents.cs | 9 +- TestBenchFramework/TBF.csproj | 40 ++ 31 files changed, 3792 insertions(+), 140 deletions(-) rename TestBenchFramework/BenchControl/Output/Printers/Enhanced/BasicPrintDocument.cs => Results/Output/Printers/OnePagePerMeter/EnhancedPrintDocument.cs (50%) create mode 100644 Results/Output/Printers/OnePagePerMeter/EnhancedPrinterCfg.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.resx create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Factory.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs create mode 100644 TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.resx create mode 100644 TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryCompound.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryHeatMeters.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactorySingle.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/Printer.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfg.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.Designer.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.cs create mode 100644 TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.resx diff --git a/Results/Entities/WaterMeter.cs b/Results/Entities/WaterMeter.cs index a99cb2bc0..53af86ced 100644 --- a/Results/Entities/WaterMeter.cs +++ b/Results/Entities/WaterMeter.cs @@ -22,7 +22,8 @@ namespace Results.Entities public virtual double QFall { get; set; } /// [m3/h] detected Q_fall of a composed meter public virtual bool Passed { get; set; } public virtual int ResultCode { get; set; } - public virtual string Remark { get; set; } + public virtual string ArchivePath { get; set; } + public virtual string Remark { get; set; } #if IPERL public virtual int SerialNrEx { get; set; } /// Aux s/n for compound meters, Serial number for iPerl water meter @@ -202,6 +203,7 @@ namespace Results.Entities QFall = src.QFall; Passed = src.Passed; ResultCode = src.ResultCode; + ArchivePath = src.ArchivePath; Remark = src.Remark; #if IPERL SerialNrEx = src.SerialNrEx; diff --git a/Results/Mappings/WaterMeterMap.cs b/Results/Mappings/WaterMeterMap.cs index d6c57751d..b810b1b43 100644 --- a/Results/Mappings/WaterMeterMap.cs +++ b/Results/Mappings/WaterMeterMap.cs @@ -22,7 +22,8 @@ namespace Results.Mappings Map(x => x.QFall); Map(x => x.Passed); Map(x => x.ResultCode); - Map(x => x.Remark) + Map(x => x.ArchivePath); + Map(x => x.Remark) .CustomType("StringClob") .CustomSqlType("varchar(2000)"); #if IPERL diff --git a/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs b/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs index db318ef0c..f102bf0c3 100644 --- a/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs +++ b/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs @@ -1,4 +1,7 @@ -using System; +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/TestBenchFramework/BenchControl/Output/Printers/Enhanced/BasicPrintDocument.cs b/Results/Output/Printers/OnePagePerMeter/EnhancedPrintDocument.cs similarity index 50% rename from TestBenchFramework/BenchControl/Output/Printers/Enhanced/BasicPrintDocument.cs rename to Results/Output/Printers/OnePagePerMeter/EnhancedPrintDocument.cs index 39380cc6e..204c07364 100644 --- a/TestBenchFramework/BenchControl/Output/Printers/Enhanced/BasicPrintDocument.cs +++ b/Results/Output/Printers/OnePagePerMeter/EnhancedPrintDocument.cs @@ -7,34 +7,38 @@ using System.Drawing; using System.Drawing.Printing; using System.IO; using Config.Entities; -using TBF.Resources; +using Results.Resources; -namespace TBF.BenchControl.Output.Printers.Enhanced +namespace Results.Output.Printers.OnePagePerMeter { - public class BasicPrintDocument : PrintDocument + public class EnhancedPrintDocument : PrintDocument { - const string FontFamilyName = "Arial"; //"Times New Roman"; - - const int SpacingOne = 18; - const int SpacingOneAndHalf = (3 * SpacingOne) / 2; + /// 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 TitleX; readonly int TitleY; /// Depends on the size of the header - readonly int HdrTop; /// = TitleY + 60 - readonly int BodyTop; /// = HdrTop + 160 - /// Size of the printed area without margins, after taking into account 'pageOrientation' - int printHeight; - int printWidth; + 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 boldFont; + Font headerFont; Font titleFont; /// @@ -42,10 +46,15 @@ namespace TBF.BenchControl.Output.Printers.Enhanced /// Results.Entities.Batch batch; + EnhancedPrinterCfg cfg; + /// /// Items to print /// - readonly IList rsltItems; + string header; + IList commonItems; + IList testItems; + string footer; /// /// Layout and status @@ -61,33 +70,28 @@ namespace TBF.BenchControl.Output.Printers.Enhanced /// Constructor /// /// Text to be printed - public BasicPrintDocument(Results.Entities.Batch batch, - PageOrientation pageOrientation, - int topMargin, int bottomMargin, int leftMargin) + public EnhancedPrintDocument(Results.Entities.Batch batch, EnhancedPrinterCfg cfg) { this.batch = batch; - DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape); + this.cfg = cfg; + topMargin = cfg.TopMargin; + bottomMargin = cfg.BottomMargin; + leftMargin = cfg.LeftMargin; - this.topMargin = topMargin; - this.bottomMargin = bottomMargin; - this.leftMargin = leftMargin; + header = string.IsNullOrEmpty(cfg.Header) ? string.Empty : cfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems); + 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); - TitleX = leftMargin; - TitleY = topMargin; /// Depends on the size of the header - HdrTop = TitleY + 60; - BodyTop = HdrTop + 160; - - if (batch.WaterMeters.Count > 0 && batch.WaterMeters[0].Compound()) - { - rsltItems = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_CombinedWM); - } - else - { - rsltItems = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_SingleWM); - } + /// Initialize fonts + titleFont = new Font(cfg.TitFntFml, cfg.TitFntSz, (FontStyle)cfg.TitFntSty); + headerFont = new Font(cfg.HdrFntFml, cfg.HdrFntSz, (FontStyle)cfg.HdrFntSty); + font = new Font(cfg.BodyFntFml, cfg.BodyFntSz, (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; @@ -99,22 +103,36 @@ namespace TBF.BenchControl.Output.Printers.Enhanced printWidth = base.DefaultPageSettings.PaperSize.Width - leftMargin - leftMargin; } + 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) testsCount++; + if (mtr.Publish() == Config.Entities.Publish.Always && mtr.IsPilotRslt()) testsCount++; } } - if (batch.WaterMeters.Count > 0 && batch.WaterMeters[0].Compound()) testsCount /= 3; + /// Prepare document outline + TitleX = cfg.LeftMargin; + TitleY = cfg.TopMargin; - int wmSectionHeight = (testsCount + 4) * SpacingOne; + titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height; + CommonTop = TitleY + titleHeight + SpacingOne4Header; + + commonHeight = commonItems.Count * 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 + 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; @@ -130,10 +148,6 @@ namespace TBF.BenchControl.Output.Printers.Enhanced protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) { base.OnBeginPrint(e); - - if (font == null) { font = new Font(FontFamilyName, 10, FontStyle.Regular); } - if (boldFont == null) { boldFont = new Font(FontFamilyName, 10, FontStyle.Bold); } - if (titleFont == null) { titleFont = new Font(FontFamilyName, 18, FontStyle.Bold); } } /// @@ -158,33 +172,24 @@ namespace TBF.BenchControl.Output.Printers.Enhanced if (pageNr == 1) { ///---------- - /// Header + /// Title ///---------- - RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, 40); - e.Graphics.DrawString(batch.ProtocolTitle, titleFont, Brushes.Black, printArea); + RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, titleHeight); + e.Graphics.DrawString(header, titleFont, Brushes.Black, printArea); - string[] leftColumn = new string[] - { - "Batch number: ", - "Date and time: ", - "Procedure: ", - Strings.User + ": ", - "Ambient temperature: ", - "Ambient pressure: ", - "Ambient humidity: ", - }; + ///---------------- + /// Common items + ///---------------- + string[] leftColumn = new string[commonItems.Count]; + string[] rightColumn = new string[commonItems.Count]; - string[] rightColumn = new string[] - { - batch.BatchNr.ToString(), - //batch.EndTime.ToShortDateString() + " " + batch.EndTime.ToShortTimeString(), - string.Format("{0:yyyy.MM.dd HH:mm}", batch.EndTime), - batch.ProcedureName, - Users.GlobalData.CurrentUser.UserName, - batch.AmbientTempAve().ToString("F1") + " °C", - Config.Units.ConvertTo(Config.Unit.mbar, batch.AmbientPressAve()).ToString("F0") + " mbar", - batch.AmbientHumiAve().ToString("F0") + " %", - }; + 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 max. left column width in characters int maxLen = 0; @@ -193,8 +198,8 @@ namespace TBF.BenchControl.Output.Printers.Enhanced /// Write aligned columns for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) { - PrintAt(e, leftMargin, HdrTop + SpacingOne * i, leftColumn[i]); - PrintAt(e, 300, HdrTop + SpacingOne * i, rightColumn[i]); + PrintAt(e, leftMargin, CommonTop + SpacingOne * i, leftColumn[i]); + PrintAt(e, 300, CommonTop + SpacingOne * i, rightColumn[i]); } } @@ -220,10 +225,12 @@ namespace TBF.BenchControl.Output.Printers.Enhanced ///---------- /// Footer ///---------- - string footerText = string.Format("str. {1}/{2}", Strings.Page, pageNr++, nrPages); - int footerWidth = (int)e.Graphics.MeasureString(footerText, font).Width; - PrintAt(e, leftMargin + (printWidth - footerWidth) / 2, topMargin + printHeight - SpacingOne, footerText); - + 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); } @@ -238,89 +245,61 @@ namespace TBF.BenchControl.Output.Printers.Enhanced Results.Entities.WaterMeter wm, int printedWMNr, int top) { /// Determin column widths - float[] columnPos = new float[rsltItems.Count + 1]; + float[] columnPos = new float[testItems.Count + 1]; columnPos[0] = (float)leftMargin; - for (int i = 0; i < rsltItems.Count; i++) + for (int i = 0; i < testItems.Count; i++) { - float columnWidth = e.Graphics.MeasureString(rsltItems[i].ClmnHeaderText, font).Width; + float columnWidth = e.Graphics.MeasureString(testItems[i].Caption, headerFont).Width; foreach (var mtr in wm.MeterTestRslts) { - string itemText; + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + string itemText = testItems[i].Print(wm, mtr.Name()); - if (!wm.Compound()) - { - itemText = rsltItems[i].Print(mtr); - } - else if (mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) - { - Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); - Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundAux); - itemText = rsltItems[i].PrintCombined(mainMtr, auxMtr, mtr); - } - else - { - continue; - } + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } - /// 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; + 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[rsltItems.Count] - 20; + int tableRightX = (int)columnPos[testItems.Count] - 20; - string wmText = string.Format("Water meter {0}", printedWMNr); - PrintAt(e, leftMargin, top, wmText); + string wmText = string.Format("{0} {1}", Strings.Water_Meter, printedWMNr); + PrintHeaderAt(e, leftMargin, top, wmText); if (!string.IsNullOrEmpty(wm.SerialNr)) { - PrintAt(e, leftMargin + (int)e.Graphics.MeasureString(wmText, font).Width, top, - string.Format(" s/n = {0}", 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 + 25; + 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 < rsltItems.Count; i++) + for (int i = 0; i < testItems.Count; i++) { - PrintAt(e, (int)columnPos[i], top + 27, rsltItems[i].ClmnHeaderText); + PrintHeaderAt(e, (int)columnPos[i], top + (int)(1.6 * SpacingOne4Header), testItems[i].Caption); } /// Horizontal line - horY = top + 27 + SpacingOne; + 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.Publish() == Config.Entities.Publish.Always) + if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always)) { testsCount++; - for (int i = 0; i < rsltItems.Count; i++) + for (int i = 0; i < testItems.Count; i++) { - string itemText; - - if (!wm.Compound()) - { - /// Single water meter - itemText = rsltItems[i].Print(mtr); - } - else if (mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) - { - Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); - Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); - itemText = rsltItems[i].PrintCombined(mainMtr, auxMtr, mtr); - } - else - { - continue; - } + string itemText = testItems[i].Print(wm, mtr.Name()); /// Strip color information string[] texts = itemText.Split(new char[] { '|' }); @@ -331,16 +310,16 @@ namespace TBF.BenchControl.Output.Printers.Enhanced /// TODO: How to print colors? } - PrintAt(e, (int)columnPos[i], top + 30 + SpacingOne * testsCount, itemText); + PrintAt(e, (int)columnPos[i], top + 2 * SpacingOne4Header + SpacingOne * testsCount, itemText); } } } /// Horizontal line - horY = top + 30 + SpacingOne * (testsCount + 1); + horY = top + 2 * SpacingOneAndHalf4Header + SpacingOne * testsCount; e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); - return (testsCount + 4) * SpacingOne; + return (testsCount + 1) * SpacingOne + 3 * SpacingOne4Header; } @@ -352,21 +331,21 @@ namespace TBF.BenchControl.Output.Printers.Enhanced void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) { - RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); + RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne); e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); } - void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + void PrintHeaderAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) { - PrintBoldAt(e, p.X, p.Y, text); + PrintHeaderAt(e, p.X, p.Y, text); } - void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + void PrintHeaderAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) { - RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); - e.Graphics.DrawString(text, this.boldFont, Brushes.Black, printArea); + RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne4Header); + e.Graphics.DrawString(text, this.headerFont, Brushes.Black, printArea); } } } diff --git a/Results/Output/Printers/OnePagePerMeter/EnhancedPrinterCfg.cs b/Results/Output/Printers/OnePagePerMeter/EnhancedPrinterCfg.cs new file mode 100644 index 000000000..615f2d48f --- /dev/null +++ b/Results/Output/Printers/OnePagePerMeter/EnhancedPrinterCfg.cs @@ -0,0 +1,33 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Results.Output.Printers.OnePagePerMeter +{ + public class EnhancedPrinterCfg + { + 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 string[] CommonItems; + public string[] TestItems; + public string Header; /// =Title + public string Footer; + } +} diff --git a/Results/Properties/AssemblyInfo.cs b/Results/Properties/AssemblyInfo.cs index 244067f7a..c40cc5538 100644 --- a/Results/Properties/AssemblyInfo.cs +++ b/Results/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.14.611.0")] -[assembly: AssemblyFileVersion("2.14.611.0")] +[assembly: AssemblyVersion("2.14.619.0")] +[assembly: AssemblyFileVersion("2.14.619.0")] diff --git a/Results/Results.csproj b/Results/Results.csproj index 7af9f30a7..9cabccef7 100644 --- a/Results/Results.csproj +++ b/Results/Results.csproj @@ -107,6 +107,10 @@ Component + + Component + + @@ -133,9 +137,9 @@ - + diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs new file mode 100644 index 000000000..bb95aee50 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs @@ -0,0 +1,173 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + public class Archiver : ComponentBase, IOperation, GenericDevices.IResultsWriter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Archiver)); + public override string ToString() { return string.Format("Output.FileWriters.Basic({0})", Cfg.ToString(1)); } + + readonly ArchiverCfg writerCfg; + + Results.Entities.Batch batch; + + bool abort; /// Set to 'true' by Stop() operation to abort writing to the file + + + public Archiver() {} + + public Archiver(Generic.IComponentCfg cfg) + : base(cfg) + { + writerCfg = cfg as ArchiverCfg; + log.Debug(this.ToString()); + } + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetArchivePath(string destinationPath, DateTime time, int wmPosition, string wmSN) + { + string directory = destinationPath; /// Ends with "\\"; + + switch (writerCfg.YearFolders) + { + case YearFolders.FourDigit: + directory = string.Format("{0}{1}\\", directory, time.Year.ToString("D4")); + break; + case YearFolders.TwoDigit: + directory = string.Format("{0}{1}\\", directory, (time.Year % 100).ToString("D2")); + break; + } + + switch (writerCfg.MonthFolders) + { + case MonthFolders.Name: + { + string monthStr; + switch (time.Month) + { + default: + case 1: monthStr = "January"; break; + case 2: monthStr = "February"; break; + case 3: monthStr = "March"; break; + case 4: monthStr = "April"; break; + case 5: monthStr = "May"; break; + case 6: monthStr = "June"; break; + case 7: monthStr = "July"; break; + case 8: monthStr = "August"; break; + case 9: monthStr = "September"; break; + case 10: monthStr = "October"; break; + case 11: monthStr = "November"; break; + case 12: monthStr = "December"; break; + } + directory = string.Format("{0}{1}\\", directory, monthStr); + break; + } + case MonthFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Month.ToString()); + break; + case MonthFolders.TwoDigit: + directory = string.Format("{0}{1}\\", directory, time.Month.ToString("D2")); + break; + } + + switch (writerCfg.DayFolders) + { + case DayFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Day.ToString()); + break; + case DayFolders.TwoDigit: + directory = string.Format("{0}{1}\\", directory, time.Day.ToString("D2")); + break; + } + + Directory.CreateDirectory(directory); + + try + { + if (string.IsNullOrEmpty(writerCfg.ArchiveFormat)) throw new Exception(); + return directory + string.Format(writerCfg.ArchiveFormat, time, wmPosition, wmSN); + } + catch + { + return string.Format("{0}{1:yyMMdd-HHmm}-{2}", directory, time, wmPosition); + } + } + + /// + /// Writes the test cycle results into a file + /// Events: + /// Event.ResultsWritten + /// Event.Busy + /// + /// Results to write into a file + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + MoveFilesToArchive(batch, writerCfg.DestinationPath); + MoveFilesToArchive(batch, writerCfg.DestinationPath2); + } + + /// Run this operation + /// Event.ResultsWritten + public Event Run() + { + return Event.ResultsWritten; + } + + /// Stop this operation + public void Stop() + { + } + + + void MoveFilesToArchive(Results.Entities.Batch batch, string destination) + { + if (batch == null || batch.WaterMeters == null || batch.WaterMeters.Count <= 0) return; + + if (!string.IsNullOrEmpty(writerCfg.DestinationPath)) + { + foreach (var wm in batch.WaterMeters) + { + if (wm != null && (!writerCfg.SaveGoodOnly || wm.Passed)) + { + string srcFolder = Path.Combine(Program.ImagesDir, batch.BatchNr.ToString(), wm.WMPosition.ToString()); + + try + { + /// TODO: Copy files when files are on different disks. + Directory.Move(srcFolder, GetArchivePath(writerCfg.DestinationPath, batch.EndTime, wm.WMPosition, wm.SerialNr)); + } + catch + { + log.ErrorFormat("Failed to move archive files from {0}", srcFolder); + } + } + } + } + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs new file mode 100644 index 000000000..ca7652779 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs @@ -0,0 +1,64 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + public class ArchiverCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ArchiverCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new ArchiverCfgCtrl(); } + + public string DestinationPath; /// Directory path into which the results will be saved + public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved + public YearFolders YearFolders; + public MonthFolders MonthFolders; + public DayFolders DayFolders; + public string ArchiveFormat; + public bool SaveGoodOnly; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + ArchiverCfg() + { + } + + public ArchiverCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + DestinationPath = Program.HomeDir + "Results\\"; + DestinationPath2 = string.Empty; + YearFolders = YearFolders.FourDigit; + MonthFolders = MonthFolders.Digit; + DayFolders = DayFolders.Digit; + ArchiveFormat = "{0:yyyyMMdd}"; + SaveGoodOnly = false; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Path={1}, Y={2}, M={3}, D={4}, ArchiveFmt={5}, GoodOnly={6}", + Name, + DestinationPath, + YearFolders, + MonthFolders, + DayFolders, + ArchiveFormat, + SaveGoodOnly); + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs new file mode 100644 index 000000000..7c0b7167f --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs @@ -0,0 +1,175 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + public partial class ArchiverCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(ArchiverCfgCtrl)); + + public bool ShowMore { get { return false; } } + + public bool Compound; + + ArchiverCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as ArchiverCfg; + Redraw(); + } + } + + string[] selectedItems; + + public ArchiverCfgCtrl() + { + InitializeComponent(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString()); + for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString()); + for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString()); + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + destinationTextBox.Text = config.DestinationPath; + destination2TextBox.Text = config.DestinationPath2; + yearFoldersComboBox.Text = config.YearFolders.ToString(); + monthFoldersComboBox.Text = config.MonthFolders.ToString(); + dayFoldersComboBox.Text = config.DayFolders.ToString(); + archiveFmtTextBox.Text = config.ArchiveFormat; + goodOnlyCheckBox.Checked = config.SaveGoodOnly; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + destinationTextBox.Enabled = true; + destinationButton.Enabled = true; + destination2TextBox.Enabled = true; + destination2Button.Enabled = true; + yearFoldersComboBox.Enabled = true; + monthFoldersComboBox.Enabled = true; + dayFoldersComboBox.Enabled = true; + archiveFmtTextBox.Enabled = true; + goodOnlyCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid year folders selection"; + } + + if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid month folders selection"; + } + + if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid day folder selection"; + } + + 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; } + + if (config.DestinationPath != destinationTextBox.Text) + { + config.DestinationPath = destinationTextBox.Text; + if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\"; + flags = CfgUpdateFlags.RestartRqrd; + } + + if (config.DestinationPath2 != destination2TextBox.Text) + { + config.DestinationPath2 = destination2TextBox.Text; + if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\"; + flags = CfgUpdateFlags.RestartRqrd; + } + + for (YearFolders i = 0; i < YearFolders.Count; i++) + { + if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i)) + { + config.YearFolders = i; + flags = CfgUpdateFlags.RestartRqrd; + break; + } + } + + for (MonthFolders i = 0; i < MonthFolders.Count; i++) + { + if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i)) + { + config.MonthFolders = i; + flags = CfgUpdateFlags.RestartRqrd; + break; + } + } + + for (DayFolders i = 0; i < DayFolders.Count; i++) + { + if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i)) + { + config.DayFolders = i; + flags = CfgUpdateFlags.RestartRqrd; + break; + } + } + + if (config.ArchiveFormat != archiveFmtTextBox.Text) + { + config.ArchiveFormat = archiveFmtTextBox.Text; + flags = CfgUpdateFlags.RestartRqrd; + } + + if (config.SaveGoodOnly != goodOnlyCheckBox.Checked) + { + config.SaveGoodOnly = goodOnlyCheckBox.Checked; + flags = CfgUpdateFlags.RestartRqrd; + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs new file mode 100644 index 000000000..b8af7328e --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs @@ -0,0 +1,267 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + partial class ArchiverCfgCtrl + { + /// + /// 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.destinationTextBox = new System.Windows.Forms.TextBox(); + this.destinationLabel = new System.Windows.Forms.Label(); + this.destinationButton = new System.Windows.Forms.Button(); + this.yearFoldersLabel = new System.Windows.Forms.Label(); + this.monthFoldersLabel = new System.Windows.Forms.Label(); + this.dayFoldersLabel = new System.Windows.Forms.Label(); + this.yearFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.monthFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.dayFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.destination2Button = new System.Windows.Forms.Button(); + this.destination2TextBox = new System.Windows.Forms.TextBox(); + this.destination2Label = new System.Windows.Forms.Label(); + this.archiveFmtTextBox = new System.Windows.Forms.TextBox(); + this.archiveFmtLabel = new System.Windows.Forms.Label(); + this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(108, 31); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(17, 34); + 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(105, 9); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // destinationTextBox + // + this.destinationTextBox.Enabled = false; + this.destinationTextBox.Location = new System.Drawing.Point(108, 54); + this.destinationTextBox.Name = "destinationTextBox"; + this.destinationTextBox.Size = new System.Drawing.Size(202, 20); + this.destinationTextBox.TabIndex = 4; + // + // destinationLabel + // + this.destinationLabel.AutoSize = true; + this.destinationLabel.Location = new System.Drawing.Point(17, 57); + this.destinationLabel.Name = "destinationLabel"; + this.destinationLabel.Size = new System.Drawing.Size(60, 13); + this.destinationLabel.TabIndex = 3; + this.destinationLabel.Text = "Destination"; + // + // destinationButton + // + this.destinationButton.Enabled = false; + this.destinationButton.Location = new System.Drawing.Point(316, 53); + this.destinationButton.Name = "destinationButton"; + this.destinationButton.Size = new System.Drawing.Size(30, 20); + this.destinationButton.TabIndex = 16; + this.destinationButton.Text = "..."; + this.destinationButton.UseVisualStyleBackColor = true; + this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); + // + // yearFoldersLabel + // + this.yearFoldersLabel.AutoSize = true; + this.yearFoldersLabel.Location = new System.Drawing.Point(17, 103); + this.yearFoldersLabel.Name = "yearFoldersLabel"; + this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13); + this.yearFoldersLabel.TabIndex = 7; + this.yearFoldersLabel.Text = "Year folders"; + // + // monthFoldersLabel + // + this.monthFoldersLabel.AutoSize = true; + this.monthFoldersLabel.Location = new System.Drawing.Point(17, 127); + this.monthFoldersLabel.Name = "monthFoldersLabel"; + this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13); + this.monthFoldersLabel.TabIndex = 9; + this.monthFoldersLabel.Text = "Month folders"; + // + // dayFoldersLabel + // + this.dayFoldersLabel.AutoSize = true; + this.dayFoldersLabel.Location = new System.Drawing.Point(17, 151); + this.dayFoldersLabel.Name = "dayFoldersLabel"; + this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13); + this.dayFoldersLabel.TabIndex = 11; + this.dayFoldersLabel.Text = "Day folders"; + // + // yearFoldersComboBox + // + this.yearFoldersComboBox.Enabled = false; + this.yearFoldersComboBox.FormattingEnabled = true; + this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 100); + this.yearFoldersComboBox.Name = "yearFoldersComboBox"; + this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.yearFoldersComboBox.TabIndex = 8; + // + // monthFoldersComboBox + // + this.monthFoldersComboBox.Enabled = false; + this.monthFoldersComboBox.FormattingEnabled = true; + this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 124); + this.monthFoldersComboBox.Name = "monthFoldersComboBox"; + this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.monthFoldersComboBox.TabIndex = 10; + // + // dayFoldersComboBox + // + this.dayFoldersComboBox.Enabled = false; + this.dayFoldersComboBox.FormattingEnabled = true; + this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 148); + this.dayFoldersComboBox.Name = "dayFoldersComboBox"; + this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.dayFoldersComboBox.TabIndex = 12; + // + // destination2Button + // + this.destination2Button.Enabled = false; + this.destination2Button.Location = new System.Drawing.Point(316, 78); + this.destination2Button.Name = "destination2Button"; + this.destination2Button.Size = new System.Drawing.Size(30, 20); + this.destination2Button.TabIndex = 17; + this.destination2Button.Text = "..."; + this.destination2Button.UseVisualStyleBackColor = true; + // + // destination2TextBox + // + this.destination2TextBox.Enabled = false; + this.destination2TextBox.Location = new System.Drawing.Point(108, 77); + this.destination2TextBox.Name = "destination2TextBox"; + this.destination2TextBox.Size = new System.Drawing.Size(202, 20); + this.destination2TextBox.TabIndex = 6; + // + // destination2Label + // + this.destination2Label.AutoSize = true; + this.destination2Label.Location = new System.Drawing.Point(17, 80); + this.destination2Label.Name = "destination2Label"; + this.destination2Label.Size = new System.Drawing.Size(69, 13); + this.destination2Label.TabIndex = 5; + this.destination2Label.Text = "Destination 2"; + // + // archiveFmtTextBox + // + this.archiveFmtTextBox.Enabled = false; + this.archiveFmtTextBox.Location = new System.Drawing.Point(108, 172); + this.archiveFmtTextBox.Name = "archiveFmtTextBox"; + this.archiveFmtTextBox.Size = new System.Drawing.Size(202, 20); + this.archiveFmtTextBox.TabIndex = 14; + // + // archiveFmtLabel + // + this.archiveFmtLabel.AutoSize = true; + this.archiveFmtLabel.Location = new System.Drawing.Point(17, 175); + this.archiveFmtLabel.Name = "archiveFmtLabel"; + this.archiveFmtLabel.Size = new System.Drawing.Size(75, 13); + this.archiveFmtLabel.TabIndex = 13; + this.archiveFmtLabel.Text = "Archive format"; + // + // goodOnlyCheckBox + // + this.goodOnlyCheckBox.AutoSize = true; + this.goodOnlyCheckBox.Location = new System.Drawing.Point(108, 200); + this.goodOnlyCheckBox.Name = "goodOnlyCheckBox"; + this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17); + this.goodOnlyCheckBox.TabIndex = 15; + this.goodOnlyCheckBox.Text = "Good only"; + this.goodOnlyCheckBox.UseVisualStyleBackColor = true; + // + // ArchiverCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.goodOnlyCheckBox); + this.Controls.Add(this.archiveFmtTextBox); + this.Controls.Add(this.archiveFmtLabel); + this.Controls.Add(this.destination2Button); + this.Controls.Add(this.destination2TextBox); + this.Controls.Add(this.destination2Label); + this.Controls.Add(this.dayFoldersComboBox); + this.Controls.Add(this.monthFoldersComboBox); + this.Controls.Add(this.yearFoldersComboBox); + this.Controls.Add(this.dayFoldersLabel); + this.Controls.Add(this.monthFoldersLabel); + this.Controls.Add(this.yearFoldersLabel); + this.Controls.Add(this.destinationButton); + this.Controls.Add(this.destinationTextBox); + this.Controls.Add(this.destinationLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "ArchiverCfgCtrl"; + this.Size = new System.Drawing.Size(384, 282); + this.Load += new System.EventHandler(this.WriterCfgCtrl_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.TextBox destinationTextBox; + private System.Windows.Forms.Label destinationLabel; + private System.Windows.Forms.Button destinationButton; + private System.Windows.Forms.Label yearFoldersLabel; + private System.Windows.Forms.Label monthFoldersLabel; + private System.Windows.Forms.Label dayFoldersLabel; + private System.Windows.Forms.ComboBox yearFoldersComboBox; + private System.Windows.Forms.ComboBox monthFoldersComboBox; + private System.Windows.Forms.ComboBox dayFoldersComboBox; + private System.Windows.Forms.Button destination2Button; + private System.Windows.Forms.TextBox destination2TextBox; + private System.Windows.Forms.Label destination2Label; + private System.Windows.Forms.TextBox archiveFmtTextBox; + private System.Windows.Forms.Label archiveFmtLabel; + private System.Windows.Forms.CheckBox goodOnlyCheckBox; + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.resx b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.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/Output/FileWriters/ImageArchiver/Factory.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Factory.cs new file mode 100644 index 000000000..140c9a616 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Factory.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Archiver.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Archiver(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Archiver(cfg); } + + public IComponentCfg DefaultConfig() { return new ArchiverCfg("FileWriter.ImageArchiver", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(ArchiverCfg.Serializer, component, this); + (cfg as ArchiverCfg).MetersKind = Config.Entities.MetersKind.Single; + return cfg; + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs new file mode 100644 index 000000000..82cddb639 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class FactoryCompound : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.OneFilePerMeter.Compound", this, Config.Entities.MetersKind.Combined); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Combined; + return cfg; + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs new file mode 100644 index 000000000..cb34e76aa --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class FactoryHeatMeters : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.OneFilePerMeter.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.HeatMeter; + return cfg; + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs new file mode 100644 index 000000000..44555504e --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.OneFilePerMeter.Single", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Single; + return cfg; + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs new file mode 100644 index 000000000..513718dbc --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs @@ -0,0 +1,439 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class Writer : ComponentBase, IOperation, GenericDevices.IResultsWriter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Writer)); + public override string ToString() { return string.Format("Output.FileWriters.Enhanced({0})", Cfg.ToString(1)); } + + readonly WriterCfg writerCfg; + + string separatorStr; + + /// + /// Items to print + /// + string header; + IList commonItems; + IList testItems; + string footer; + + Results.Entities.Batch batch; + + bool abort; /// Set to 'true' by Stop() operation to abort writing to files + + + public Writer() {} + + public Writer(Generic.IComponentCfg cfg) + : base(cfg) + { + writerCfg = cfg as WriterCfg; + ApplyConfig(); + log.Debug(this.ToString()); + } + + + void ApplyConfig() + { + switch (writerCfg.Separator) + { + default: + case Separator.None: separatorStr = string.Empty; break; + case Separator.Space: separatorStr = " "; break; + case Separator.Tabulator: separatorStr = "\t"; break; + case Separator.Comma: separatorStr = ","; break; + case Separator.Semicolon: separatorStr = ";"; break; + } + + header = string.IsNullOrEmpty(writerCfg.Header) ? string.Empty : writerCfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.CommonItems); + testItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.SelectedItems); /// TestID info will be overwritten later on + footer = string.IsNullOrEmpty(writerCfg.Footer) ? string.Empty : writerCfg.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) + { + WriterCfg newCfg = args.Cfg as WriterCfg; + if (newCfg != null && newCfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + writerCfg.DestinationPath = newCfg.DestinationPath; + writerCfg.DestinationPath2 = newCfg.DestinationPath2; + writerCfg.YearFolders = newCfg.YearFolders; + writerCfg.MonthFolders = newCfg.MonthFolders; + writerCfg.DayFolders = newCfg.DayFolders; + writerCfg.FileNameFormat = newCfg.FileNameFormat; + writerCfg.Culture = newCfg.Culture; + writerCfg.Separator = newCfg.Separator; + writerCfg.EliminateSpaces = newCfg.EliminateSpaces; + writerCfg.CommonItems = newCfg.CommonItems; + writerCfg.SelectedItems = newCfg.SelectedItems; + writerCfg.Header = newCfg.Header; + writerCfg.Footer = newCfg.Footer; + + ApplyConfig(); + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Eliminate spaces conditionally, depesing on bool WriterCfg.EliminateSpaces + /// + /// Input string + /// Output string + string ElSpaces(string item) + { + if (writerCfg.EliminateSpaces) + return item.Replace(" ", string.Empty); + else + return item; + } + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetFilename(string destinationPath, DateTime time) + { + string directory = destinationPath; /// Ends with "\\"; + + switch (writerCfg.YearFolders) + { + case YearFolders.FourDigit: + directory = string.Format("{0}{1:yyyy}\\", directory, time); + break; + case YearFolders.TwoDigit: + directory = string.Format("{0}{1:yy}\\", directory, time); + break; + } + + switch (writerCfg.MonthFolders) + { + case MonthFolders.Name: + { + string monthStr; + switch (time.Month) + { + default: + case 1: monthStr = "January"; break; + case 2: monthStr = "February"; break; + case 3: monthStr = "March"; break; + case 4: monthStr = "April"; break; + case 5: monthStr = "May"; break; + case 6: monthStr = "June"; break; + case 7: monthStr = "July"; break; + case 8: monthStr = "August"; break; + case 9: monthStr = "September"; break; + case 10: monthStr = "October"; break; + case 11: monthStr = "November"; break; + case 12: monthStr = "December"; break; + } + directory = string.Format("{0}{1}\\", directory, monthStr); + break; + } + case MonthFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Month.ToString()); + break; + case MonthFolders.TwoDigit: + directory = string.Format("{0}{1:MM}\\", directory, time); + break; + } + + switch (writerCfg.DayFolders) + { + case DayFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Day.ToString()); + break; + case DayFolders.TwoDigit: + directory = string.Format("{0}{1:dd}\\", directory, time); + break; + } + + Directory.CreateDirectory(directory); + + try + { + if (string.IsNullOrEmpty(writerCfg.FileNameFormat)) throw new Exception(); + return directory + string.Format(writerCfg.FileNameFormat, time); + } + catch + { + return string.Format("{0}{1:yyMMdd-HHmm}.txt", directory, time); + } + } + + + /// + /// Writes the test cycle results into a file + /// Events: + /// Event.ResultsWritten + /// Event.Busy + /// + /// Results to write into a file + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + + try { Thread.CurrentThread.CurrentCulture = new CultureInfo(writerCfg.Culture.ToString()); } + catch { } + + WriteRslts(batch, writerCfg.DestinationPath); + WriteRslts(batch, writerCfg.DestinationPath2); + + Thread.CurrentThread.CurrentCulture = oriCulture; + } + + /// Run this operation + /// Event.ResultsWritten + public Event Run() + { + return Event.ResultsWritten; + } + + /// Stop this operation + public void Stop() + { + } + + + void WriteRslts(Results.Entities.Batch batch, string destination) + { + StreamWriter writer = StreamWriter.Null; + if (!string.IsNullOrEmpty(destination)) + { + try + { + writer = File.AppendText(GetFilename(destination, batch.EndTime)); + } + catch + { + } + } + + WriteRsltsEx(batch, writer); + writer.Close(); + } + + + void WriteRsltsEx(Results.Entities.Batch batch, StreamWriter wrtr) + { + ///---------- + /// Header + ///---------- + if (!string.IsNullOrEmpty(writerCfg.Header)) wrtr.Write(header); + wrtr.WriteLine(batch.ProtocolTitle); + wrtr.WriteLine(string.Empty); + + ///---------------- + /// Common items + ///---------------- + 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 max. left column width in characters + int maxLen = 0; + foreach (var s in leftColumn) if (s.Length > maxLen) maxLen = s.Length; + + /// Write aligned columns + for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) + { + if (abort) return; + + wrtr.Write(leftColumn[i]); + wrtr.Write(new string(' ', maxLen - leftColumn[i].Length + 3)); + wrtr.WriteLine(rightColumn[i]); + } + + ///-------- + /// Body + ///-------- + foreach (var wm in batch.WaterMeters) + { + WriteWM(wrtr, wm); + if (abort) return; + } + + ///---------- + /// Footer + ///---------- + if (!string.IsNullOrEmpty(writerCfg.Footer)) wrtr.Write(footer); + } + + /// + /// Write one water meter results + /// + /// Water meter number (0-based) + void WriteWM(StreamWriter wr, Results.Entities.WaterMeter wm) + { + wr.WriteLine(string.Empty); + + /// Write water meter number and s/n +#if BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT + wr.Write(string.Format("Water meter {0} s/n: {1}", wm.WMPosition, wm.SerialNr)); +#else + wr.Write(string.Format(Strings.Water_Meter_nr, wm.WMPosition)); + if (!wm.Compound()) + { + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + wr.Write(string.Format(", {0} {1}", Strings.SerialNr, wm.SerialNr)); + } + } + else + { + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + wr.Write(string.Format(", {0} {1}", Strings.Main_WM_SerialNr, wm.SerialNr)); + } + if (!string.IsNullOrEmpty(wm.SerialNrAux)) + { + wr.Write(string.Format(", {0} {1}", Strings.Aux_WM_SerialNr, wm.SerialNrAux)); + } + } +#endif + wr.WriteLine(string.Empty); + + /// Determine column widths + int[] columnWidths = new int[testItems.Count]; + int totalWidth = 0; + for (int i = 0; i < testItems.Count; i++) + { + if (abort) return; + + columnWidths[i] = ElSpaces(testItems[i].Caption).Length; + foreach (var mtr in wm.MeterTestRslts) + { + if ((mtr != null) && (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]; } + + int len = ElSpaces(itemText).Length; + if (len > columnWidths[i]) columnWidths[i] = len; + } + } + totalWidth += columnWidths[i]; + } + totalWidth += 3 * (testItems.Count - 1); + if (totalWidth < 0) totalWidth = 0; + + string horizontalLine = new String('-', totalWidth); + + wr.WriteLine(horizontalLine); /// Horizontal line above the header + + /// Write column headers + for (int i = 0; i < testItems.Count; i++) + { + if (abort) return; + + string caption = ElSpaces(testItems[i].Caption); + wr.Write(caption); + + if (i < testItems.Count - 1) + { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - testItems[i].Caption.Length + 3)); + } + wr.Write(separatorStr); + } + else + { + wr.WriteLine(string.Empty); + } + } + + wr.WriteLine(horizontalLine); /// Horizontal line between the header and the body + + /// Write table data + foreach (var mtr in wm.MeterTestRslts) + { + if (abort) return; + + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + for (int i = 0; i < testItems.Count; i++) + { + /// Fetch the item + string itemText = testItems[i].Print(wm, mtr.Name()); + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + /// Print the item + string itemText2 = ElSpaces(itemText); + wr.Write(itemText2); + + if (i < testItems.Count - 1) + { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - itemText.Length + 3)); + } + wr.Write(separatorStr); + } + else + { + wr.WriteLine(string.Empty); + } + } + } + } + + wr.WriteLine(horizontalLine); /// Horizontal line below the body + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs new file mode 100644 index 000000000..c2ec31d51 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class WriterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(WriterCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new WriterCfgCtrl(); } + + public string DestinationPath; /// Directory path into which the results will be saved + public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved + public YearFolders YearFolders; + public MonthFolders MonthFolders; + public DayFolders DayFolders; + public string FileNameFormat; + public Culture Culture; + public Separator Separator; + public bool EliminateSpaces; + public string[] CommonItems; + public string[] SelectedItems; + public string Header; + public string Footer; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + WriterCfg() + { + } + + public WriterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + DestinationPath = Program.HomeDir + "Results\\"; + DestinationPath2 = string.Empty; + YearFolders = YearFolders.FourDigit; + MonthFolders = MonthFolders.Digit; + DayFolders = DayFolders.Digit; + FileNameFormat = "{0:yyMMdd-HHmm}.txt"; + Separator = Separator.None; + EliminateSpaces = false; + Header = string.Empty; + Footer = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Path={1}, Y={2}, M={3}, D={4}, FNameFmt={5}, Separator={6}, EliminateSpaces={7}", + Name, + DestinationPath, + YearFolders, + MonthFolders, + DayFolders, + FileNameFormat, + Separator, + EliminateSpaces); + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs new file mode 100644 index 000000000..e5d76f0f2 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs @@ -0,0 +1,338 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public partial class WriterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(WriterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + WriterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as WriterCfg; + Redraw(); + } + } + + string header; + string[] commonItems; + string[] testItems; + string footer; + + public WriterCfgCtrl() + { + InitializeComponent(); + Localize(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString()); + for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString()); + for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString()); + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + for (Separator s = 0; s < Separator.Count; s++) separatorComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems = config.CommonItems; + testItems = config.SelectedItems; + footer = config.Footer; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + destinationLabel.Text = "Destination"; + destination2Label.Text = "Destination" + " 2"; + yearFoldersLabel.Text = "Year folders"; + monthFoldersLabel.Text = "Month folders"; + dayFoldersLabel.Text = "Day folders"; + fileNameFmtLabel.Text = "File name format"; + cultureLabel.Text = "Culture"; + separatorLabel.Text = "Separator"; + eliminateSpacesCheckBox.Text = "No spaces"; + headerButton.Text = Strings.Header; + commonItemsButton.Text = "Common items"; + testItemsButton.Text = "Test items"; + footerButton.Text = Strings.Footer; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + destinationTextBox.Text = config.DestinationPath; + destination2TextBox.Text = config.DestinationPath2; + yearFoldersComboBox.Text = config.YearFolders.ToString(); + monthFoldersComboBox.Text = config.MonthFolders.ToString(); + dayFoldersComboBox.Text = config.DayFolders.ToString(); + fileNameFmtTextBox.Text = config.FileNameFormat; + cultureComboBox.Text = config.Culture.ToString(); + separatorComboBox.Text = config.Separator.ToString(); + eliminateSpacesCheckBox.Checked = config.EliminateSpaces; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + destinationTextBox.Enabled = true; + destinationButton.Enabled = true; + destination2TextBox.Enabled = true; + destination2Button.Enabled = true; + yearFoldersComboBox.Enabled = true; + monthFoldersComboBox.Enabled = true; + dayFoldersComboBox.Enabled = true; + fileNameFmtTextBox.Enabled = true; + cultureComboBox.Enabled = true; + separatorComboBox.Enabled = true; + eliminateSpacesCheckBox.Enabled = true; + headerButton.Enabled = true; + commonItemsButton.Enabled = true; + testItemsButton.Enabled = true; + footerButton.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid year folders selection"; + } + + if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid month folders selection"; + } + + if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid day folder selection"; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + if (!separatorComboBox.Items.Contains(separatorComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid separator"; + } + 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.DestinationPath != destinationTextBox.Text) + { + config.DestinationPath = destinationTextBox.Text; + if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath2 != destination2TextBox.Text) + { + config.DestinationPath2 = destination2TextBox.Text; + if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (YearFolders i = 0; i < YearFolders.Count; i++) + { + if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i)) + { + config.YearFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (MonthFolders i = 0; i < MonthFolders.Count; i++) + { + if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i)) + { + config.MonthFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (DayFolders i = 0; i < DayFolders.Count; i++) + { + if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i)) + { + config.DayFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.FileNameFormat != fileNameFmtTextBox.Text) + { + config.FileNameFormat = fileNameFmtTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (Culture i = 0; i < Culture.Count; i++) + { + if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i)) + { + config.Culture = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (Separator i = 0; i < Separator.Count; i++) + { + if (i.ToString().Equals(separatorComboBox.Text) && (config.Separator != i)) + { + config.Separator = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.EliminateSpaces != eliminateSpacesCheckBox.Checked) + { + config.EliminateSpaces = eliminateSpacesCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.CommonItems != commonItems) + { + config.CommonItems = commonItems; + 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) + { + Writer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + 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 commonItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems = 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/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs new file mode 100644 index 000000000..fffe5291a --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs @@ -0,0 +1,371 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + partial class WriterCfgCtrl + { + /// + /// 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.destinationTextBox = new System.Windows.Forms.TextBox(); + this.destinationLabel = new System.Windows.Forms.Label(); + this.destinationButton = new System.Windows.Forms.Button(); + this.separatorLabel = new System.Windows.Forms.Label(); + this.separatorComboBox = new System.Windows.Forms.ComboBox(); + this.testItemsButton = new System.Windows.Forms.Button(); + this.yearFoldersLabel = new System.Windows.Forms.Label(); + this.monthFoldersLabel = new System.Windows.Forms.Label(); + this.dayFoldersLabel = new System.Windows.Forms.Label(); + this.yearFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.monthFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.dayFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.destination2Button = new System.Windows.Forms.Button(); + this.destination2TextBox = new System.Windows.Forms.TextBox(); + this.destination2Label = new System.Windows.Forms.Label(); + this.fileNameFmtTextBox = new System.Windows.Forms.TextBox(); + this.fileNameFmtLabel = new System.Windows.Forms.Label(); + this.eliminateSpacesCheckBox = new System.Windows.Forms.CheckBox(); + this.headerButton = new System.Windows.Forms.Button(); + this.footerButton = new System.Windows.Forms.Button(); + this.commonItemsButton = new System.Windows.Forms.Button(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(108, 28); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(17, 31); + 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(105, 6); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // destinationTextBox + // + this.destinationTextBox.Enabled = false; + this.destinationTextBox.Location = new System.Drawing.Point(108, 49); + this.destinationTextBox.Name = "destinationTextBox"; + this.destinationTextBox.Size = new System.Drawing.Size(146, 20); + this.destinationTextBox.TabIndex = 4; + // + // destinationLabel + // + this.destinationLabel.AutoSize = true; + this.destinationLabel.Location = new System.Drawing.Point(17, 52); + this.destinationLabel.Name = "destinationLabel"; + this.destinationLabel.Size = new System.Drawing.Size(60, 13); + this.destinationLabel.TabIndex = 3; + this.destinationLabel.Text = "Destination"; + // + // destinationButton + // + this.destinationButton.Enabled = false; + this.destinationButton.Location = new System.Drawing.Point(269, 49); + this.destinationButton.Name = "destinationButton"; + this.destinationButton.Size = new System.Drawing.Size(30, 20); + this.destinationButton.TabIndex = 5; + this.destinationButton.Text = "..."; + this.destinationButton.UseVisualStyleBackColor = true; + this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); + // + // separatorLabel + // + this.separatorLabel.AutoSize = true; + this.separatorLabel.Location = new System.Drawing.Point(17, 203); + this.separatorLabel.Name = "separatorLabel"; + this.separatorLabel.Size = new System.Drawing.Size(53, 13); + this.separatorLabel.TabIndex = 19; + this.separatorLabel.Text = "Separator"; + // + // separatorComboBox + // + this.separatorComboBox.Enabled = false; + this.separatorComboBox.FormattingEnabled = true; + this.separatorComboBox.Location = new System.Drawing.Point(108, 200); + this.separatorComboBox.Name = "separatorComboBox"; + this.separatorComboBox.Size = new System.Drawing.Size(146, 21); + this.separatorComboBox.TabIndex = 20; + // + // testItemsButton + // + this.testItemsButton.Enabled = false; + this.testItemsButton.Location = new System.Drawing.Point(108, 297); + this.testItemsButton.Name = "testItemsButton"; + this.testItemsButton.Size = new System.Drawing.Size(146, 23); + this.testItemsButton.TabIndex = 24; + this.testItemsButton.Text = "Test items"; + this.testItemsButton.UseVisualStyleBackColor = true; + this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); + // + // yearFoldersLabel + // + this.yearFoldersLabel.AutoSize = true; + this.yearFoldersLabel.Location = new System.Drawing.Point(17, 94); + this.yearFoldersLabel.Name = "yearFoldersLabel"; + this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13); + this.yearFoldersLabel.TabIndex = 9; + this.yearFoldersLabel.Text = "Year folders"; + // + // monthFoldersLabel + // + this.monthFoldersLabel.AutoSize = true; + this.monthFoldersLabel.Location = new System.Drawing.Point(17, 116); + this.monthFoldersLabel.Name = "monthFoldersLabel"; + this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13); + this.monthFoldersLabel.TabIndex = 11; + this.monthFoldersLabel.Text = "Month folders"; + // + // dayFoldersLabel + // + this.dayFoldersLabel.AutoSize = true; + this.dayFoldersLabel.Location = new System.Drawing.Point(17, 138); + this.dayFoldersLabel.Name = "dayFoldersLabel"; + this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13); + this.dayFoldersLabel.TabIndex = 13; + this.dayFoldersLabel.Text = "Day folders"; + // + // yearFoldersComboBox + // + this.yearFoldersComboBox.Enabled = false; + this.yearFoldersComboBox.FormattingEnabled = true; + this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 91); + this.yearFoldersComboBox.Name = "yearFoldersComboBox"; + this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.yearFoldersComboBox.TabIndex = 10; + // + // monthFoldersComboBox + // + this.monthFoldersComboBox.Enabled = false; + this.monthFoldersComboBox.FormattingEnabled = true; + this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 113); + this.monthFoldersComboBox.Name = "monthFoldersComboBox"; + this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.monthFoldersComboBox.TabIndex = 12; + // + // dayFoldersComboBox + // + this.dayFoldersComboBox.Enabled = false; + this.dayFoldersComboBox.FormattingEnabled = true; + this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 135); + this.dayFoldersComboBox.Name = "dayFoldersComboBox"; + this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.dayFoldersComboBox.TabIndex = 14; + // + // destination2Button + // + this.destination2Button.Enabled = false; + this.destination2Button.Location = new System.Drawing.Point(269, 70); + this.destination2Button.Name = "destination2Button"; + this.destination2Button.Size = new System.Drawing.Size(30, 20); + this.destination2Button.TabIndex = 8; + this.destination2Button.Text = "..."; + this.destination2Button.UseVisualStyleBackColor = true; + // + // destination2TextBox + // + this.destination2TextBox.Enabled = false; + this.destination2TextBox.Location = new System.Drawing.Point(108, 70); + this.destination2TextBox.Name = "destination2TextBox"; + this.destination2TextBox.Size = new System.Drawing.Size(146, 20); + this.destination2TextBox.TabIndex = 7; + // + // destination2Label + // + this.destination2Label.AutoSize = true; + this.destination2Label.Location = new System.Drawing.Point(17, 73); + this.destination2Label.Name = "destination2Label"; + this.destination2Label.Size = new System.Drawing.Size(69, 13); + this.destination2Label.TabIndex = 6; + this.destination2Label.Text = "Destination 2"; + // + // fileNameFmtTextBox + // + this.fileNameFmtTextBox.Enabled = false; + this.fileNameFmtTextBox.Location = new System.Drawing.Point(108, 157); + this.fileNameFmtTextBox.Name = "fileNameFmtTextBox"; + this.fileNameFmtTextBox.Size = new System.Drawing.Size(146, 20); + this.fileNameFmtTextBox.TabIndex = 16; + // + // fileNameFmtLabel + // + this.fileNameFmtLabel.AutoSize = true; + this.fileNameFmtLabel.Location = new System.Drawing.Point(17, 160); + this.fileNameFmtLabel.Name = "fileNameFmtLabel"; + this.fileNameFmtLabel.Size = new System.Drawing.Size(84, 13); + this.fileNameFmtLabel.TabIndex = 15; + this.fileNameFmtLabel.Text = "File name format"; + // + // eliminateSpacesCheckBox + // + this.eliminateSpacesCheckBox.AutoSize = true; + this.eliminateSpacesCheckBox.Location = new System.Drawing.Point(108, 227); + this.eliminateSpacesCheckBox.Name = "eliminateSpacesCheckBox"; + this.eliminateSpacesCheckBox.Size = new System.Drawing.Size(77, 17); + this.eliminateSpacesCheckBox.TabIndex = 21; + this.eliminateSpacesCheckBox.Text = "No spaces"; + this.eliminateSpacesCheckBox.UseVisualStyleBackColor = true; + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(108, 247); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(146, 23); + this.headerButton.TabIndex = 22; + this.headerButton.Text = "Header"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // footerButton + // + this.footerButton.Enabled = false; + this.footerButton.Location = new System.Drawing.Point(108, 322); + this.footerButton.Name = "footerButton"; + this.footerButton.Size = new System.Drawing.Size(146, 23); + this.footerButton.TabIndex = 25; + this.footerButton.Text = "Footer"; + this.footerButton.UseVisualStyleBackColor = true; + this.footerButton.Click += new System.EventHandler(this.footerButton_Click); + // + // commonItemsButton + // + this.commonItemsButton.Enabled = false; + this.commonItemsButton.Location = new System.Drawing.Point(108, 272); + this.commonItemsButton.Name = "commonItemsButton"; + this.commonItemsButton.Size = new System.Drawing.Size(146, 23); + this.commonItemsButton.TabIndex = 23; + this.commonItemsButton.Text = "Common items"; + this.commonItemsButton.UseVisualStyleBackColor = true; + this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click); + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(108, 178); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(146, 21); + this.cultureComboBox.TabIndex = 18; + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(17, 181); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 17; + this.cultureLabel.Text = "Cullture"; + // + // WriterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.commonItemsButton); + this.Controls.Add(this.footerButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.eliminateSpacesCheckBox); + this.Controls.Add(this.fileNameFmtTextBox); + this.Controls.Add(this.fileNameFmtLabel); + this.Controls.Add(this.destination2Button); + this.Controls.Add(this.destination2TextBox); + this.Controls.Add(this.destination2Label); + this.Controls.Add(this.dayFoldersComboBox); + this.Controls.Add(this.monthFoldersComboBox); + this.Controls.Add(this.yearFoldersComboBox); + this.Controls.Add(this.dayFoldersLabel); + this.Controls.Add(this.monthFoldersLabel); + this.Controls.Add(this.yearFoldersLabel); + this.Controls.Add(this.testItemsButton); + this.Controls.Add(this.separatorComboBox); + this.Controls.Add(this.separatorLabel); + this.Controls.Add(this.destinationButton); + this.Controls.Add(this.destinationTextBox); + this.Controls.Add(this.destinationLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "WriterCfgCtrl"; + this.Size = new System.Drawing.Size(400, 350); + this.Load += new System.EventHandler(this.WriterCfgCtrl_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.TextBox destinationTextBox; + private System.Windows.Forms.Label destinationLabel; + private System.Windows.Forms.Button destinationButton; + private System.Windows.Forms.Label separatorLabel; + private System.Windows.Forms.ComboBox separatorComboBox; + private System.Windows.Forms.Button testItemsButton; + private System.Windows.Forms.Label yearFoldersLabel; + private System.Windows.Forms.Label monthFoldersLabel; + private System.Windows.Forms.Label dayFoldersLabel; + private System.Windows.Forms.ComboBox yearFoldersComboBox; + private System.Windows.Forms.ComboBox monthFoldersComboBox; + private System.Windows.Forms.ComboBox dayFoldersComboBox; + private System.Windows.Forms.Button destination2Button; + private System.Windows.Forms.TextBox destination2TextBox; + private System.Windows.Forms.Label destination2Label; + private System.Windows.Forms.TextBox fileNameFmtTextBox; + private System.Windows.Forms.Label fileNameFmtLabel; + private System.Windows.Forms.CheckBox eliminateSpacesCheckBox; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button footerButton; + private System.Windows.Forms.Button commonItemsButton; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Label cultureLabel; + } +} diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.resx b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.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/Output/Printers/OnePagePerMeter/FactoryCompound.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryCompound.cs new file mode 100644 index 000000000..6200b930e --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/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.OnePagePerMeter +{ + 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.OnePagePerMeter.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/OnePagePerMeter/FactoryHeatMeters.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryHeatMeters.cs new file mode 100644 index 000000000..e9abdd65f --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/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.OnePagePerMeter +{ + 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.OnePagePerMeter.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/OnePagePerMeter/FactorySingle.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactorySingle.cs new file mode 100644 index 000000000..f4a9451c9 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/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.OnePagePerMeter +{ + 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.OnePagePerMeter.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/OnePagePerMeter/Printer.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/Printer.cs new file mode 100644 index 000000000..49673bcf9 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/Printer.cs @@ -0,0 +1,191 @@ +/// +/// 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.OnePagePerMeter +{ + 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(); + } + } + } +} diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfg.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfg.cs new file mode 100644 index 000000000..130c59676 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfg.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.OnePagePerMeter +{ + 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 string[] CommonItems; + 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/OnePagePerMeter/PrinterCfgCtrl.Designer.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.Designer.cs new file mode 100644 index 000000000..e8727f91a --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.Designer.cs @@ -0,0 +1,458 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.Printers.OnePagePerMeter +{ + 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.commonItemsButton = 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.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(143, 188); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 24; + 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, 209); + 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, 212); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 25; + this.cultureLabel.Text = "Cullture"; + // + // commonItemsButton + // + this.commonItemsButton.Enabled = false; + this.commonItemsButton.Location = new System.Drawing.Point(142, 259); + this.commonItemsButton.Name = "commonItemsButton"; + this.commonItemsButton.Size = new System.Drawing.Size(218, 23); + this.commonItemsButton.TabIndex = 28; + this.commonItemsButton.Text = "Common items"; + this.commonItemsButton.UseVisualStyleBackColor = true; + this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_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 = 30; + 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, 234); + 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 = 29; + 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."; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + 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.commonItemsButton); + 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 commonItemsButton; + 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; + } +} diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.cs new file mode 100644 index 000000000..7db69acfd --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.cs @@ -0,0 +1,396 @@ +/// +/// 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.OnePagePerMeter +{ + 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[] commonItems; + 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; + commonItems = config.CommonItems; + testItems = config.SelectedItems; + footer = config.Footer; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + cultureLabel.Text = "Culture"; + headerButton.Text = Strings.Header; + commonItemsButton.Text = "Common items"; + 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); + + 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; + commonItemsButton.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; + 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"; + } + + 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); + } + + if (config.CommonItems != commonItems) + { + config.CommonItems = commonItems; + 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 commonItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems = 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/OnePagePerMeter/PrinterCfgCtrl.resx b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/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 eb67d3bb3..4ec5e1b01 100644 --- a/TestBenchFramework/BenchControl/TbfComponents.cs +++ b/TestBenchFramework/BenchControl/TbfComponents.cs @@ -87,13 +87,20 @@ namespace TBF.BenchControl Factories.Add(new Output.FileWriters.Enhanced.FactorySingle()); Factories.Add(new Output.FileWriters.Enhanced.FactoryCompound()); Factories.Add(new Output.FileWriters.Enhanced.FactoryHeatMeters()); + Factories.Add(new Output.FileWriters.ImageArchiver.Factory()); + Factories.Add(new Output.FileWriters.OneFilePerMeter.FactorySingle()); + Factories.Add(new Output.FileWriters.OneFilePerMeter.FactoryCompound()); + Factories.Add(new Output.FileWriters.OneFilePerMeter.FactoryHeatMeters()); Factories.Add(new Output.FileWriters.Xml.FactorySingle()); Factories.Add(new Output.FileWriters.Xml.FactoryCompound()); Factories.Add(new Output.FileWriters.Xml.FactoryHeatMeters()); Factories.Add(new Output.Printers.Enhanced.FactorySingle()); Factories.Add(new Output.Printers.Enhanced.FactoryCompound()); Factories.Add(new Output.Printers.Enhanced.FactoryHeatMeters()); - Factories.Add(new Elde.PressureMeter.PressureMeterFactory()); + Factories.Add(new Output.Printers.OnePagePerMeter.FactorySingle()); + Factories.Add(new Output.Printers.OnePagePerMeter.FactoryCompound()); + Factories.Add(new Output.Printers.OnePagePerMeter.FactoryHeatMeters()); + Factories.Add(new Elde.PressureMeter.PressureMeterFactory()); Factories.Add(new Elde.PressureMeterInternal.PressureMeterFactory()); Factories.Add(new Elde.Pump.PumpFactory()); Factories.Add(new Danfoss.VLT2800.PumpFactory()); diff --git a/TestBenchFramework/TBF.csproj b/TestBenchFramework/TBF.csproj index acfeeb820..dc49cfb6e 100644 --- a/TestBenchFramework/TBF.csproj +++ b/TestBenchFramework/TBF.csproj @@ -659,6 +659,26 @@ WriterCfgCtrl.cs + + + + + UserControl + + + ArchiverCfgCtrl.cs + + + + + + + + UserControl + + + WriterCfgCtrl.cs + @@ -687,6 +707,17 @@ PrinterCfgCtrl.cs + + + + + + + UserControl + + + PrinterCfgCtrl.cs + @@ -1988,6 +2019,12 @@ WriterCfgCtrl.cs + + ArchiverCfgCtrl.cs + + + WriterCfgCtrl.cs + WriterCfgCtrl.cs @@ -1997,6 +2034,9 @@ PrinterCfgCtrl.cs + + PrinterCfgCtrl.cs + PrinterCfgCtrl.cs