Initial commit almost identical to SVN-repo rev.340
This commit is contained in:
@@ -0,0 +1,421 @@
|
||||
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.TestName.Equals(test.Name) && (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.Name.Equals(args.TestResult.Name));
|
||||
testResults.Remove(tr);
|
||||
}
|
||||
catch { };
|
||||
|
||||
/// Add the new test results
|
||||
testResults.Add(args.TestResult);
|
||||
RedrawAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user