tbf/TBF/UI/Procedures/TestParamsCtrl.cs

262 lines
8.5 KiB
C#

///
/// Copyright (c) 2013-2015 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Common;
using Config.Entities;
using Common.Forms;
using TBF.Rig.Generic;
using TBF.Resources;
namespace TBF.UI.Procedures
{
// -----------
// / Component \
// |------------------------------
// | param1 param2 param3 ...
// Test1 |
// Test2 |
// ... |
//
public partial class TestParamsCtrl : UserControl
{
ProcedureDlg parent;
bool showTestsColumn;
Rig.Generic.IComponent cmpnt;
IList<IParamsProvider> testParamsProviders;
int paramsCount;
Control[] editors;
bool unlocked;
public void Unlock() { unlocked = true; }
public ListViewEx LVEx { get { return listViewEx; } }
public TestParamsCtrl()
{
InitializeComponent();
testParamsProviders = new List<IParamsProvider>();
}
public TestParamsCtrl(ProcedureDlg parent, Rig.Generic.IComponent cmpnt, bool showTestsColumn)
: this()
{
this.parent = parent;
this.showTestsColumn = showTestsColumn;
this.cmpnt = cmpnt;
unlocked = false;
this.SuspendLayout();
Dock = System.Windows.Forms.DockStyle.Fill;
listViewEx.Dock = System.Windows.Forms.DockStyle.Fill;
listViewEx.AllowColumnReorder = false;
listViewEx.DoubleClickActivation = false;
listViewEx.FullRowSelect = true;
listViewEx.GridLines = true;
listViewEx.Location = new System.Drawing.Point(0, 0);
listViewEx.TabIndex = 0;
listViewEx.UseCompatibleStateImageBehavior = false;
listViewEx.View = System.Windows.Forms.View.Details;
ResumeLayout(false);
}
public void Initialize()
{
IParamsProvider sampleToCreateHeader;
testParamsProviders = GetTestParamsProviders(parent.LoadedProcedure.Tests, out sampleToCreateHeader);
/// Create the header
if (sampleToCreateHeader != null)
{
if (showTestsColumn) listViewEx.Columns.Add(Strings.Test, 70);
paramsCount = sampleToCreateHeader.ParamsCount();
editors = new Control[paramsCount];
for (int i = 0; i < paramsCount; i++)
{
listViewEx.Columns.Add(sampleToCreateHeader.ParamName(i), 90);
ICollection<string> values = sampleToCreateHeader.ParamValues(i);
if (values == null)
{
editors[i] = new TextBox();
}
else
{
ComboBox cb = new ComboBox();
foreach (var v in values) cb.Items.Add(v);
editors[i] = cb;
}
editors[i].Visible = false;
this.Controls.Add(editors[i]);
}
}
listViewEx.SubItemClicked += new SubItemEventHandler(listViewEx_SubItemClicked);
listViewEx.SubItemRightClicked += new SubItemEventHandler(listViewEx_SubItemRightClicked);
listViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing);
RedrawAll();
}
IList<IParamsProvider> GetTestParamsProviders(IList<Test> tests, out IParamsProvider sampleToCreateHeader)
{
IList<IParamsProvider> providers = new List<IParamsProvider>();
sampleToCreateHeader = null;
/// For each test (with an appropriate method in case of ITestMethod-s)
foreach (var test in tests)
{
IParamsProvider testParams = cmpnt.Cfg.GetUITestParamsProvider(test);
if (testParams != null && (sampleToCreateHeader == null || testParams.ParamsCount() > sampleToCreateHeader.ParamsCount()))
{
sampleToCreateHeader = testParams;
}
providers.Add(testParams);
}
return providers;
}
private void listViewEx_SubItemClicked(object sender, SubItemEventArgs e)
{
int itemNr = showTestsColumn ? (e.SubItem - 1) : e.SubItem;
if (!unlocked || e.Item.Tag == null || itemNr >= editors.Length || itemNr < 0) return;
listViewEx.StartEditing(editors[itemNr], e.Item, e.SubItem);
}
void listViewEx_SubItemRightClicked(object sender, SubItemEventArgs e)
{
int itemNr = showTestsColumn ? (e.SubItem - 1) : e.SubItem;
if (!unlocked || e.Item.Tag == null || itemNr >= editors.Length || itemNr < 0) return;
if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell,
Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question))
{
int columnNr = e.SubItem;
string value = null;
System.Drawing.Color backColor = System.Drawing.Color.White;
foreach (ListViewItem item in listViewEx.Items)
{
if (value != null && item.SubItems.Count > columnNr)
{
item.SubItems[columnNr].Text = value;
item.SubItems[columnNr].BackColor = backColor;
string message;
if ((item.Tag as IParamsProvider).ValidateParam(itemNr, value, out message))
{
(item.Tag as IParamsProvider).UpdateParam(itemNr, value);
}
}
else if (item == e.Item)
{
value = item.SubItems[columnNr].Text;
backColor = item.SubItems[columnNr].BackColor;
}
}
}
}
private void listViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e)
{
string message;
int itemNr = showTestsColumn ? (e.SubItem - 1) : e.SubItem;
if ((e.Item.Tag as IParamsProvider).ValidateParam(itemNr, e.DisplayText, out message))
{
(e.Item.Tag as IParamsProvider).UpdateParam(itemNr, e.DisplayText);
}
else
{
MessageBox.Show(message);
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return; /// NOK
}
}
public void RedrawAll()
{
IParamsProvider dummy;
testParamsProviders = GetTestParamsProviders(parent.LoadedProcedure.Tests, out dummy);
listViewEx.Items.Clear();
for (int i = 0; i < testParamsProviders.Count && i < parent.LoadedProcedure.Tests.Count; i++)
{
DrawOne(testParamsProviders[i], parent.LoadedProcedure.Tests[i]);
}
}
void DrawOne(IParamsProvider item, Test test)
{
if (item == null)
{
listViewEx.Items.Add(new ListViewItem());
return;
}
ListViewItem lvi;
if (showTestsColumn)
{
lvi = new ListViewItem(test.Name);
lvi.SubItems.Add(item.ToString(0));
}
else
{
lvi = new ListViewItem(item.ToString(0));
}
for (int i = 1; i < paramsCount; i++) lvi.SubItems.Add(item.ToString(i));
/// Setting Tag to 'null' in case of ErrorFlags.TestParams and protected tests prevents editing ListViewEx items
lvi.Tag = (item is TBF.Rig.Various.ErrorFlags.TestParams && (test.Profile >= TestProfile.Protected)) ? null : item;
listViewEx.Items.Add(lvi);
}
public void AddOne(Test test)
{
if (test.Method == cmpnt.Cfg.Name)
{
IParamsProvider testParams = cmpnt.Cfg.CreateTestParamsProvider(); /// Load or create ComponentTest entity
if (testParams != null)
{
var writer = new System.IO.StringWriter();
testParams.GetSerializer().Serialize(writer, testParams); /// Serialize this class with parameters
ComponentTest entity = new ComponentTest(test.Method, writer.ToString(), test);
entity.SetParamsProvider(testParams);
testParamsProviders.Add(testParams);
}
DrawOne(testParams, test);
}
else
{
testParamsProviders.Add(null);
DrawOne(null, null);
}
}
public bool UpdateAll()
{
if (!unlocked) return false;
foreach (ListViewItem lvi in listViewEx.Items)
{
if (lvi.Tag is IParamsProvider)
{
if (!(lvi.Tag as IParamsProvider).UpdateEmbeddedDbEntity()) return false;
}
}
return true;
}
}
}