/// /// 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 TBF.Resources; using TBF.UiBridge; namespace TBF.Screens { public partial class ResultsTabPageCtrl : UserControl { static readonly ILog log = LogManager.GetLogger(typeof(ResultsTabPageCtrl)); public TBF.Forms.ResultsConfig.Meters MetersArrangement; public TBF.Forms.ResultsConfig.TestsAre 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; Entities.Procedure procedure; IList testResults; bool combined; ListView firstListView; int lvWidth; int lvHeight; /// /// Constructor /// public ResultsTabPageCtrl() { InitializeComponent(); 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); }; } private void ResultsTabPageCtrl_Load(object sender, EventArgs e) { // Localization configureButton.Text = Strings.Configure; clearResultsButton.Text = Strings.Clear_results; MetersArrangement = Program.LocalSettings.ResultsConfigMeters; TestsArrangement = Program.LocalSettings.ResultsConfigTests; NrMetersInOneGroup = Math.Max(1, Program.LocalSettings.ResultsConfigMetersInOneGroup); RsltItems_Screen_SingleWM = Forms.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_SingleWM); RsltItems_Screen_CombinedWM = Forms.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_CombinedWM); RsltItems_Printer_SingleWM = Forms.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_SingleWM); RsltItems_Printer_CombinedWM = Forms.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_CombinedWM); RsltItems_Disk_SingleWM = Forms.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Disk_SingleWM); RsltItems_Disk_CombinedWM = Forms.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Disk_CombinedWM); RedrawAll(); } /// /// Invoke a configuration dialog /// private void configureButton_Click(object sender, EventArgs e) { TBF.Forms.ResultsConfig dlg = new TBF.Forms.ResultsConfig(); 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; dlg.RsltItems_Disk_SingleWM = RsltItems_Disk_SingleWM; dlg.RsltItems_Disk_CombinedWM = RsltItems_Disk_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; RsltItems_Disk_SingleWM = dlg.RsltItems_Disk_SingleWM; RsltItems_Disk_CombinedWM = dlg.RsltItems_Disk_CombinedWM; Program.LocalSettings.ResultsConfigMeters = MetersArrangement; Program.LocalSettings.ResultsConfigTests = TestsArrangement; Program.LocalSettings.ResultsConfigMetersInOneGroup = NrMetersInOneGroup; Program.LocalSettings.RsltItems_Screen_SingleWM = Forms.ResultItemSpec.ToStrArray(RsltItems_Screen_SingleWM); Program.LocalSettings.RsltItems_Screen_CombinedWM = Forms.ResultItemSpec.ToStrArray(RsltItems_Screen_CombinedWM); Program.LocalSettings.RsltItems_Printer_SingleWM = Forms.ResultItemSpec.ToStrArray(RsltItems_Printer_SingleWM); Program.LocalSettings.RsltItems_Printer_CombinedWM = Forms.ResultItemSpec.ToStrArray(RsltItems_Printer_CombinedWM); Program.LocalSettings.RsltItems_Disk_SingleWM = Forms.ResultItemSpec.ToStrArray(RsltItems_Disk_SingleWM); Program.LocalSettings.RsltItems_Disk_CombinedWM = Forms.ResultItemSpec.ToStrArray(RsltItems_Disk_CombinedWM); Program.LocalSettings.Save(); } RedrawAll(); } /// /// Clear the results /// private void clearResultsButton_Click(object sender, EventArgs e) { } #region Redraw /// /// Re-draw the results. Apply new settings if they changed. /// void RedrawAll() { /// /// Determine whether combined meter results are displayed /// combined = ((testResults != null) && (testResults.Count > 0) && (testResults[0].MetersKind == Entities.MetersKind.Combined)); this.SuspendLayout(); /// Determine how many water meters were enabled for result evaluation and printing int enabledWMsCount = 0; if (combined) { enabledWMsCount = Program.WMsCount / 2; } else { for (int mtr0 = 0; mtr0 < Program.WMsCount; mtr0++) { if ((testResults != null) && (testResults.Count > 0) && !testResults[0].Meters[mtr0].Disabled) enabledWMsCount++; } } int metersInOneGroup = Math.Max(1, Math.Min(enabledWMsCount, NrMetersInOneGroup)); int nrGroups = Math.Max(1, (enabledWMsCount + NrMetersInOneGroup - 1) / metersInOneGroup); if (MetersArrangement == Forms.ResultsConfig.Meters.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 mtr = 1; mtr <= (combined ? Program.WMsCount / 2 : Program.WMsCount); mtr++) { if (combined || (testResults != null && testResults.Count > 0 && !testResults[0].Meters[mtr - 1].Disabled)) { if (TestsArrangement == Forms.ResultsConfig.TestsAre.Rows) { ListView lview = GetResultsTestsAreRows(mtr, mtr); if (first) { firstListView = lview; first = false; } if (lview != null) flowLayoutPanel.Controls.Add(lview); } else { ListView lview = GetResultsTestsAreColumns(mtr, mtr); if (first) { firstListView = lview; first = false; } if (lview != null) flowLayoutPanel.Controls.Add(lview); } } } 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 the specified watermeter /// The parameter meterNr is used in the same way as the parameter meterNr of Utils.GetSortedTestResults /// /// Water meter nr (1-based): 1 .. Program.WMsCount /// A list of strings IList GetAllDecoratedTestNames(int meterNr) { IList rslt = new List(); foreach (var test in procedure.Tests) { BenchControl.GenericDevices.ITestMethod method = BenchControl.TbfComponents.FindComponent(test.Method) as BenchControl.GenericDevices.ITestMethod; if ((method != null) && method.Publish && ((test.Part == 0) || (meterNr == 0) || (test.Part == meterNr))) { if (test.Repeats == 1) { rslt.Add(test.Name); continue; } for (int rpt = 1; rpt <= test.Repeats; rpt++) { rslt.Add(test.Name + string.Format(" ({0}/{1})", rpt, test.Repeats)); } } } return rslt; } /// /// Get a ListView control filled with results of the meter 'mtr' /// /// Water meter number (1-based): 1 .. Program.WMsCount /// ListView object ListView GetResultsTestsAreRows(int mtr, int printedWMNr) { IList items = (combined ? RsltItems_Screen_CombinedWM : RsltItems_Screen_SingleWM); if (procedure == null || procedure.Tests == null || items == null) return null; ListView lview = GetListView(); // Header TBF.LocalSettings ls = Program.LocalSettings; if (combined) { lview.Columns.Add(printedWMNr.ToString(), (ls.RsltsCombinedClmnCount > 0) ? ls.RsltsCombinedClmnWdths[0] : 40); int i = 1; foreach (var item in items) { lview.Columns.Add(item.ClmnHeaderText, (ls.RsltsCombinedClmnCount > i) ? ls.RsltsCombinedClmnWdths[i] : 70); i++; } } else { lview.Columns.Add(printedWMNr.ToString(), (ls.RsltsSingleClmnCount > 0) ? ls.RsltsSingleClmnWdths[0] : 40); int i = 1; foreach (var item in items) { lview.Columns.Add(item.ClmnHeaderText, (ls.RsltsSingleClmnCount > i) ? ls.RsltsSingleClmnWdths[i] : 70); i++; } } int meterPartNr = Utils.PartNr(mtr, combined); IList testNames = GetAllDecoratedTestNames(meterPartNr); IList sortedResults = Utils.GetSortedTestResults(procedure, testResults, meterPartNr); int ix = 0; foreach (var testRslt in sortedResults) { ListViewItem lvi = new ListViewItem(testNames[ix++]); if (testRslt != null) { foreach (var item in items) { string str; if (combined) { str = item.CanPrintCombined ? item.PrintCombined(testRslt.Meters[2 * mtr - 2], testRslt.Meters[2 * mtr - 1], testRslt.CombinedMeters[mtr - 1]) : string.Empty; } else { str = item.CanPrintSingle ? item.Print(testRslt.Meters[mtr - 1]) : 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 .. Program.WMsCount /// ListView object ListView GetResultsTestsAreColumns(int mtr, int printedWMNr) { IList items = (combined ? RsltItems_Screen_CombinedWM : RsltItems_Screen_SingleWM); if (procedure == null || procedure.Tests == null || items == null) return null; ListView lview = GetListView(); // Header TBF.LocalSettings ls = Program.LocalSettings; if (combined) { lview.Columns.Add(printedWMNr.ToString(), (ls.RsltsCombinedClmnCount > 0) ? ls.RsltsCombinedClmnWdths[0] : 40); int i = 1; foreach (var str in GetAllDecoratedTestNames(Utils.PartNr(mtr, combined))) { lview.Columns.Add(str, (ls.RsltsCombinedClmnCount > i) ? ls.RsltsCombinedClmnWdths[i] : 70); i++; } } else { lview.Columns.Add(printedWMNr.ToString(), (ls.RsltsSingleClmnCount > 0) ? ls.RsltsSingleClmnWdths[0] : 40); int i = 1; foreach (var str in GetAllDecoratedTestNames(Utils.PartNr(mtr, combined))) { lview.Columns.Add(str, (ls.RsltsSingleClmnCount > i) ? ls.RsltsSingleClmnWdths[i] : 70); i++; } } IList trs = Utils.GetSortedTestResults(procedure, testResults, Utils.PartNr(mtr, combined)); foreach (var item in items) { ListViewItem lvi = new ListViewItem(item.ClmnHeaderText); if (combined) { foreach (var tr in trs) { string str = (!item.CanPrintCombined || (tr == null) || (2 * mtr > tr.Meters.Count) || (mtr > tr.CombinedMeters.Count)) ? string.Empty : item.PrintCombined(tr.Meters[2 * mtr - 2], tr.Meters[2 * mtr - 1], tr.CombinedMeters[mtr - 1]); 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 tr in trs) { string str = (!item.CanPrintSingle || (tr == null) || (mtr > tr.Meters.Count)) ? string.Empty : item.Print(tr.Meters[mtr - 1]); 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 void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) { procedure = args.Procedure; testResults = new List(); RedrawAll(); } void OnTestCompleted(object sender, TestCompletedEventArgs args) { if (args.TestResult != null) { /// Delete an existing testResults with the same test name and repetition number try { Entities.TestResult tr = testResults .First(x => (x.TestId == args.TestResult.TestId) && (x.RepetitionNr == args.TestResult.RepetitionNr)); testResults.Remove(tr); } catch { }; /// Add the new test results testResults.Add(args.TestResult); RedrawAll(); } } private void columnWidthsButton_Click(object sender, EventArgs e) { if (firstListView == null) return; /// Update the column widths if (combined) { Program.LocalSettings.RsltsCombinedClmnWdths = new int[firstListView.Columns.Count]; for (int i = 0; i < firstListView.Columns.Count; i++) { Program.LocalSettings.RsltsCombinedClmnWdths[i] = firstListView.Columns[i].Width; } Program.LocalSettings.Save(); } else { Program.LocalSettings.RsltsSingleClmnWdths = new int[firstListView.Columns.Count]; for (int i = 0; i < firstListView.Columns.Count; i++) { Program.LocalSettings.RsltsSingleClmnWdths[i] = firstListView.Columns[i].Width; } Program.LocalSettings.Save(); } RedrawAll(); } } }