/// /// Copyright (c) 2013-2015 Sensus Metering Systems /// using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using log4net; using Config; using Config.Entities; using TBF.Resources; using TBF.UiBridge; namespace TBF.Screens { public partial class ResultsTabPageCtrl : UserControl { static readonly ILog log = LogManager.GetLogger(typeof(ResultsTabPageCtrl)); public MetersArrangement MetersArrangement; public TestsArrangement TestsArrangement; public int NrMetersInOneGroup; public IList RsltItems_Screen_SingleWM; public IList RsltItems_Screen_CombinedWM; public IList RsltItems_Printer_SingleWM; public IList RsltItems_Printer_CombinedWM; public IList RsltItems_Disk_SingleWM; public IList RsltItems_Disk_CombinedWM; Procedure procedure; IList testResults; bool compound; ListView firstListView; int lvWidth; int lvHeight; /// /// Constructor /// public ResultsTabPageCtrl() { InitializeComponent(); #if !(IPERLST || IPERLST_SPECIAL || MUNICH) previousResultsButton.Visible = false; #endif Bridge.ProcedureSelectedHandler += delegate(object sender, ProcedureSelectedEventArgs args) { if (InvokeRequired) Invoke(new EventHandler(OnProcedureSelected), sender, args); else OnProcedureSelected(sender, args); }; Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args) { if (InvokeRequired) Invoke(new EventHandler(OnTestCompleted), sender, args); else OnTestCompleted(sender, args); }; } void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) { RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); } void OnTestCompleted(object sender, TestCompletedEventArgs args) { RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); } private void ResultsTabPageCtrl_Load(object sender, EventArgs e) { // Localization configureButton.Text = Strings.Configure; columnWidthsButton.Text = Strings.Save_column_widths; previousResultsButton.Text = Strings.Previous_results; MetersArrangement = Program.LocalSettings.ResultsConfigMeters; TestsArrangement = Program.LocalSettings.ResultsConfigTests; NrMetersInOneGroup = Math.Max(1, Program.LocalSettings.ResultsConfigMetersInOneGroup); RsltItems_Screen_SingleWM = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_SingleWM); RsltItems_Screen_CombinedWM = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_CombinedWM); RsltItems_Printer_SingleWM = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_SingleWM); RsltItems_Printer_CombinedWM = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_CombinedWM); RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); } /// /// Invoke a configuration dialog /// private void configureButton_Click(object sender, EventArgs e) { TBF.Forms.ResultsConfig dlg = new TBF.Forms.ResultsConfig(compound); dlg.TestsArrangement = TestsArrangement; dlg.MetersArrangement = MetersArrangement; dlg.NrMetersInOneGroup = NrMetersInOneGroup; dlg.RsltItems_Screen_SingleWM = RsltItems_Screen_SingleWM; dlg.RsltItems_Screen_CombinedWM = RsltItems_Screen_CombinedWM; dlg.RsltItems_Printer_SingleWM = RsltItems_Printer_SingleWM; dlg.RsltItems_Printer_CombinedWM = RsltItems_Printer_CombinedWM; if (DialogResult.OK == dlg.ShowDialog()) { MetersArrangement = dlg.MetersArrangement; TestsArrangement = dlg.TestsArrangement; NrMetersInOneGroup = dlg.NrMetersInOneGroup; RsltItems_Screen_SingleWM = dlg.RsltItems_Screen_SingleWM; RsltItems_Screen_CombinedWM = dlg.RsltItems_Screen_CombinedWM; RsltItems_Printer_SingleWM = dlg.RsltItems_Printer_SingleWM; RsltItems_Printer_CombinedWM = dlg.RsltItems_Printer_CombinedWM; Program.LocalSettings.ResultsConfigMeters = MetersArrangement; Program.LocalSettings.ResultsConfigTests = TestsArrangement; Program.LocalSettings.ResultsConfigMetersInOneGroup = NrMetersInOneGroup; Program.LocalSettings.RsltItems_Screen_SingleWM = Results.ItemSpec.ToStrArray(RsltItems_Screen_SingleWM); Program.LocalSettings.RsltItems_Screen_CombinedWM = Results.ItemSpec.ToStrArray(RsltItems_Screen_CombinedWM); Program.LocalSettings.RsltItems_Printer_SingleWM = Results.ItemSpec.ToStrArray(RsltItems_Printer_SingleWM); Program.LocalSettings.RsltItems_Printer_CombinedWM = Results.ItemSpec.ToStrArray(RsltItems_Printer_CombinedWM); Program.LocalSettings.Save(); } RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); } /// /// Clear the results /// private void previousResultsButton_Click(object sender, EventArgs e) { new TBF.Forms.PreviousResultsDlg().ShowDialog(); } #region Redraw /// /// Re-draw the results. Apply new settings if they changed. /// void RedrawAll(Results.BatchResults results) { this.SuspendLayout(); try { /// Determine how many water meters were enabled for result evaluation and printing int enabledWMsCount = 0; for (int i = 0; i < results.WMPositionsCount; i++) { if (results.WaterMeters[i] != null && !results.WaterMeters[i].Disabled) { enabledWMsCount++; } } int metersInOneGroup = Math.Max(1, Math.Min(enabledWMsCount, NrMetersInOneGroup)); int nrGroups = Math.Max(1, (enabledWMsCount + NrMetersInOneGroup - 1) / metersInOneGroup); if (MetersArrangement == MetersArrangement.Horizontally) { flowLayoutPanel.FlowDirection = FlowDirection.LeftToRight; lvWidth = flowLayoutPanel.Width / metersInOneGroup - 6; lvHeight = flowLayoutPanel.Height / nrGroups - 6; } else { flowLayoutPanel.FlowDirection = FlowDirection.TopDown; lvWidth = flowLayoutPanel.Width / nrGroups - 6; lvHeight = flowLayoutPanel.Height / metersInOneGroup - 6; } flowLayoutPanel.Controls.Clear(); flowLayoutPanel.WrapContents = true; flowLayoutPanel.AutoScroll = true; bool first = true; for (int i = 0; i < results.WMPositionsCount; i++) { if (results.WaterMeters[i] != null && !results.WaterMeters[i].Disabled) { if (TestsArrangement == TestsArrangement.Rows) { ListView lview = GetResultsTestsAreRows(results.WaterMeters[i], i + 1); if (first) { firstListView = lview; first = false; } if (lview != null) flowLayoutPanel.Controls.Add(lview); } else { ListView lview = GetResultsTestsAreColumns(results.WaterMeters[i], i + 1); if (first) { firstListView = lview; first = false; } if (lview != null) flowLayoutPanel.Controls.Add(lview); } } } } catch (Exception e) { log.FatalFormat("Redrawing results failed : {0}", e.Message); if (e.InnerException != null) { log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); } log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); } this.ResumeLayout(false); } /// /// Get an empty ListView control with appropriate parameters. /// /// ListView control ListView GetListView() { ListView lview = new ListView(); lview.AllowColumnReorder = false; lview.Dock = System.Windows.Forms.DockStyle.None; lview.FullRowSelect = true; lview.GridLines = true; lview.Location = new System.Drawing.Point(0, 0); lview.Size = new System.Drawing.Size(lvWidth, lvHeight); lview.TabIndex = 0; lview.UseCompatibleStateImageBehavior = false; lview.View = System.Windows.Forms.View.Details; return lview; } /// /// Get decorated test names for a specified watermeter /// /// Watermeter results entity /// A list of strings IList GetAllDecoratedTestNames(Results.Entities.WaterMeter wMtr) { IList testNames = new List(); foreach (var mtr in wMtr.MeterTestRslts) { if ( (mtr.CompoundMeterId == (byte)CompoundMeterId.Single || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) && mtr.TestDone && (mtr.Publish() != Config.Entities.Publish.Never) && (mtr.Publish() != Config.Entities.Publish.Internal)) { testNames.Add(mtr.Name()); } } return testNames; } /// /// Get a ListView control filled with results of the meter 'mtr' /// /// Water meter number (1-based): 1 .. Config.Data.WMsCount /// ListView object ListView GetResultsTestsAreRows(Results.Entities.WaterMeter wMtr, int printedWMNr) { compound = wMtr.Compound(); ListView lview = GetListView(); IList items = (compound ? RsltItems_Screen_CombinedWM : RsltItems_Screen_SingleWM); if (items == null || items.Count == 0) return lview; // Header TBF.LocalSettings ls = Program.LocalSettings; lview.Columns.Add(printedWMNr.ToString(), (ls.RsltsClmnCount > 0) ? ls.RsltsClmnWidths[0] : 40); int i = 1; foreach (var item in items) { lview.Columns.Add(item.ClmnHeaderText, (ls.RsltsClmnCount > i) ? ls.RsltsClmnWidths[i] : 70); i++; } IList testNames = GetAllDecoratedTestNames(wMtr); int ix = 0; foreach (var mtr in wMtr.MeterTestRslts) { if ((mtr.CompoundMeterId == (byte)CompoundMeterId.Single || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) && mtr.TestDone && (mtr.Publish() != Config.Entities.Publish.Never) && (mtr.Publish() != Config.Entities.Publish.Internal)) { ListViewItem lvi = new ListViewItem(testNames[ix++]); foreach (var item in items) { string str; if (compound) { var main = wMtr.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); var aux = wMtr.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundAux); str = (item.CanPrintCombined && main != null && aux != null) ? item.PrintCombined(main, aux, mtr) : string.Empty; } else { str = item.CanPrintSingle ? item.Print(mtr) : string.Empty; } string[] texts = str.Split(new char[] { '|' }); if (texts.Length == 1) { lvi.SubItems.Add(str); } else if (texts.Length == 2) { Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); lvi.UseItemStyleForSubItems = false; lvi.SubItems.Add(texts[0]); lvi.SubItems[lvi.SubItems.Count - 1].BackColor = color; } else { lvi.SubItems.Add(string.Empty); } } lview.Items.Add(lvi); } } return lview; } /// /// Get a ListView control filled with results of the meter 'mtr' /// /// Water meter number (1-based): 1 .. Config.Data.WMsCount /// ListView object ListView GetResultsTestsAreColumns(Results.Entities.WaterMeter wMtr, int printedWMNr) { compound = wMtr.Compound(); ListView lview = GetListView(); IList items = (compound ? RsltItems_Screen_CombinedWM : RsltItems_Screen_SingleWM); if (items == null || items.Count == 0) return lview; // Header TBF.LocalSettings ls = Program.LocalSettings; lview.Columns.Add(printedWMNr.ToString(), (ls.RsltsClmnCount > 0) ? ls.RsltsClmnWidths[0] : 40); int i = 1; foreach (var str in GetAllDecoratedTestNames(wMtr)) { lview.Columns.Add(str, (ls.RsltsClmnCount > i) ? ls.RsltsClmnWidths[i] : 70); i++; } foreach (var item in items) { ListViewItem lvi = new ListViewItem(item.ClmnHeaderText); if (compound) { foreach (var mtr in wMtr.MeterTestRslts) { if (mtr.CompoundMeterId == (byte)CompoundMeterId.Compound && mtr.TestDone && (mtr.Publish() != Config.Entities.Publish.Never) && (mtr.Publish() != Config.Entities.Publish.Internal)) { var main = wMtr.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); var aux = wMtr.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundAux); string str = (item.CanPrintCombined && main != null && aux != null) ? item.PrintCombined(main, aux, mtr) : string.Empty; string[] texts = str.Split(new char[] { '|' }); if (texts.Length == 1) { lvi.SubItems.Add(str); } else if (texts.Length == 2) { Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); lvi.UseItemStyleForSubItems = false; lvi.SubItems.Add(texts[0]); lvi.SubItems[lvi.SubItems.Count - 1].BackColor = color; } else { lvi.SubItems.Add(string.Empty); } } } } else { foreach (var mtr in wMtr.MeterTestRslts) { if (mtr.TestDone && (mtr.Publish() != Config.Entities.Publish.Never) && (mtr.Publish() != Config.Entities.Publish.Internal)) { string str = !item.CanPrintSingle ? string.Empty : item.Print(mtr); string[] texts = str.Split(new char[] { '|' }); if (texts.Length == 1) { lvi.SubItems.Add(str); } else if (texts.Length == 2) { Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); lvi.UseItemStyleForSubItems = false; lvi.SubItems.Add(texts[0]); lvi.SubItems[lvi.SubItems.Count - 1].BackColor = color; } else { lvi.SubItems.Add(string.Empty); } } } } lview.Items.Add(lvi); } return lview; } #endregion private void columnWidthsButton_Click(object sender, EventArgs e) { if (firstListView == null) return; /// Update the column widths Program.LocalSettings.RsltsClmnWidths = new int[firstListView.Columns.Count]; for (int i = 0; i < firstListView.Columns.Count; i++) { Program.LocalSettings.RsltsClmnWidths[i] = firstListView.Columns[i].Width; } Program.LocalSettings.Save(); RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); } } }