464 lines
14 KiB
C#
464 lines
14 KiB
C#
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<TBF.Forms.ResultItemSpec> RsltItems_Screen_SingleWM;
|
|
public IList<TBF.Forms.ResultItemSpec> RsltItems_Screen_CombinedWM;
|
|
public IList<TBF.Forms.ResultItemSpec> RsltItems_Printer_SingleWM;
|
|
public IList<TBF.Forms.ResultItemSpec> RsltItems_Printer_CombinedWM;
|
|
|
|
IList<Entities.Test> tests;
|
|
IList<Entities.TestResult> testResults;
|
|
bool combined;
|
|
ListView firstListView;
|
|
|
|
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;
|
|
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();
|
|
}
|
|
|
|
/// <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;
|
|
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();
|
|
}
|
|
|
|
/// <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
|
|
///
|
|
combined = ((testResults != null) &&
|
|
(testResults.Count > 0) &&
|
|
(testResults[0].MetersKind == Entities.MetersKind.Combined));
|
|
|
|
bool first = true;
|
|
for (int mtr = 0; mtr < (combined ? Program.WMsCount / 2 : Program.WMsCount); mtr++)
|
|
{
|
|
if (TestsArrangement == Forms.ResultsConfig.TestsAre.Rows)
|
|
{
|
|
ListView lview = GetResultsTestsAreRows(mtr);
|
|
if (first) { firstListView = lview; first = false; }
|
|
if (lview != null) flowLayoutPanel.Controls.Add(lview);
|
|
}
|
|
else
|
|
{
|
|
ListView lview = GetResultsTestsAreColumns(mtr);
|
|
if (first) { firstListView = lview; first = false; }
|
|
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;
|
|
}
|
|
|
|
/// <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)
|
|
{
|
|
IList<Forms.ResultItemSpec> items = (combined ? RsltItems_Screen_CombinedWM : RsltItems_Screen_SingleWM);
|
|
if (tests == null || items == null) return null;
|
|
|
|
ListView lview = GetListView();
|
|
|
|
// Header
|
|
TBF.LocalSettings ls = Program.LocalSettings;
|
|
if (combined)
|
|
{
|
|
lview.Columns.Add((mtr + 1).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((mtr + 1).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++;
|
|
}
|
|
}
|
|
|
|
IList<string> 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;
|
|
}
|
|
|
|
/// <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)
|
|
{
|
|
IList<Forms.ResultItemSpec> items = (combined ? RsltItems_Screen_CombinedWM : RsltItems_Screen_SingleWM);
|
|
if (tests == null || items == null) return null;
|
|
|
|
ListView lview = GetListView();
|
|
|
|
// Header
|
|
TBF.LocalSettings ls = Program.LocalSettings;
|
|
if (combined)
|
|
{
|
|
lview.Columns.Add((mtr + 1).ToString(), (ls.RsltsCombinedClmnCount > 0) ? ls.RsltsCombinedClmnWdths[0] : 40);
|
|
int i = 1;
|
|
foreach (var str in GetAllDecoratedTestNames())
|
|
{
|
|
lview.Columns.Add(str, (ls.RsltsCombinedClmnCount > i) ? ls.RsltsCombinedClmnWdths[i] : 70);
|
|
i++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lview.Columns.Add((mtr + 1).ToString(), (ls.RsltsSingleClmnCount > 0) ? ls.RsltsSingleClmnWdths[0] : 40);
|
|
int i = 1;
|
|
foreach (var str in GetAllDecoratedTestNames())
|
|
{
|
|
lview.Columns.Add(str, (ls.RsltsSingleClmnCount > i) ? ls.RsltsSingleClmnWdths[i] : 70);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
IList<Entities.TestResult> 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<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();
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|