/// /// Copyright (c) 2013-2018 Sensus Slovensko a.s. /// 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 int MinWidth; public int MinHeight; public IList RsltItems_Screen_SingleWM; public IList RsltItems_Screen_CombinedWM; public IList RsltItems_Screen_HeatM; MetersKind metersKind; ListView firstListView; int lvWidth; int lvHeight; /// /// Constructor /// public ResultsTabPageCtrl() { InitializeComponent(); #if MUNICH reloadPreviousResultsButton.Visible = false; #endif if (Program.LocalSettings != null) { MetersArrangement = Program.LocalSettings.ResultsConfigMeters; TestsArrangement = Program.LocalSettings.ResultsConfigTests; NrMetersInOneGroup = Math.Max(1, Program.LocalSettings.ResultsConfigMetersInOneGroup); MinWidth = Program.LocalSettings.ResultsConfigMinWidth; MinHeight = Program.LocalSettings.ResultsConfigMinHeight; RsltItems_Screen_SingleWM = Results.WMeterRsltItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_SingleWM); RsltItems_Screen_CombinedWM = Results.WMeterRsltItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_CombinedWM); RsltItems_Screen_HeatM = Results.WMeterRsltItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_HeatM); } 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); }; Bridge.ButtonsEtcHandler += delegate(object sndr, ButtonsEtcEventArgs args) { if (InvokeRequired) Invoke(new EventHandler(OnButtonsEtc), sndr, args); else OnButtonsEtc(sndr, 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); } void OnButtonsEtc(object sender, UiBridge.ButtonsEtcEventArgs args) { reloadPreviousResultsButton.Enabled = ((args.Flags & UiBridge.ButtonsEtc.ProcedureCmbBoxEn) != 0); } private void ResultsTabPageCtrl_Load(object sender, EventArgs e) { // Localization configureButton.Text = Strings.Configure; columnWidthsButton.Text = Strings.Save_column_widths; showPreviousResultsButton.Text = Strings.Previous_results; RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); } IList GetRsltItems(MetersKind metersKind) { IList srcItems; switch (metersKind) { default: case MetersKind.Single: srcItems = RsltItems_Screen_SingleWM; break; case MetersKind.Combined: srcItems = RsltItems_Screen_CombinedWM; break; case MetersKind.HeatMeter: srcItems = RsltItems_Screen_HeatM; break; } IList copiedItems = new List(); if (srcItems != null) { foreach (var it in srcItems) copiedItems.Add(it.Clone()); } return copiedItems; } /// /// Invoke a configuration dialog /// private void configureButton_Click(object sender, EventArgs e) { TBF.Forms.ResultsArrangementDlg dlg = new TBF.Forms.ResultsArrangementDlg(); dlg.MetersKind = metersKind; dlg.TestsArrangement = TestsArrangement; dlg.MetersArrangement = MetersArrangement; dlg.NrMetersInOneGroup = NrMetersInOneGroup; dlg.MinWidth = MinWidth; dlg.MinHeight = MinHeight; dlg.SelectedItems = GetRsltItems(metersKind); DialogResult dr = dlg.ShowDialog(); if (dr == DialogResult.OK && dlg.Unlocked) { Program.LocalSettings.ResultsConfigMeters = MetersArrangement = dlg.MetersArrangement;; Program.LocalSettings.ResultsConfigTests = TestsArrangement = dlg.TestsArrangement; Program.LocalSettings.ResultsConfigMetersInOneGroup = NrMetersInOneGroup = dlg.NrMetersInOneGroup; Program.LocalSettings.ResultsConfigMinWidth = MinWidth = dlg.MinWidth; Program.LocalSettings.ResultsConfigMinHeight = MinHeight = dlg.MinHeight; switch (metersKind) { default: case MetersKind.Single: RsltItems_Screen_SingleWM = dlg.SelectedItems; Program.LocalSettings.RsltItems_Screen_SingleWM = Results.WMeterRsltItemSpec.ToStrArray(RsltItems_Screen_SingleWM); break; case MetersKind.Combined: RsltItems_Screen_CombinedWM = dlg.SelectedItems; Program.LocalSettings.RsltItems_Screen_CombinedWM = Results.WMeterRsltItemSpec.ToStrArray(RsltItems_Screen_CombinedWM); break; case MetersKind.HeatMeter: RsltItems_Screen_HeatM = dlg.SelectedItems; Program.LocalSettings.RsltItems_Screen_HeatM = Results.WMeterRsltItemSpec.ToStrArray(RsltItems_Screen_HeatM); break; } Program.LocalSettings.Save(); } RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); } /// /// Clear the results /// private void showPreviousResultsButton_Click(object sender, EventArgs e) { new TBF.Forms.PreviousResultsDlg().ShowDialog(); } private void reloadPreviousResultsButton_Click(object sender, EventArgs e) { new TBF.Forms.PreviousResultsDlg(true).ShowDialog(); } #region Redraw /// /// Re-draw the results. Apply new settings if they changed. /// void RedrawAll(Results.BatchResults results) { this.SuspendLayout(); if (results == null) { flowLayoutPanel.Controls.Clear(); ResumeLayout(false); return; } 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 + metersInOneGroup - 1) / metersInOneGroup); if (MetersArrangement == MetersArrangement.Horizontally) { flowLayoutPanel.FlowDirection = FlowDirection.LeftToRight; lvWidth = Math.Max(MinWidth, flowLayoutPanel.Width / metersInOneGroup - 6); lvHeight = Math.Max(MinHeight, flowLayoutPanel.Height / nrGroups - 6); } else { flowLayoutPanel.FlowDirection = FlowDirection.TopDown; lvWidth = Math.Max(MinWidth, flowLayoutPanel.Width / nrGroups - 6); lvHeight = Math.Max(MinHeight, 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) { ListView lview = (TestsArrangement == TestsArrangement.Rows) ? GetResultsTestsAreRows(results.WaterMeters[i], i + 1) : GetResultsTestsAreColumns(results.WaterMeters[i], i + 1); if (lview != null) { flowLayoutPanel.Controls.Add(lview); if (first) { firstListView = lview; first = false; } } } } } 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(Color backColor) { 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; lview.BackColor = backColor; 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.CompoundMeterId == (byte)CompoundMeterId.HeatMeterEnergy) && 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) { metersKind = wMtr.Compound() ? MetersKind.Combined : (wMtr.HeatMeter() ? MetersKind.HeatMeter : MetersKind.Single); bool wmtrCompleted = wMtr.CompletedFromTests(); bool wmtrPassed = wMtr.PassedFromTests(); Color commonBackColor = wmtrPassed ? Color.LightGreen : (wmtrCompleted ? Color.LightPink : Color.White); #if ORACLE_DB if (TBF.BenchControl.Sequences.ProcessData.BenchInfo is TBF.BenchControl.BenchInfo.iPerl.Component) { int maxTrials = (TBF.BenchControl.Sequences.ProcessData.BenchInfo as TBF.BenchControl.BenchInfo.iPerl.Component).MaxTestIndex; if (wmtrCompleted && !wmtrPassed && ((wMtr.Pruefindex % 100) >= maxTrials)) commonBackColor = Color.DarkOrange; } #endif ListView lview = GetListView(commonBackColor); IList items = GetRsltItems(metersKind); 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 col = 1; foreach (var item in items) { lview.Columns.Add(item.Caption, (ls.RsltsClmnCount > col) ? ls.RsltsClmnWidths[col] : 70); col++; } IList testNames = GetAllDecoratedTestNames(wMtr); int ix = 0; foreach (var mtr in wMtr.MeterTestRslts) { if (mtr != null && (mtr.CompoundMeterId == (byte)CompoundMeterId.Single || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound || mtr.CompoundMeterId == (byte)CompoundMeterId.HeatMeterEnergy) && mtr.TestDone && mtr.Publish() != Config.Entities.Publish.Never && mtr.Publish() != Config.Entities.Publish.Internal) { ListViewItem lvi = new ListViewItem(testNames[ix++]); for (int i = 0; i < items.Count; i++) { string str = items[i].Print(wMtr, mtr.Name()); /// Extract and use color information 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 : commonBackColor); 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) { metersKind = wMtr.Compound() ? MetersKind.Combined : (wMtr.HeatMeter() ? MetersKind.HeatMeter : MetersKind.Single); Color commonBackColor = wMtr.PassedFromTests() ? Color.LightGreen : (wMtr.CompletedFromTests() ? Color.LightPink : Color.White); ListView lview = GetListView(commonBackColor); IList items = GetRsltItems(metersKind); 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.Caption); foreach (var mtr in wMtr.MeterTestRslts) { if (mtr != null && (mtr.CompoundMeterId == (byte)CompoundMeterId.Single || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound || mtr.CompoundMeterId == (byte)CompoundMeterId.HeatMeterEnergy) && mtr.TestDone && mtr.Publish() != Config.Entities.Publish.Never && mtr.Publish() != Config.Entities.Publish.Internal) { string str = item.Print(wMtr, mtr.Name()); 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 : commonBackColor); 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); } } }