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 IList RsltItems_Screen_SingleWM; public IList RsltItems_Screen_CombinedWM; public IList RsltItems_Printer_SingleWM; public IList RsltItems_Printer_CombinedWM; IList tests; IList testResults; 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; 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); 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.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; 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.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.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() { this.SuspendLayout(); lvWidth = flowLayoutPanel.Width - 10; lvHeight = flowLayoutPanel.Height - 10; if (MetersArrangement == Forms.ResultsConfig.Meters.Horizontally) { flowLayoutPanel.FlowDirection = FlowDirection.LeftToRight; lvWidth = (lvWidth + 5) / Program.WMsCount - 5; } else { flowLayoutPanel.FlowDirection = FlowDirection.TopDown; lvHeight = (lvHeight + 5) / Program.WMsCount - 5; } flowLayoutPanel.Controls.Clear(); flowLayoutPanel.WrapContents = false; flowLayoutPanel.AutoScroll = true; /// /// Determine whether combined meter results are displayed /// bool combined = ((testResults != null) && (testResults.Count > 0) && (testResults[0].MetersKind == Entities.MetersKind.Combined)); for (int mtr = 0; mtr < (combined ? Program.WMsCount / 2 : Program.WMsCount); mtr++) { if (TestsArrangement == Forms.ResultsConfig.TestsAre.Rows) { ListView lview = GetResultsTestsAreRows(mtr, combined); if (lview != null) flowLayoutPanel.Controls.Add(lview); } else { ListView lview = GetResultsTestsAreColumns(mtr, combined); 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; } /// /// Pre-fetch the test results corresponding to the columns or rows in the ListView /// /// Ordered list of test results containing null-s for missing results IList GetCurrentTestResults() { IList rslts = new List(); foreach (var test in tests) { for (int rpt = 1; rpt <= test.Repeats; rpt++) { bool added = false; if (testResults != null) { foreach (var testRslt in testResults) { if ((testRslt.TestId == test.Id) && (testRslt.RepetitionNr == rpt) && !testRslt.DoNotPublish) { rslts.Add(testRslt); added = true; break; } } } if (!added) rslts.Add(null); } } return rslts; } IList GetAllDecoratedTestNames() { IList rslt = new List(); foreach (var test in tests) { 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: 0..Program.WMsCount /// ListView object ListView GetResultsTestsAreRows(int mtr, bool combined) { IList items = (combined ? RsltItems_Screen_CombinedWM : RsltItems_Screen_SingleWM); if (tests == null || items == null) return null; ListView lview = GetListView(); // Header lview.Columns.Add((mtr + 1).ToString()); foreach (var item in items) lview.Columns.Add(item.ClmnHeaderText); IList testNames = GetAllDecoratedTestNames(); int ix = 0; foreach (var testRslt in GetCurrentTestResults()) { ListViewItem lvi = new ListViewItem(testNames[ix++]); if (testRslt != null) { foreach (var item in items) { string str; if (combined) { str = (item.PrintCombined == null) ? string.Empty : item.PrintCombined(testRslt.Meters[2 * mtr], testRslt.Meters[2 * mtr + 1], testRslt.CombinedMeters[mtr]); } else { str = (item.Print == null) ? string.Empty : item.Print(testRslt.Meters[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; } /// /// Get a ListView control filled with results of the meter 'mtr' /// /// Water meter number: 0..Program.WMsCount /// ListView object ListView GetResultsTestsAreColumns(int mtr, bool combined) { IList items = (combined ? RsltItems_Screen_CombinedWM : RsltItems_Screen_SingleWM); if (tests == null || items == null) return null; ListView lview = GetListView(); // Header lview.Columns.Add((mtr + 1).ToString()); foreach (var str in GetAllDecoratedTestNames()) lview.Columns.Add(str); IList trs = GetCurrentTestResults(); foreach (var item in items) { ListViewItem lvi = new ListViewItem(item.ClmnHeaderText); if (combined) { foreach (var tr in trs) { string str = (item.PrintCombined == null || tr == null) ? string.Empty : item.PrintCombined(tr.Meters[2 * mtr], tr.Meters[2 * mtr + 1], tr.CombinedMeters[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); } } } else { foreach (var tr in trs) { string str = (item.Print == null || tr == null) ? string.Empty : item.Print(tr.Meters[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 void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) { tests = args.Procedure.Tests; 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(); } } } }