tbf/TestBenchFramework/Screens/ResultsTabPageCtrl.cs
Milan Hanajik b1f7730b96 - FixedStartMassCollection method ready to be tested
- FlyingStart method (without mass collection) flow corrections fixed
- DataEntry/WMStates data entry forms added (used by FixedStartMassCollection method)
- minor changes
2014-09-16 21:05:54 +02:00

423 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
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;
IList<Entities.Test> tests;
IList<Entities.TestResult> testResults;
int lvWidth;
int lvHeight;
/// <summary>
/// Constructor
/// </summary>
public ResultsTabPageCtrl()
{
InitializeComponent();
Bridge.ProcedureSelectedHandler += delegate(object sender, ProcedureSelectedEventArgs args)
{
if (InvokeRequired)
{
Invoke(new EventHandler<ProcedureSelectedEventArgs>(OnProcedureSelected), sender, args);
}
else OnProcedureSelected(sender, args);
};
Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args)
{
if (InvokeRequired)
{
Invoke(new EventHandler<TestCompletedEventArgs>(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;
RedrawAll();
}
/// <summary>
/// Invoke a configuration dialog
/// </summary>
private void configureButton_Click(object sender, EventArgs e)
{
TBF.Forms.ResultsConfig dlg = new TBF.Forms.ResultsConfig();
dlg.TestsArrangement = TestsArrangement;
dlg.MetersArrangement = MetersArrangement;
if (DialogResult.OK == dlg.ShowDialog())
{
MetersArrangement = dlg.MetersArrangement;
TestsArrangement = dlg.TestsArrangement;
Program.LocalSettings.ResultsConfigMeters = MetersArrangement;
Program.LocalSettings.ResultsConfigTests = TestsArrangement;
Program.LocalSettings.Save();
}
RedrawAll();
}
/// <summary>
/// Clear the results
/// </summary>
private void clearResultsButton_Click(object sender, EventArgs e)
{
}
#region Redraw
/// <summary>
/// Re-draw the results. Apply new settings if they changed.
/// </summary>
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);
}
/// <summary>
/// Get an empty ListView control with appropriate parameters.
/// </summary>
/// <returns>ListView control</returns>
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;
}
/// <summary>
/// Pre-fetch the test results corresponding to the columns or rows in the ListView
/// </summary>
/// <returns>Ordered list of test results containing null-s for missing results</returns>
IList<Entities.TestResult> GetCurrentTestResults()
{
IList<Entities.TestResult> rslts = new List<Entities.TestResult>();
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<string> GetAllDecoratedTestNames()
{
IList<string> rslt = new List<string>();
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;
}
IList<string> GetAllResultNames(bool combined)
{
IList<string> rslt = new List<string>();
if (combined)
{
rslt.Add("Q [l/h]");
rslt.Add("Ref.volume [l]");
rslt.Add("WM1 volume [l]");
rslt.Add("WM2 volume [l]");
rslt.Add("WM volume [l]");
rslt.Add("Error [%]");
rslt.Add("Result");
}
else
{
rslt.Add("Q [l/h]");
rslt.Add("Ref.volume [l]");
rslt.Add("WM volume [l]");
rslt.Add("Error [%]");
rslt.Add("Result");
}
return rslt;
}
/// <summary>
/// Get a ListView control filled with results of the meter 'mtr'
/// </summary>
/// <param name="mtr">Water meter number: 0..Program.WMsCount</param>
/// <returns>ListView object</returns>
ListView GetResultsTestsAreRows(int mtr, bool combined)
{
if (tests == null) return null;
ListView lview = GetListView();
// Header
lview.Columns.Add((mtr + 1).ToString());
foreach (var str in GetAllResultNames(combined)) lview.Columns.Add(str);
IList<string> testNames = GetAllDecoratedTestNames();
int ix = 0;
foreach (var testRslt in GetCurrentTestResults())
{
ListViewItem lvi = new ListViewItem(testNames[ix++]);
if (testRslt != null)
{
if (combined)
{
lvi.SubItems.Add(testRslt.FlowMass.ToString("F1"));
lvi.SubItems.Add(testRslt.VolumeCTV.ToString("F2"));
lvi.SubItems.Add(testRslt.Meters[2 * mtr].VolumeMeter.ToString("F2"));
lvi.SubItems.Add(testRslt.Meters[2 * mtr + 1].VolumeMeter.ToString("F2"));
lvi.SubItems.Add(testRslt.CombinedMeters[mtr].VolumeMeter.ToString("F2"));
lvi.SubItems.Add(testRslt.CombinedMeters[mtr].VolumeErrorPct.ToString("F2"));
lvi.SubItems.Add(testRslt.CombinedMeters[mtr].Passed ? Strings.Passed : Strings.Failed);
lvi.UseItemStyleForSubItems = false;
lvi.SubItems[7].BackColor = (testRslt.CombinedMeters[mtr].Passed ? Color.Green : Color.Red);
}
else
{
lvi.SubItems.Add(testRslt.FlowMass.ToString("F1"));
lvi.SubItems.Add(testRslt.VolumeCTV.ToString("F2"));
lvi.SubItems.Add(testRslt.Meters[mtr].VolumeMeter.ToString("F2"));
lvi.SubItems.Add(testRslt.Meters[mtr].VolumeErrorPct.ToString("F2"));
lvi.SubItems.Add(testRslt.Meters[mtr].Passed ? Strings.Passed : Strings.Failed);
lvi.UseItemStyleForSubItems = false;
lvi.SubItems[5].BackColor = (testRslt.Meters[mtr].Passed ? Color.Green : Color.Red);
}
}
lview.Items.Add(lvi);
}
return lview;
}
/// <summary>
/// Get a ListView control filled with results of the meter 'mtr'
/// </summary>
/// <param name="mtr">Water meter number: 0..Program.WMsCount</param>
/// <returns>ListView object</returns>
ListView GetResultsTestsAreColumns(int mtr, bool combined)
{
if (tests == null) return null;
ListView lview = GetListView();
// Header
lview.Columns.Add((mtr + 1).ToString());
foreach (var str in GetAllDecoratedTestNames()) lview.Columns.Add(str);
IList<Entities.TestResult> trs = GetCurrentTestResults();
int rsltId = 0;
foreach (var rsltName in GetAllResultNames(combined))
{
ListViewItem lvi = new ListViewItem(rsltName);
if (combined)
{
switch (rsltId++)
{
case 0:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.FlowMass.ToString("F1") : string.Empty);
break;
case 1:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.VolumeCTV.ToString("F2") : string.Empty);
break;
case 2:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.Meters[2 * mtr].VolumeMeter.ToString("F2") : string.Empty);
break;
case 3:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.Meters[2 * mtr + 1].VolumeMeter.ToString("F2") : string.Empty);
break;
case 4:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.CombinedMeters[mtr].VolumeMeter.ToString("F2") : string.Empty);
break;
case 5:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.CombinedMeters[mtr].VolumeErrorPct.ToString("F2") : string.Empty);
break;
case 6:
int i = 1;
lvi.UseItemStyleForSubItems = false;
foreach (var tr in trs)
{
if (tr == null)
{
lvi.SubItems.Add(string.Empty);
}
else if (tr.CombinedMeters[mtr].Passed)
{
lvi.SubItems.Add(Strings.Passed);
lvi.SubItems[i].BackColor = Color.Green;
}
else
{
lvi.SubItems.Add(Strings.Failed);
lvi.SubItems[i].BackColor = Color.Red;
}
i++;
}
break;
}
}
else
{
switch (rsltId++)
{
case 0:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.FlowMass.ToString("F1") : string.Empty);
break;
case 1:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.VolumeCTV.ToString("F2") : string.Empty);
break;
case 2:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.Meters[mtr].VolumeMeter.ToString("F2") : string.Empty);
break;
case 3:
foreach (var tr in trs) lvi.SubItems.Add((tr != null) ? tr.Meters[mtr].VolumeErrorPct.ToString("F2") : string.Empty);
break;
case 4:
int i = 1;
lvi.UseItemStyleForSubItems = false;
foreach (var tr in trs)
{
if (tr == null)
{
lvi.SubItems.Add(string.Empty);
}
else if (tr.Meters[mtr].Passed)
{
lvi.SubItems.Add(Strings.Passed);
lvi.SubItems[i].BackColor = Color.Green;
}
else
{
lvi.SubItems.Add(Strings.Failed);
lvi.SubItems[i].BackColor = Color.Red;
}
i++;
}
break;
}
}
lview.Items.Add(lvi);
}
return lview;
}
#endregion
void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args)
{
tests = args.Procedure.Tests;
testResults = new List<Entities.TestResult>();
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<Entities.TestResult>(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();
}
}
}
}