diff --git a/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs b/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs index 2e53281fa..aa4dd53e5 100644 --- a/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs +++ b/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs @@ -216,7 +216,8 @@ namespace Results.Output.Printers.Enhanced for (int wmNr = nextWMNr; wmNr < Math.Min(nextWMNr + nrWMsOnPage, batch.WaterMeters.Count); wmNr++) /// wmNr is 0-based { int wmPosition = true ? batch.WaterMeters[wmNr].WMPosition : (wmNr + 1); - nextWmTop += PrintWM(e, batch.WaterMeters[wmNr], wmPosition, nextWmTop); + int sectionHght = PrintWM(e, batch.WaterMeters[wmNr], wmPosition, nextWmTop); + nextWmTop += sectionHght; } nextWMNr += nrWMsOnPage; @@ -296,9 +297,12 @@ namespace Results.Output.Printers.Enhanced { if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always)) { - testsCount++; - for (int i = 0; i < testItems.Count; i++) + WMeterRsltItemSpec.TableRowNr = ++testsCount; + + for (int i = 0; i < testItems.Count; i++) { + WMeterRsltItemSpec.TableColumnNr = i + 1; + string itemText = testItems[i].Print(wm, mtr.Name()); /// Strip color information diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/Basic/Writer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/Basic/Writer.cs index 15e3f01b5..19b22d4f5 100644 --- a/TestBenchFramework/BenchControl/Output/FileWriters/Basic/Writer.cs +++ b/TestBenchFramework/BenchControl/Output/FileWriters/Basic/Writer.cs @@ -7,9 +7,6 @@ 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.Basic { @@ -19,16 +16,20 @@ namespace TBF.BenchControl.Output.FileWriters.Basic public override string ToString() { return string.Format("Output.FileWriters.Basic({0})", Cfg.ToString(1)); } readonly WriterCfg writerCfg; - readonly string separatorStr; + + string separatorStr; /// /// Result items to print /// - readonly IList rsltItems; + string header; + IList commonItems; + IList rsltItems; + string footer; Results.Entities.Batch batch; - bool abort; /// Set to 'true' by Stop() operation to abort writing to the file + bool abort; public Writer() {} @@ -37,24 +38,88 @@ namespace TBF.BenchControl.Output.FileWriters.Basic : base(cfg) { writerCfg = cfg as WriterCfg; - - 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; - } - - rsltItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.SelectedItems); - + 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); + rsltItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.SelectedItems); + 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.SaveGoodOnly = newCfg.SaveGoodOnly; + writerCfg.Header = newCfg.Header; + writerCfg.CommonItems = newCfg.CommonItems; + writerCfg.SelectedItems = newCfg.SelectedItems; + 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. /// @@ -67,10 +132,10 @@ namespace TBF.BenchControl.Output.FileWriters.Basic switch (writerCfg.YearFolders) { case YearFolders.FourDigit: - directory = string.Format("{0}{1}\\", directory, time.Year.ToString("D4")); + directory = string.Format("{0}{1:yyyy}\\", directory, time); break; case YearFolders.TwoDigit: - directory = string.Format("{0}{1}\\", directory, (time.Year % 100).ToString("D2")); + directory = string.Format("{0}{1:yy}\\", directory, time); break; } @@ -102,7 +167,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic directory = string.Format("{0}{1}\\", directory, time.Month.ToString()); break; case MonthFolders.TwoDigit: - directory = string.Format("{0}{1}\\", directory, time.Month.ToString("D2")); + directory = string.Format("{0}{1:MM}\\", directory, time); break; } @@ -112,7 +177,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic directory = string.Format("{0}{1}\\", directory, time.Day.ToString()); break; case DayFolders.TwoDigit: - directory = string.Format("{0}{1}\\", directory, time.Day.ToString("D2")); + directory = string.Format("{0}{1:dd}\\", directory, time); break; } @@ -146,12 +211,13 @@ namespace TBF.BenchControl.Output.FileWriters.Basic /// Start this operation public void Start() { - CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; try { Thread.CurrentThread.CurrentCulture = new CultureInfo(writerCfg.Culture.ToString()); } catch { } - WriteRslts(batch, writerCfg.DestinationPath); + abort = false; + WriteRslts(batch, writerCfg.DestinationPath); WriteRslts(batch, writerCfg.DestinationPath2); Thread.CurrentThread.CurrentCulture = oriCulture; @@ -172,54 +238,188 @@ namespace TBF.BenchControl.Output.FileWriters.Basic void WriteRslts(Results.Entities.Batch batch, string destination) { - if (batch == null || batch.WaterMeters == null || batch.WaterMeters.Count <= 0) return; - if (rsltItems == null || rsltItems.Count == 0) return; + if (string.IsNullOrEmpty(destination) || batch == null || + batch.WaterMeters == null || + batch.WaterMeters.Count == 0) + { + return; + } StreamWriter writer = StreamWriter.Null; - if (!string.IsNullOrEmpty(writerCfg.DestinationPath)) + try { - try - { - writer = File.AppendText(GetFilename(writerCfg.DestinationPath, batch.EndTime)); - } - catch - { - } + writer = File.AppendText(GetFilename(destination, batch.EndTime)); + WriteRsltsEx(batch, writer); + } + catch + { + } + finally + { + writer.Close(); + } + } + + void WriteRsltsEx(Results.Entities.Batch batch, StreamWriter wrtr) + { + ///---------- + /// Header + ///---------- + if (!string.IsNullOrEmpty(writerCfg.Header)) + { + wrtr.Write(header); } - foreach (var wm in batch.WaterMeters) + ///---------------- + /// Common items + ///---------------- + string[] leftColumn = new string[commonItems.Count]; + string[] rightColumn = new string[commonItems.Count]; + + int cnt = 0; + foreach (var v in commonItems) { - if (!writerCfg.SaveGoodOnly || wm.Passed) - { - WriteWM(writer, wm); - if (abort) return; - } + leftColumn[cnt] = v.Caption; + rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty; + cnt++; } - writer.Close(); + /// 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]); + if (!writerCfg.EliminateSpaces) + { + wrtr.Write(new string(' ', maxLen - leftColumn[i].Length + 3)); + } + wrtr.Write(separatorStr); + wrtr.WriteLine(rightColumn[i]); + } + + wrtr.WriteLine(); + + ///-------- + /// Body + ///-------- + WriteWMs(batch, wrtr); + + ///---------- + /// 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) + void WriteWMs(Results.Entities.Batch batch, StreamWriter wr) { + /// Determine column widths + int[] columnWidths = new int[rsltItems.Count]; + int totalWidth = 0; for (int i = 0; i < rsltItems.Count; i++) { if (abort) return; - wr.Write(rsltItems[i].Print(wm)); + columnWidths[i] = ElSpaces(rsltItems[i].Caption).Length; + foreach (var wm in batch.WaterMeters) + { + if (!writerCfg.SaveGoodOnly || wm.Passed) + { + string itemText = rsltItems[i].Print(wm); + + /// 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 * (rsltItems.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 < rsltItems.Count; i++) + { + if (abort) return; + + string caption = ElSpaces(rsltItems[i].Caption); + wr.Write(caption); if (i < rsltItems.Count - 1) { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - rsltItems[i].Caption.Length + 3)); + } wr.Write(separatorStr); } else { - wr.WriteLine(string.Empty); + wr.WriteLine(); } } - } + + //wr.WriteLine(horizontalLine); /// Horizontal line between the header and the body + + int rowsCount = 0; + foreach (var wm in batch.WaterMeters) + { + if (!writerCfg.SaveGoodOnly || wm.Passed) + { + if (abort) return; + + Results.WMeterRsltItemSpec.TableRowNr = ++rowsCount; + + for (int i = 0; i < rsltItems.Count; i++) + { + Results.WMeterRsltItemSpec.TableColumnNr = i + 1; + + /// Fetch the item + string itemText = rsltItems[i].Print(wm); + + /// 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 < rsltItems.Count - 1) + { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - itemText.Length + 3)); + } + wr.Write(separatorStr); + } + else + { + wr.WriteLine(); + } + } + } + } + + //wr.WriteLine(horizontalLine); /// Horizontal line between the header and the body + } } } diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfg.cs b/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfg.cs index cb81d08b1..bdeaa06c3 100644 --- a/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfg.cs +++ b/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfg.cs @@ -1,9 +1,6 @@ /// /// Copyright (c) 2013-2017 Sensus Metering Systems /// -using System; -using System.Collections.Generic; -using System.IO; using System.Xml.Serialization; using TBF.BenchControl.Generic; @@ -24,8 +21,12 @@ namespace TBF.BenchControl.Output.FileWriters.Basic public string FileNameFormat; public Culture Culture; public Separator Separator; - public bool SaveGoodOnly; - public string[] SelectedItems; + public bool EliminateSpaces; + public bool SaveGoodOnly; + public string Header; + public string[] CommonItems; + public string[] SelectedItems; + public string Footer; [XmlIgnore] public Config.Entities.MetersKind MetersKind; @@ -48,14 +49,17 @@ namespace TBF.BenchControl.Output.FileWriters.Basic YearFolders = YearFolders.FourDigit; MonthFolders = MonthFolders.Digit; DayFolders = DayFolders.Digit; - FileNameFormat = "{0:yyyyMMdd}"; + FileNameFormat = "{0:yyMMdd-HHmm}.csv"; Separator = Separator.None; + EliminateSpaces = false; SaveGoodOnly = 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}, GoodOnly={7}", + return string.Format("{0}, Path={1}, Y={2}, M={3}, D={4}, FNameFmt={5}, Separator={6}, NoSpaces={7}, GoodOnly={8}", Name, DestinationPath, YearFolders, @@ -63,6 +67,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic DayFolders, FileNameFormat, Separator, + EliminateSpaces, SaveGoodOnly); } } diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.cs b/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.cs index 76f9405bc..6f7b195f9 100644 --- a/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.cs +++ b/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.cs @@ -1,12 +1,11 @@ /// -/// Copyright (c) 2016 Sensus Metering Systems +/// Copyright (c) 2016-2017 Sensus Metering Systems /// using System; -using System.Collections.Generic; using System.Windows.Forms; using log4net; using TBF.BenchControl.Generic; -using Results.Forms; +using TBF.Resources; namespace TBF.BenchControl.Output.FileWriters.Basic { @@ -29,12 +28,16 @@ namespace TBF.BenchControl.Output.FileWriters.Basic } } + string header; + string[] commonItems; string[] selectedItems; + string footer; public WriterCfgCtrl() { InitializeComponent(); - } + Localize(); + } private void WriterCfgCtrl_Load(object sender, EventArgs e) { @@ -44,11 +47,33 @@ namespace TBF.BenchControl.Output.FileWriters.Basic 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; selectedItems = 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"; + goodOnlyCheckBox.Text = "Good only"; + headerButton.Text = Strings.Header; + commonItemsButton.Text = "Common items"; + selectItemsButton.Text = "Selected items"; + footerButton.Text = Strings.Footer; + } + public void Closing() { } @@ -66,8 +91,9 @@ namespace TBF.BenchControl.Output.FileWriters.Basic fileNameFmtTextBox.Text = config.FileNameFormat; cultureComboBox.Text = config.Culture.ToString(); separatorComboBox.Text = config.Separator.ToString(); + eliminateSpacesCheckBox.Checked = config.EliminateSpaces; goodOnlyCheckBox.Checked = config.SaveGoodOnly; - } + } public void Unlock() { @@ -82,8 +108,12 @@ namespace TBF.BenchControl.Output.FileWriters.Basic fileNameFmtTextBox.Enabled = true; cultureComboBox.Enabled = true; separatorComboBox.Enabled = true; + eliminateSpacesCheckBox.Enabled = true; goodOnlyCheckBox.Enabled = true; + headerButton.Enabled = true; + commonItemsButton.Enabled = true; selectItemsButton.Enabled = true; + footerButton.Enabled = true; } public CfgUpdateFlags VerifyCfg(ref string message) @@ -128,20 +158,24 @@ namespace TBF.BenchControl.Output.FileWriters.Basic 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.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.RestartRqrd; - } + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } if (config.DestinationPath2 != destination2TextBox.Text) { config.DestinationPath2 = destination2TextBox.Text; if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\"; - flags = CfgUpdateFlags.RestartRqrd; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); } for (YearFolders i = 0; i < YearFolders.Count; i++) @@ -149,7 +183,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i)) { config.YearFolders = i; - flags = CfgUpdateFlags.RestartRqrd; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); break; } } @@ -159,7 +193,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i)) { config.MonthFolders = i; - flags = CfgUpdateFlags.RestartRqrd; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); break; } } @@ -169,7 +203,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i)) { config.DayFolders = i; - flags = CfgUpdateFlags.RestartRqrd; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); break; } } @@ -177,7 +211,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic if (config.FileNameFormat != fileNameFmtTextBox.Text) { config.FileNameFormat = fileNameFmtTextBox.Text; - flags = CfgUpdateFlags.RestartRqrd; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); } for (Culture i = 0; i < Culture.Count; i++) @@ -195,21 +229,50 @@ namespace TBF.BenchControl.Output.FileWriters.Basic if (i.ToString().Equals(separatorComboBox.Text) && (config.Separator != i)) { config.Separator = i; - flags = CfgUpdateFlags.RestartRqrd; - break; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; } } + if (config.EliminateSpaces != eliminateSpacesCheckBox.Checked) + { + config.EliminateSpaces = eliminateSpacesCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + if (config.SaveGoodOnly != goodOnlyCheckBox.Checked) { config.SaveGoodOnly = goodOnlyCheckBox.Checked; - flags = CfgUpdateFlags.RestartRqrd; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Header != header) + { + config.Header = header; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.CommonItems != commonItems) + { + config.CommonItems = commonItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); } if (config.SelectedItems != selectedItems) { config.SelectedItems = selectedItems; - flags = CfgUpdateFlags.RestartRqrd; + 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; @@ -220,9 +283,32 @@ namespace TBF.BenchControl.Output.FileWriters.Basic } + 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 selectItemsButton_Click(object sender, EventArgs e) { - ResultsConfigDlg dlg = new ResultsConfigDlg() + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() { MetersKind = config.MetersKind, SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(selectedItems), @@ -233,5 +319,30 @@ namespace TBF.BenchControl.Output.FileWriters.Basic selectedItems = 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/Basic/WriterCfgCtrl.designer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.designer.cs index f8947322a..6fb6b57ee 100644 --- a/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.designer.cs +++ b/TestBenchFramework/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.designer.cs @@ -54,6 +54,10 @@ namespace TBF.BenchControl.Output.FileWriters.Basic this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox(); this.cultureComboBox = new System.Windows.Forms.ComboBox(); this.cultureLabel = new System.Windows.Forms.Label(); + this.eliminateSpacesCheckBox = new System.Windows.Forms.CheckBox(); + this.commonItemsButton = new System.Windows.Forms.Button(); + this.headerButton = new System.Windows.Forms.Button(); + this.footerButton = new System.Windows.Forms.Button(); this.SuspendLayout(); // // nameTextBox @@ -105,7 +109,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic this.destinationButton.Location = new System.Drawing.Point(259, 56); this.destinationButton.Name = "destinationButton"; this.destinationButton.Size = new System.Drawing.Size(30, 20); - this.destinationButton.TabIndex = 18; + this.destinationButton.TabIndex = 25; this.destinationButton.Text = "..."; this.destinationButton.UseVisualStyleBackColor = true; this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); @@ -131,11 +135,11 @@ namespace TBF.BenchControl.Output.FileWriters.Basic // selectItemsButton // this.selectItemsButton.Enabled = false; - this.selectItemsButton.Location = new System.Drawing.Point(108, 225); + this.selectItemsButton.Location = new System.Drawing.Point(108, 277); this.selectItemsButton.Name = "selectItemsButton"; - this.selectItemsButton.Size = new System.Drawing.Size(145, 23); - this.selectItemsButton.TabIndex = 20; - this.selectItemsButton.Text = "Select items"; + this.selectItemsButton.Size = new System.Drawing.Size(146, 23); + this.selectItemsButton.TabIndex = 23; + this.selectItemsButton.Text = "Selected items"; this.selectItemsButton.UseVisualStyleBackColor = true; this.selectItemsButton.Click += new System.EventHandler(this.selectItemsButton_Click); // @@ -199,7 +203,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic this.destination2Button.Location = new System.Drawing.Point(259, 79); this.destination2Button.Name = "destination2Button"; this.destination2Button.Size = new System.Drawing.Size(30, 20); - this.destination2Button.TabIndex = 19; + this.destination2Button.TabIndex = 26; this.destination2Button.Text = "..."; this.destination2Button.UseVisualStyleBackColor = true; // @@ -240,10 +244,10 @@ namespace TBF.BenchControl.Output.FileWriters.Basic // goodOnlyCheckBox // this.goodOnlyCheckBox.AutoSize = true; - this.goodOnlyCheckBox.Location = new System.Drawing.Point(20, 229); + this.goodOnlyCheckBox.Location = new System.Drawing.Point(20, 268); this.goodOnlyCheckBox.Name = "goodOnlyCheckBox"; this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17); - this.goodOnlyCheckBox.TabIndex = 19; + this.goodOnlyCheckBox.TabIndex = 20; this.goodOnlyCheckBox.Text = "Good only"; this.goodOnlyCheckBox.UseVisualStyleBackColor = true; // @@ -265,10 +269,57 @@ namespace TBF.BenchControl.Output.FileWriters.Basic this.cultureLabel.TabIndex = 15; this.cultureLabel.Text = "Cullture"; // + // eliminateSpacesCheckBox + // + this.eliminateSpacesCheckBox.AutoSize = true; + this.eliminateSpacesCheckBox.Location = new System.Drawing.Point(20, 245); + this.eliminateSpacesCheckBox.Name = "eliminateSpacesCheckBox"; + this.eliminateSpacesCheckBox.Size = new System.Drawing.Size(77, 17); + this.eliminateSpacesCheckBox.TabIndex = 19; + this.eliminateSpacesCheckBox.Text = "No spaces"; + this.eliminateSpacesCheckBox.UseVisualStyleBackColor = true; + // + // commonItemsButton + // + this.commonItemsButton.Enabled = false; + this.commonItemsButton.Location = new System.Drawing.Point(108, 252); + this.commonItemsButton.Name = "commonItemsButton"; + this.commonItemsButton.Size = new System.Drawing.Size(146, 23); + this.commonItemsButton.TabIndex = 22; + this.commonItemsButton.Text = "Common items"; + this.commonItemsButton.UseVisualStyleBackColor = true; + this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click); + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(108, 227); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(146, 23); + this.headerButton.TabIndex = 21; + 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, 302); + this.footerButton.Name = "footerButton"; + this.footerButton.Size = new System.Drawing.Size(146, 23); + this.footerButton.TabIndex = 24; + this.footerButton.Text = "Footer"; + this.footerButton.UseVisualStyleBackColor = true; + this.footerButton.Click += new System.EventHandler(this.footerButton_Click); + // // WriterCfgCtrl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.footerButton); + this.Controls.Add(this.commonItemsButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.eliminateSpacesCheckBox); this.Controls.Add(this.cultureComboBox); this.Controls.Add(this.cultureLabel); this.Controls.Add(this.goodOnlyCheckBox); @@ -293,7 +344,7 @@ namespace TBF.BenchControl.Output.FileWriters.Basic this.Controls.Add(this.nameLabel); this.Controls.Add(this.classNameLabel); this.Name = "WriterCfgCtrl"; - this.Size = new System.Drawing.Size(300, 282); + this.Size = new System.Drawing.Size(400, 350); this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); this.ResumeLayout(false); this.PerformLayout(); @@ -325,5 +376,9 @@ namespace TBF.BenchControl.Output.FileWriters.Basic private System.Windows.Forms.CheckBox goodOnlyCheckBox; private System.Windows.Forms.ComboBox cultureComboBox; private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.CheckBox eliminateSpacesCheckBox; + private System.Windows.Forms.Button commonItemsButton; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button footerButton; } } diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/Writer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/Writer.cs index 8f3ac1965..628f2dce8 100644 --- a/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/Writer.cs +++ b/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/Writer.cs @@ -20,9 +20,7 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced string separatorStr; - /// /// Items to print - /// string header; IList commonItems; IList testItems; @@ -30,7 +28,7 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced Results.Entities.Batch batch; - bool abort; /// Set to 'true' by Stop() operation to abort writing to files + bool abort; public Writer() {} @@ -92,9 +90,9 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced writerCfg.Culture = newCfg.Culture; writerCfg.Separator = newCfg.Separator; writerCfg.EliminateSpaces = newCfg.EliminateSpaces; - writerCfg.CommonItems = newCfg.CommonItems; + writerCfg.Header = newCfg.Header; + writerCfg.CommonItems = newCfg.CommonItems; writerCfg.SelectedItems = newCfg.SelectedItems; - writerCfg.Header = newCfg.Header; writerCfg.Footer = newCfg.Footer; ApplyConfig(); @@ -213,12 +211,13 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced /// Start this operation public void Start() { - CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; try { Thread.CurrentThread.CurrentCulture = new CultureInfo(writerCfg.Culture.ToString()); } catch { } - WriteRslts(batch, writerCfg.DestinationPath); + abort = false; + WriteRslts(batch, writerCfg.DestinationPath); WriteRslts(batch, writerCfg.DestinationPath2); Thread.CurrentThread.CurrentCulture = oriCulture; @@ -239,6 +238,8 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced void WriteRslts(Results.Entities.Batch batch, string destination) { + if (batch == null || batch.WaterMeters == null || batch.WaterMeters.Count <= 0) return; + StreamWriter writer = StreamWriter.Null; if (!string.IsNullOrEmpty(destination)) { @@ -297,8 +298,11 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced ///-------- foreach (var wm in batch.WaterMeters) { - WriteWM(wrtr, wm); - if (abort) return; + if (!writerCfg.SaveGoodOnly || wm.Passed) + { + if (abort) return; + WriteWM(wrtr, wm); + } } ///---------- @@ -397,15 +401,20 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced wr.WriteLine(horizontalLine); /// Horizontal line between the header and the body /// Write table data - foreach (var mtr in wm.MeterTestRslts) + int rowsCount = 0; + 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++) + Results.WMeterRsltItemSpec.TableRowNr = ++rowsCount; + + for (int i = 0; i < testItems.Count; i++) { - /// Fetch the item + Results.WMeterRsltItemSpec.TableColumnNr = i + 1; + + /// Fetch the item string itemText = testItems[i].Print(wm, mtr.Name()); /// Strip color information diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfg.cs b/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfg.cs index f9dbbb3bb..5c745dda0 100644 --- a/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfg.cs +++ b/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfg.cs @@ -22,9 +22,10 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced public Culture Culture; public Separator Separator; public bool EliminateSpaces; + public bool SaveGoodOnly; + public string Header; public string[] CommonItems; public string[] SelectedItems; - public string Header; public string Footer; [XmlIgnore] @@ -51,13 +52,14 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced FileNameFormat = "{0:yyMMdd-HHmm}.txt"; Separator = Separator.None; EliminateSpaces = false; + SaveGoodOnly = 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}", + return string.Format("{0}, Path={1}, Y={2}, M={3}, D={4}, FNameFmt={5}, Separator={6}, NoSpaces={7}, GoodOnly={8}", Name, DestinationPath, YearFolders, @@ -65,7 +67,8 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced DayFolders, FileNameFormat, Separator, - EliminateSpaces); - } + EliminateSpaces, + SaveGoodOnly); + } } } diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.cs b/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.cs index 2fa9288d4..5c53ecd1b 100644 --- a/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.cs +++ b/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.cs @@ -2,7 +2,6 @@ /// Copyright (c) 2016-2017 Sensus Metering Systems /// using System; -using System.Collections.Generic; using System.Windows.Forms; using log4net; using TBF.BenchControl.Generic; @@ -66,6 +65,7 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced cultureLabel.Text = "Culture"; separatorLabel.Text = "Separator"; eliminateSpacesCheckBox.Text = "No spaces"; + goodOnlyCheckBox.Text = "Good only"; headerButton.Text = Strings.Header; commonItemsButton.Text = "Common items"; testItemsButton.Text = "Test items"; @@ -91,7 +91,8 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced cultureComboBox.Text = config.Culture.ToString(); separatorComboBox.Text = config.Separator.ToString(); eliminateSpacesCheckBox.Checked = config.EliminateSpaces; - } + goodOnlyCheckBox.Checked = config.SaveGoodOnly; + } public void Unlock() { @@ -107,6 +108,7 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced cultureComboBox.Enabled = true; separatorComboBox.Enabled = true; eliminateSpacesCheckBox.Enabled = true; + goodOnlyCheckBox.Enabled = true; headerButton.Enabled = true; commonItemsButton.Enabled = true; testItemsButton.Enabled = true; @@ -237,6 +239,18 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); } + if (config.SaveGoodOnly != goodOnlyCheckBox.Checked) + { + config.SaveGoodOnly = goodOnlyCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Header != header) + { + config.Header = header; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + if (config.CommonItems != commonItems) { config.CommonItems = commonItems; @@ -249,12 +263,6 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); } - if (config.Header != header) - { - config.Header = header; - flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); - } - if (config.Footer != footer) { config.Footer = footer; diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.designer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.designer.cs index d1e388c21..9df65cff3 100644 --- a/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.designer.cs +++ b/TestBenchFramework/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.designer.cs @@ -58,6 +58,7 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced this.upgradeWizardButton = new System.Windows.Forms.Button(); this.cultureComboBox = new System.Windows.Forms.ComboBox(); this.cultureLabel = new System.Windows.Forms.Label(); + this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox(); this.SuspendLayout(); // // nameTextBox @@ -135,10 +136,10 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced // testItemsButton // this.testItemsButton.Enabled = false; - this.testItemsButton.Location = new System.Drawing.Point(108, 297); + this.testItemsButton.Location = new System.Drawing.Point(108, 275); this.testItemsButton.Name = "testItemsButton"; this.testItemsButton.Size = new System.Drawing.Size(146, 23); - this.testItemsButton.TabIndex = 24; + this.testItemsButton.TabIndex = 25; this.testItemsButton.Text = "Test items"; this.testItemsButton.UseVisualStyleBackColor = true; this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); @@ -244,7 +245,7 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced // eliminateSpacesCheckBox // this.eliminateSpacesCheckBox.AutoSize = true; - this.eliminateSpacesCheckBox.Location = new System.Drawing.Point(108, 227); + this.eliminateSpacesCheckBox.Location = new System.Drawing.Point(20, 241); this.eliminateSpacesCheckBox.Name = "eliminateSpacesCheckBox"; this.eliminateSpacesCheckBox.Size = new System.Drawing.Size(77, 17); this.eliminateSpacesCheckBox.TabIndex = 21; @@ -254,10 +255,10 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced // headerButton // this.headerButton.Enabled = false; - this.headerButton.Location = new System.Drawing.Point(108, 247); + this.headerButton.Location = new System.Drawing.Point(108, 225); this.headerButton.Name = "headerButton"; this.headerButton.Size = new System.Drawing.Size(146, 23); - this.headerButton.TabIndex = 22; + this.headerButton.TabIndex = 23; this.headerButton.Text = "Header"; this.headerButton.UseVisualStyleBackColor = true; this.headerButton.Click += new System.EventHandler(this.headerButton_Click); @@ -265,10 +266,10 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced // footerButton // this.footerButton.Enabled = false; - this.footerButton.Location = new System.Drawing.Point(108, 322); + this.footerButton.Location = new System.Drawing.Point(108, 300); this.footerButton.Name = "footerButton"; this.footerButton.Size = new System.Drawing.Size(146, 23); - this.footerButton.TabIndex = 25; + this.footerButton.TabIndex = 26; this.footerButton.Text = "Footer"; this.footerButton.UseVisualStyleBackColor = true; this.footerButton.Click += new System.EventHandler(this.footerButton_Click); @@ -276,20 +277,20 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced // commonItemsButton // this.commonItemsButton.Enabled = false; - this.commonItemsButton.Location = new System.Drawing.Point(108, 272); + this.commonItemsButton.Location = new System.Drawing.Point(108, 250); this.commonItemsButton.Name = "commonItemsButton"; this.commonItemsButton.Size = new System.Drawing.Size(146, 23); - this.commonItemsButton.TabIndex = 23; + this.commonItemsButton.TabIndex = 24; this.commonItemsButton.Text = "Common items"; this.commonItemsButton.UseVisualStyleBackColor = true; this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click); // // upgradeWizardButton // - this.upgradeWizardButton.Location = new System.Drawing.Point(269, 272); + this.upgradeWizardButton.Location = new System.Drawing.Point(269, 250); this.upgradeWizardButton.Name = "upgradeWizardButton"; this.upgradeWizardButton.Size = new System.Drawing.Size(80, 48); - this.upgradeWizardButton.TabIndex = 26; + this.upgradeWizardButton.TabIndex = 27; this.upgradeWizardButton.Text = "Upgrade wizard"; this.upgradeWizardButton.UseVisualStyleBackColor = true; this.upgradeWizardButton.Click += new System.EventHandler(this.upgradeWizardButton_Click); @@ -312,10 +313,21 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced this.cultureLabel.TabIndex = 17; this.cultureLabel.Text = "Cullture"; // + // goodOnlyCheckBox + // + this.goodOnlyCheckBox.AutoSize = true; + this.goodOnlyCheckBox.Location = new System.Drawing.Point(20, 264); + this.goodOnlyCheckBox.Name = "goodOnlyCheckBox"; + this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17); + this.goodOnlyCheckBox.TabIndex = 22; + this.goodOnlyCheckBox.Text = "Good only"; + this.goodOnlyCheckBox.UseVisualStyleBackColor = true; + // // WriterCfgCtrl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.goodOnlyCheckBox); this.Controls.Add(this.cultureComboBox); this.Controls.Add(this.cultureLabel); this.Controls.Add(this.upgradeWizardButton); @@ -380,5 +392,6 @@ namespace TBF.BenchControl.Output.FileWriters.Enhanced private System.Windows.Forms.Button upgradeWizardButton; private System.Windows.Forms.ComboBox cultureComboBox; private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.CheckBox goodOnlyCheckBox; } } diff --git a/TestBenchFramework/Properties/AssemblyInfo.cs b/TestBenchFramework/Properties/AssemblyInfo.cs index 71f87853e..9972b7acd 100644 --- a/TestBenchFramework/Properties/AssemblyInfo.cs +++ b/TestBenchFramework/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.17.706.1")] -[assembly: AssemblyFileVersion("2.17.706.1")] +[assembly: AssemblyVersion("2.17.707.1")] +[assembly: AssemblyFileVersion("2.17.707.1")]