tbf/TBF/UI/Bench/TestProfiles/TestProfileDlg.cs

979 lines
35 KiB
C#
Raw Normal View History

2019-10-29 14:59:05 +00:00
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using Results.Forms;
using TBF.BenchControl.Generic;
using TBF.BenchControl.GenericDevices;
using TBF.Resources;
using TBF.UI.Shared;
using TBF.BenchControl.Output;
using TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead;
namespace TBF.UI.Bench.TestProfiles
{
public partial class TestProfileDlg : Form, IParentOfListViewEx
{
static readonly ILog log = LogManager.GetLogger(typeof(TestProfileDlg));
/// Used when re-scaling the dialog: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi
public readonly int Dpi;
readonly bool openUnlocked;
/// <summary>
2019-10-31 13:02:20 +00:00
/// Profile to be updated by this dialog.
2019-10-29 14:59:05 +00:00
/// Set by the constructor or updated by the parent after creation and before loading.
/// </summary>
2019-10-31 13:02:20 +00:00
public Profile LoadedProfile;
2019-10-29 14:59:05 +00:00
public int SelectedTestIx; /// -1 = none, 0 = 1st = top
IList<string> usedNames; /// Already used names
/// Auxiliary public lists used also by user controls in tab pages
public IList<BenchControl.Generic.IComponent> TbfComponents;
bool unlocked;
public TestProfileDlg()
{
/// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi.
Dpi = (int)this.CreateGraphics().DpiX;
openUnlocked = false;
InitializeComponent();
/// SharedDlgButtons configuration
2019-10-31 13:02:20 +00:00
sharedButtons.RequiredGroupMembership = new Users.Grp.GID[] { Users.Grp.GID.WaterMeterAuthority };
2019-10-29 14:59:05 +00:00
sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | SharedButtons.Buttons.Remove |
SharedButtons.Buttons.Up | SharedButtons.Buttons.Down;
sharedButtons.Unlocked += Unlocked;
sharedButtons.OKClicked += okButton_Click;
sharedButtons.CancelClicked += cancelButton_Click;
sharedButtons.AddClicked += addButton_Click;
sharedButtons.RemoveClicked += removeButton_Click;
sharedButtons.UpClicked += upButton_Click;
sharedButtons.DownClicked += downButton_Click;
/// ListViewEx-es configuration
2019-10-31 13:02:20 +00:00
metrologyListViewEx.SubItemClicked += new SubItemEventHandler(metrologyListViewEx_SubItemClicked);
metrologyListViewEx.SubItemRightClicked += new SubItemEventHandler(metrologyListViewEx_SubItemRightClicked);
metrologyListViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(metrologyListViewEx_SubItemEndEditing);
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
errorFlagsListViewEx.SubItemClicked += new SubItemEventHandler(errorFlagsListViewEx_SubItemClicked);
errorFlagsListViewEx.SubItemRightClicked += new SubItemEventHandler(errorFlagsListViewEx_SubItemRightClicked);
errorFlagsListViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(errorFlagsListViewEx_SubItemEndEditing);
2019-10-29 14:59:05 +00:00
SelectedTestIx = -1;
}
2019-10-31 13:02:20 +00:00
public TestProfileDlg(Config.Entities.Profile profile, IList<string> usedNames, bool openUnlocked = false)
2019-10-29 14:59:05 +00:00
: this()
{
2019-10-31 13:02:20 +00:00
if (profile == null) throw new ArgumentNullException("profile");
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
LoadedProfile = profile;
2019-10-29 14:59:05 +00:00
this.usedNames = usedNames;
this.openUnlocked = openUnlocked;
2019-10-31 13:02:20 +00:00
sharedButtons.RequiredGroupMembership = new Users.Grp.GID[] { Users.Grp.GID.WaterMeterAuthority };
2019-10-29 14:59:05 +00:00
}
private void ProcedureDlg_Load(object sender, EventArgs e)
{
Localize();
2019-10-31 13:02:20 +00:00
if (LoadedProfile == null) return; /// return in case the dialog is open in the designer
2019-10-29 14:59:05 +00:00
LoadUISettings();
procNameTextBox.Enabled = false;
descriptionTextBox.Enabled = false;
2019-10-31 13:02:20 +00:00
profileTypeRadioButton1.Enabled = false;
profileTypeRadioButton2.Enabled = false;
profileTypeRadioButton3.Enabled = false;
2019-10-29 14:59:05 +00:00
#if !HEAT_METERS
2019-10-31 13:02:20 +00:00
profileTypeRadioButton3.Visible = false;
2019-10-29 14:59:05 +00:00
#endif
/// Make some controls readonly
createdByTextBox.ReadOnly = true;
createdOnTextBox.ReadOnly = true;
lastChangedByTextBox.ReadOnly = true;
lastChangedOnTextBox.ReadOnly = true;
/// LisViewEx columns and edit controls for 'Metrology1', 'Metrology2', 'Process' and 'Parameters' tabs
2019-10-31 13:02:20 +00:00
PrepareMetrologyTab();
PrepareErrorFlags();
2019-10-29 14:59:05 +00:00
/// Now refresh the content of the dialog
RefreshGeneralTab();
2019-10-31 13:02:20 +00:00
RefreshMetrologyTab();
RefreshErrorFlagsTab();
2019-10-29 14:59:05 +00:00
/// Optionally unlock this dialog
if (openUnlocked)
{
sharedButtons.UnlockButtons();
Unlocked(sender, e);
}
}
void Localize()
{
2019-10-31 13:02:20 +00:00
Text = Strings.Test_profiles;
2019-10-29 14:59:05 +00:00
generalTabPage.Text = Strings.General;
2019-10-31 13:02:20 +00:00
metrology1TabPage.Text = Strings.Metrology;
2019-10-29 14:59:05 +00:00
parametersTabPage.Text = Strings.Parameters;
label1.Text = Strings.Procedure_name;
label12.Text = Strings.Short_description;
label13.Text = Strings.Created_by;
label16.Text = Strings.Last_changed_by;
label14.Text = Strings.Date;
label15.Text = Strings.Date;
2019-10-31 13:02:20 +00:00
//profileTypeRadioButton1.Text = Strings.SingleBtnText;
//profileTypeRadioButton2.Text = Strings.Compound;
//profileTypeRadioButton3.Text = Strings.Heat_meter;
2019-10-29 14:59:05 +00:00
}
2019-10-31 13:02:20 +00:00
#region General
void RefreshGeneralTab()
{
procNameTextBox.Text = LoadedProfile.Name;
Text = string.Format("{0} {1} {2}", Strings.Profile, LoadedProfile.ItemNr + 1, LoadedProfile.Name);
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
descriptionTextBox.Text = LoadedProfile.Description;
createdByTextBox.Text = LoadedProfile.CreationUser;
createdOnTextBox.Text = LoadedProfile.CreationTime.ToString();
lastChangedByTextBox.Text = LoadedProfile.LastChgUser;
if (LoadedProfile.LastChgTime > LoadedProfile.CreationTime)
{
lastChangedOnTextBox.Text = LoadedProfile.LastChgTime.ToString();
}
}
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
void UpdateFromGeneralTab()
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
LoadedProfile.Name = procNameTextBox.Text;
Text = string.Format("{0} {1} {2}", Strings.Profile, LoadedProfile.ItemNr + 1, LoadedProfile.Name);
LoadedProfile.Description = descriptionTextBox.Text;
2019-10-29 14:59:05 +00:00
}
2019-10-31 13:02:20 +00:00
#endregion
#region Metrology
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
Control[] metrologyEditors;
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
public enum MtrlgyClmn
{
Name,
CoefQfrom,
CoefQto,
ErrLimLo,
ErrLimHi,
TempLimLo,
TempLimHi,
PressLimLo,
PressLimHi,
ColumnsCount
}
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
void PrepareMetrologyTab()
{
ListViewEx lv = metrologyListViewEx;
lv.Columns.Add(new ColumnHeader { Text = Strings.Test_chdr, Width = 70 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Q_from_m3h, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Q_to_m3h, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Err_limit_neg_pct_chdr, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Err_limit_pos_pct_chdr, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = string.Format("{0} [°C]", Strings.Temp_lim_lo_chdr), Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = string.Format("{0} [°C]", Strings.Temp_lim_hi_chdr), Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Press_lim_lo_chdr, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Press_lim_hi_chdr, Width = 80 });
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
metrologyEditors = new Control[]
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
new TextBox(), /// Name
new TextBox(), /// CoefQfrom
new TextBox(), /// CoefQto
new TextBox(), /// Err.Lim. -
new TextBox(), /// Err.Lim. +
new TextBox(), /// Temp.Lim. -
new TextBox(), /// Temp.Lim. +
new TextBox(), /// Press.Lim. -
new TextBox(), /// Press.Lim. +
2019-10-29 14:59:05 +00:00
};
2019-10-31 13:02:20 +00:00
foreach (var ctrl in metrologyEditors)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
metrology1TabPage.Controls.Add(ctrl);
2019-10-29 14:59:05 +00:00
}
}
2019-10-31 13:02:20 +00:00
void RefreshMetrologyTab()
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
metrologyListViewEx.Items.Clear();
foreach (var test in LoadedProfile.Tests) AddToMetrologyTab(test);
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
if (0 <= SelectedTestIx && SelectedTestIx < metrologyListViewEx.Items.Count)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
metrologyListViewEx.Items[SelectedTestIx].Selected = true;
2019-10-29 14:59:05 +00:00
}
}
2019-10-31 13:02:20 +00:00
void AddToMetrologyTab(PTest pTest)
2019-10-29 14:59:05 +00:00
{
///
2019-10-31 13:02:20 +00:00
/// Metrology 1 item with subitems
2019-10-29 14:59:05 +00:00
///
2019-10-31 13:02:20 +00:00
ListViewItem lvi = new ListViewItem(pTest.Name);
lvi.Tag = pTest;
lvi.SubItems.Add(pTest.CoefQfrom.ToString());
lvi.SubItems.Add(pTest.CoefQto.ToString());
lvi.SubItems.Add(pTest.ErrLimLo.ToString());
lvi.SubItems.Add(pTest.ErrLimHi.ToString());
lvi.SubItems.Add(pTest.TempLimLo.ToString());
lvi.SubItems.Add(pTest.TempLimHi.ToString());
lvi.SubItems.Add(pTest.PressLimLo.ToString());
lvi.SubItems.Add(pTest.PressLimHi.ToString());
metrologyListViewEx.Items.Add(lvi);
2019-10-29 14:59:05 +00:00
}
2019-10-31 13:02:20 +00:00
void UpdateFromMetrologyTab()
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
for (int i = 0; i < metrologyListViewEx.Items.Count; i++)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
ListViewItem lvi = metrologyListViewEx.Items[i];
PTest entity = (PTest)lvi.Tag;
2019-10-29 14:59:05 +00:00
entity.Name = lvi.Text;
entity.ItemNr = i;
2019-10-31 13:02:20 +00:00
float tmp;
if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.CoefQfrom].Text, out tmp)) entity.CoefQfrom = tmp;
if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.CoefQto].Text, out tmp)) entity.CoefQto = tmp;
if (Utils.TryParseSFloat(lvi.SubItems[(int)MtrlgyClmn.ErrLimLo].Text, out tmp)) entity.ErrLimLo = tmp;
if (Utils.TryParseSFloat(lvi.SubItems[(int)MtrlgyClmn.ErrLimHi].Text, out tmp)) entity.ErrLimHi = tmp;
if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.TempLimLo].Text, out tmp)) entity.TempLimLo = tmp;
if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.TempLimHi].Text, out tmp)) entity.TempLimHi = tmp;
if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.PressLimLo].Text, out tmp)) entity.PressLimLo = tmp;
if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.PressLimHi].Text, out tmp)) entity.PressLimHi = tmp;
2019-10-29 14:59:05 +00:00
}
}
2019-10-31 13:02:20 +00:00
private void metrologyListViewEx_SubItemClicked(object sender, SubItemEventArgs e)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
if (e.SubItem == (int)MtrlgyClmn.Name) return;
if (unlocked && (e.SubItem < (int)MtrlgyClmn.ColumnsCount))
{
metrologyListViewEx.StartEditing(metrologyEditors[e.SubItem], e.Item, e.SubItem);
}
2019-10-29 14:59:05 +00:00
}
2019-10-31 13:02:20 +00:00
void metrologyListViewEx_SubItemRightClicked(object sender, SubItemEventArgs e)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
if (!unlocked || e.SubItem >= (int)MtrlgyClmn.ColumnsCount) return;
2019-10-29 14:59:05 +00:00
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;
2019-10-31 13:02:20 +00:00
foreach (ListViewItem item in metrologyListViewEx.Items)
2019-10-29 14:59:05 +00:00
{
if (value != null && item.SubItems.Count > columnNr)
{
item.SubItems[columnNr].Text = value;
item.SubItems[columnNr].BackColor = backColor;
}
else if (item == e.Item)
{
value = item.SubItems[columnNr].Text;
backColor = item.SubItems[columnNr].BackColor;
}
}
}
}
2019-10-31 13:02:20 +00:00
private void metrologyListViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
if (e.SubItem == (int)MtrlgyClmn.Name)
2019-10-29 14:59:05 +00:00
{
if (!Utils.IsGoodFName(e.DisplayText))
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return; /// NOK
}
}
2019-10-31 13:02:20 +00:00
float fdummy;
if ((e.SubItem == (int)MtrlgyClmn.CoefQfrom && !Utils.TryParseUFloat(e.DisplayText, out fdummy)) ||
(e.SubItem == (int)MtrlgyClmn.CoefQto && !Utils.TryParseUFloat(e.DisplayText, out fdummy)) ||
(e.SubItem == (int)MtrlgyClmn.ErrLimLo && !Utils.TryParseUFloat(e.DisplayText, out fdummy)) ||
(e.SubItem == (int)MtrlgyClmn.ErrLimHi && !Utils.TryParseUFloat(e.DisplayText, out fdummy)) ||
(e.SubItem == (int)MtrlgyClmn.TempLimLo && !Utils.TryParseUFloat(e.DisplayText, out fdummy)) ||
(e.SubItem == (int)MtrlgyClmn.TempLimHi && !Utils.TryParseUFloat(e.DisplayText, out fdummy)) ||
(e.SubItem == (int)MtrlgyClmn.PressLimLo && !Utils.TryParseUFloat(e.DisplayText, out fdummy)) ||
(e.SubItem == (int)MtrlgyClmn.PressLimHi && !Utils.TryParseUFloat(e.DisplayText, out fdummy)))
{
/// Cannot parse => revert content of the cell
2019-10-29 14:59:05 +00:00
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
2019-10-31 13:02:20 +00:00
return;
2019-10-29 14:59:05 +00:00
}
}
#endregion
2019-10-31 13:02:20 +00:00
#region Error flags
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
public enum ErrorFlagsClmn
2019-10-29 14:59:05 +00:00
{
Name,
2019-10-31 13:02:20 +00:00
E1,
E2,
E3,
E4,
E5,
E6,
E7,
E8,
E9,
E10,
E11,
E12,
E13,
E14,
E15,
E16,
E21,
2019-10-29 14:59:05 +00:00
ColumnsCount
}
2019-10-31 13:02:20 +00:00
Control[] errorFlagsEditors;
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
void PrepareErrorFlags()
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
ListViewEx lv = errorFlagsListViewEx;
errorFlagsEditors = new Control[(int)ErrorFlagsClmn.ColumnsCount];
int ix = 0;
2019-10-29 14:59:05 +00:00
lv.Columns.Add(new ColumnHeader { Text = Strings.Test_chdr, Width = 70 });
2019-10-31 13:02:20 +00:00
errorFlagsEditors[ix++] = new TextBox(); /// Name
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
string[] ecka = new string[] { "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "E10", "E11", "E12", "E13", "E14", "E15", "E16", "E21" };
for (var e = ErrorFlagsClmn.E1; e <= ErrorFlagsClmn.E21; e++)
{
/// Column header
lv.Columns.Add(new ColumnHeader { Text = e.ToString(), Width = 50 });
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
/// Edit control
ComboBox cb = new ComboBox();
for (ErrorFlagsMode efm = 0; efm < ErrorFlagsMode.Count; efm++) cb.Items.Add(efm.ToDescription());
errorFlagsEditors[ix++] = cb;
}
//lv.Columns.Add(new ColumnHeader { Text = Strings.Mass_repeats, Width = 90 });
//lv.Columns.Add(new ColumnHeader { Text = Strings.Mass_spread_kg, Width = 110 });
//lv.Columns.Add(new ColumnHeader { Text = Strings.Mass_method, Width = 90 });
//lv.Columns.Add(new ColumnHeader { Text = Strings.TimePump2StartV_chdr, Width = 70 });
//lv.Columns.Add(new ColumnHeader { Text = Strings.TimeBeforeSettingFlow, Width = 70 });
//lv.Columns.Add(new ColumnHeader { Text = Strings.TimeFlow2Start_chdr, Width = 70 });
//lv.Columns.Add(new ColumnHeader { Text = Strings.Time2MassMsrmt_chdr, Width = 70 });
foreach (var ctrl in errorFlagsEditors) parametersTabPage.Controls.Add(ctrl);
2019-10-29 14:59:05 +00:00
}
2019-10-31 13:02:20 +00:00
void RefreshErrorFlagsTab()
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
errorFlagsListViewEx.Items.Clear();
foreach (var test in LoadedProfile.Tests) AddToErrorFlagsTab(test);
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
if (0 <= SelectedTestIx && SelectedTestIx < errorFlagsListViewEx.Items.Count)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
errorFlagsListViewEx.Items[SelectedTestIx].Selected = true;
2019-10-29 14:59:05 +00:00
}
}
2019-10-31 13:02:20 +00:00
void AddToErrorFlagsTab(PTest test)
2019-10-29 14:59:05 +00:00
{
///
/// Parameters item with subitems
///
ListViewItem lvi = new ListViewItem(test.Name); /// Name
lvi.Tag = test;
2019-10-31 13:02:20 +00:00
lvi.SubItems.Add(SByte2String(test.E1));
lvi.SubItems.Add(SByte2String(test.E2));
lvi.SubItems.Add(SByte2String(test.E3));
lvi.SubItems.Add(SByte2String(test.E4));
lvi.SubItems.Add(SByte2String(test.E5));
lvi.SubItems.Add(SByte2String(test.E6));
lvi.SubItems.Add(SByte2String(test.E7));
lvi.SubItems.Add(SByte2String(test.E8));
lvi.SubItems.Add(SByte2String(test.E9));
lvi.SubItems.Add(SByte2String(test.E10));
lvi.SubItems.Add(SByte2String(test.E11));
lvi.SubItems.Add(SByte2String(test.E12));
lvi.SubItems.Add(SByte2String(test.E13));
lvi.SubItems.Add(SByte2String(test.E14));
lvi.SubItems.Add(SByte2String(test.E15));
lvi.SubItems.Add(SByte2String(test.E16));
lvi.SubItems.Add(SByte2String(test.E21));
//lvi.SubItems.Add(test.PumpPower.ToString("F1"));
//lvi.SubItems.Add((test.MassRepeats < 4 ? 5 : test.MassRepeats).ToString());
//lvi.SubItems.Add(test.MassSpread.ToString("F4"));
//lvi.SubItems.Add(test.MassMethod.ToDescription());
//lvi.SubItems.Add(test.TimePump2StartV.ToString());
//lvi.SubItems.Add(test.TimeBeforeFlow.ToString());
//lvi.SubItems.Add(test.TimeFlow2Mass.ToString());
//lvi.SubItems.Add(test.TimeStop2Mass.ToString());
errorFlagsListViewEx.Items.Add(lvi);
2019-10-29 14:59:05 +00:00
}
2019-10-31 13:02:20 +00:00
void UpdateFromErrorFlagsTab()
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
for (int i = 0; i < errorFlagsListViewEx.Items.Count; i++)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
ListViewItem lvi = errorFlagsListViewEx.Items[i];
PTest entity = (PTest)lvi.Tag;
2019-10-29 14:59:05 +00:00
entity.Name = lvi.Text;
entity.ItemNr = i;
2019-10-31 13:02:20 +00:00
entity.E1 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E1].Text);
entity.E2 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E2].Text);
entity.E3 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E3].Text);
entity.E4 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E4].Text);
entity.E5 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E5].Text);
entity.E6 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E6].Text);
entity.E7 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E7].Text);
entity.E8 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E8].Text);
entity.E9 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E9].Text);
entity.E10 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E10].Text);
entity.E11 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E11].Text);
entity.E12 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E12].Text);
entity.E13 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E13].Text);
entity.E14 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E14].Text);
entity.E15 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E15].Text);
entity.E16 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E16].Text);
entity.E21 = String2SByte(lvi.SubItems[(int)ErrorFlagsClmn.E21].Text);
2019-10-29 14:59:05 +00:00
}
}
2019-10-31 13:02:20 +00:00
private void errorFlagsListViewEx_SubItemClicked(object sender, SubItemEventArgs e)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
if (!unlocked || e.SubItem >= (int)ErrorFlagsClmn.ColumnsCount)
2019-10-29 14:59:05 +00:00
{
return;
}
2019-10-31 13:02:20 +00:00
errorFlagsListViewEx.StartEditing(errorFlagsEditors[e.SubItem], e.Item, e.SubItem);
2019-10-29 14:59:05 +00:00
}
2019-10-31 13:02:20 +00:00
void errorFlagsListViewEx_SubItemRightClicked(object sender, SubItemEventArgs e)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
if (!unlocked || e.SubItem >= (int)ErrorFlagsClmn.ColumnsCount)
2019-10-29 14:59:05 +00:00
{
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;
2019-10-31 13:02:20 +00:00
foreach (ListViewItem item in errorFlagsListViewEx.Items)
2019-10-29 14:59:05 +00:00
{
if (value != null && item.SubItems.Count > columnNr)
{
item.SubItems[columnNr].Text = value;
item.SubItems[columnNr].BackColor = backColor;
}
else if (item == e.Item)
{
value = item.SubItems[columnNr].Text;
backColor = item.SubItems[columnNr].BackColor;
}
}
}
}
2019-10-31 13:02:20 +00:00
private void errorFlagsListViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e)
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
if (e.SubItem == (int)ErrorFlagsClmn.Name)
2019-10-29 14:59:05 +00:00
{
if (!Utils.IsGoodFName(e.DisplayText))
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return; /// NOK
}
}
2019-10-31 13:02:20 +00:00
sbyte dummy;
if ((e.SubItem >= (int)ErrorFlagsClmn.E1) && (e.SubItem <= (int)ErrorFlagsClmn.E21) && !IsValidEFlagsMode(e.DisplayText, out dummy))
2019-10-29 14:59:05 +00:00
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
2019-10-31 13:02:20 +00:00
return; /// NOK
2019-10-29 14:59:05 +00:00
}
}
#endregion
2019-10-31 13:02:20 +00:00
void RefreshMetrologyAndErrorFlagsTabs()
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
RefreshMetrologyTab();
RefreshErrorFlagsTab();
2019-10-29 14:59:05 +00:00
}
private void Unlocked(object sender, EventArgs e)
{
unlocked = true;
//if (testParamsCtrls != null) foreach (var ctrl in testParamsCtrls) ctrl.Unlock();
//if (procedureParamsCtrls != null) foreach (var ctrl in procedureParamsCtrls) ctrl.Unlock();
procNameTextBox.Enabled = true;
descriptionTextBox.Enabled = true;
2019-10-31 13:02:20 +00:00
profileTypeRadioButton1.Enabled = true;
profileTypeRadioButton2.Enabled = true;
2019-10-29 14:59:05 +00:00
#if HEAT_METERS
metersKindRadioButton3.Enabled = true;
#endif
2019-10-31 13:02:20 +00:00
ListViewEx listViewEx = null;
2019-10-29 14:59:05 +00:00
switch (selectedTab)
{
2019-10-31 13:02:20 +00:00
case TestProfileTabs.Metrology: listViewEx = metrologyListViewEx; break;
case TestProfileTabs.ErrorFlags: listViewEx = errorFlagsListViewEx; break;
2019-10-29 14:59:05 +00:00
}
2019-10-31 13:02:20 +00:00
if ((listViewEx != null) && (listViewEx.SelectedItems.Count == 1))
2019-10-29 14:59:05 +00:00
{
int ix = listViewEx.SelectedIndices[0];
listViewEx.Focus();
listViewEx.Items[ix].Selected = true;
listViewEx.Items[ix].EnsureVisible();
}
}
private void okButton_Click(object sender, EventArgs e)
{
switch (selectedTab)
{
2019-10-31 13:02:20 +00:00
case TestProfileTabs.General: UpdateFromGeneralTab(); break;
case TestProfileTabs.Metrology: UpdateFromMetrologyTab(); break;
case TestProfileTabs.ErrorFlags: UpdateFromErrorFlagsTab(); break;
2019-10-29 14:59:05 +00:00
}
//foreach (var ctrl in testParamsCtrls) if (!ctrl.UpdateAll()) MessageBox.Show(string.Format(Strings.Error_saving_parameters_of_0, ctrl.Name));
//foreach (var ctrl in procedureParamsCtrls) if (!ctrl.UpdateAll()) MessageBox.Show(string.Format(Strings.Error_saving_parameters_of_0, ctrl.Name));
2019-10-31 13:02:20 +00:00
if (usedNames != null && usedNames.Contains(LoadedProfile.Name))
2019-10-29 14:59:05 +00:00
{
2019-10-31 13:02:20 +00:00
MessageBox.Show(string.Format("There is already a procedure named '{0}'.{1}Choose another name please.", LoadedProfile.Name, Environment.NewLine),
2019-10-29 14:59:05 +00:00
Strings.Warning,
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
return;
}
SaveUISettings();
DialogResult = DialogResult.OK;
Close();
return;
}
private void cancelButton_Click(object sender, EventArgs e)
{
SaveUISettings();
DialogResult = DialogResult.Cancel;
Close();
return;
}
private void SaveUISettings()
{
/// Obtain ProcedureDlg dimensions, etc.
bool isMaximized = (WindowState == FormWindowState.Maximized);
int left = (WindowState == FormWindowState.Normal) ? Location.X : RestoreBounds.Left;
int top = (WindowState == FormWindowState.Normal) ? Location.Y : RestoreBounds.Top;
int width = (WindowState == FormWindowState.Normal) ? Size.Width : RestoreBounds.Width;
int height = (WindowState == FormWindowState.Normal) ? Size.Height : RestoreBounds.Height;
LocalSettings ls = Program.LocalSettings;
if (ls != null && (ls.OneProcedureDlgMaximized != isMaximized ||
ls.OneProcedureDlgLeft != left ||
ls.OneProcedureDlgTop != top ||
ls.OneProcedureDlgWidth != width ||
ls.OneProcedureDlgHeight != height))
{
/// At least one ProcedureDlg dimension differs => Update local settings and save them
ls.OneProcedureDlgMaximized = isMaximized;
ls.OneProcedureDlgLeft = left;
ls.OneProcedureDlgTop = top;
ls.OneProcedureDlgWidth = width;
ls.OneProcedureDlgHeight = height;
ls.Save();
}
}
private void LoadUISettings()
{
TBF.LocalSettings ls = Program.LocalSettings;
WindowState = (ls.OneProcedureDlgMaximized ? FormWindowState.Maximized : FormWindowState.Normal);
Width = (ls.OneProcedureDlgWidth > 0) ? ls.OneProcedureDlgWidth : 800;
Height = (ls.OneProcedureDlgHeight > 0) ? ls.OneProcedureDlgHeight : 420;
Left = (ls.OneProcedureDlgLeft != 0) ? ls.OneProcedureDlgLeft : 150;
Top = (ls.OneProcedureDlgTop != 0) ? ls.OneProcedureDlgTop : 150;
}
#region Tab switching
2019-10-31 13:02:20 +00:00
enum TestProfileTabs
2019-10-29 14:59:05 +00:00
{
General,
2019-10-31 13:02:20 +00:00
Metrology,
ErrorFlags,
2019-10-29 14:59:05 +00:00
}
2019-10-31 13:02:20 +00:00
TestProfileTabs selectedTab = TestProfileTabs.General;
2019-10-29 14:59:05 +00:00
private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
switch (selectedTab)
{
2019-10-31 13:02:20 +00:00
case TestProfileTabs.General:
2019-10-29 14:59:05 +00:00
UpdateFromGeneralTab();
break;
2019-10-31 13:02:20 +00:00
case TestProfileTabs.Metrology:
UpdateFromMetrologyTab();
2019-10-29 14:59:05 +00:00
break;
2019-10-31 13:02:20 +00:00
case TestProfileTabs.ErrorFlags:
UpdateFromErrorFlagsTab();
2019-10-29 14:59:05 +00:00
break;
}
2019-10-31 13:02:20 +00:00
selectedTab = (TestProfileTabs)tabControl.SelectedIndex;
bool isMetrologyOrErrorFlags = selectedTab == TestProfileTabs.Metrology ||
selectedTab == TestProfileTabs.ErrorFlags;
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
if (isMetrologyOrErrorFlags)
2019-10-29 14:59:05 +00:00
{
sharedButtons.EnableButtons(SharedButtons.Buttons.Add);
}
else
{
sharedButtons.DisableButtons(SharedButtons.Buttons.Add);
}
2019-10-31 13:02:20 +00:00
//bool removeBtnEnabled = (selectedTab != TestProfileTabs.General);
2019-10-29 14:59:05 +00:00
sharedButtons.DisableButtons(SharedButtons.Buttons.Remove);
ListViewEx lv = null;
///
switch (selectedTab)
{
2019-10-31 13:02:20 +00:00
case TestProfileTabs.General:
2019-10-29 14:59:05 +00:00
RefreshGeneralTab();
break;
2019-10-31 13:02:20 +00:00
case TestProfileTabs.Metrology:
RefreshMetrologyTab();
lv = metrologyListViewEx; /// ListVIewEx for test selection
2019-10-29 14:59:05 +00:00
break;
2019-10-31 13:02:20 +00:00
case TestProfileTabs.ErrorFlags:
RefreshErrorFlagsTab();
lv = errorFlagsListViewEx; /// ListVIewEx for test selection
2019-10-29 14:59:05 +00:00
break;
default:
UpdateButtonStates(SharedButtons.SelectedItemPos.None);
break;
}
///
/// Highlight the selected test
///
2019-10-31 13:02:20 +00:00
if ((lv != null) && (0 <= SelectedTestIx) && (SelectedTestIx < lv.Items.Count))
2019-10-29 14:59:05 +00:00
{
lv.Focus();
lv.Items[SelectedTestIx].Selected = true;
lv.Items[SelectedTestIx].EnsureVisible();
}
}
#endregion
#region 'Add', 'Remove', 'Up' and 'Down'
private void addButton_Click(object sender, EventArgs e)
{
}
private void removeButton_Click(object sender, EventArgs e)
{
ListViewEx listViewEx;
switch (selectedTab)
{
2019-10-31 13:02:20 +00:00
case TestProfileTabs.Metrology:
UpdateFromMetrologyTab();
listViewEx = metrologyListViewEx;
2019-10-29 14:59:05 +00:00
break;
2019-10-31 13:02:20 +00:00
case TestProfileTabs.ErrorFlags:
UpdateFromErrorFlagsTab();
listViewEx = errorFlagsListViewEx;
2019-10-29 14:59:05 +00:00
break;
default: return;
}
/// Check the selected index validity
2019-10-31 13:02:20 +00:00
if (listViewEx.SelectedItems.Count != 1) return;
2019-10-29 14:59:05 +00:00
int removeItemNr = listViewEx.SelectedIndices[0];
/// Remove the selected test
2019-10-31 13:02:20 +00:00
PTest toBeDeleted = LoadedProfile.Tests[removeItemNr];
LoadedProfile.Tests.Remove(toBeDeleted);
for (int i = removeItemNr; i < LoadedProfile.Tests.Count; i++) LoadedProfile.Tests[i].ItemNr--;
2019-10-29 14:59:05 +00:00
2019-10-31 13:02:20 +00:00
RefreshMetrologyAndErrorFlagsTabs();
2019-10-29 14:59:05 +00:00
if (removeItemNr < listViewEx.Items.Count)
{
listViewEx.Focus();
listViewEx.Items[removeItemNr].Selected = true;
listViewEx.Items[removeItemNr].EnsureVisible();
}
else
{
UpdateButtonStates(SharedButtons.SelectedItemPos.None);
}
}
private void upButton_Click(object sender, EventArgs e)
{
ListViewEx listViewEx;
switch (selectedTab)
{
2019-10-31 13:02:20 +00:00
case TestProfileTabs.Metrology:
UpdateFromMetrologyTab();
listViewEx = metrologyListViewEx;
2019-10-29 14:59:05 +00:00
break;
2019-10-31 13:02:20 +00:00
case TestProfileTabs.ErrorFlags:
UpdateFromErrorFlagsTab();
listViewEx = errorFlagsListViewEx;
2019-10-29 14:59:05 +00:00
break;
default: return;
}
/// Check the selected index validity
if (listViewEx.SelectedItems.Count != 1) return;
2019-10-31 13:02:20 +00:00
2019-10-29 14:59:05 +00:00
int ix = listViewEx.SelectedIndices[0];
if (ix <= 0 || ix >= listViewEx.Items.Count) return;
/// Swap two items (move the selected item up)
2019-10-31 13:02:20 +00:00
PTest test1 = LoadedProfile.Tests[ix - 1];
PTest test2 = LoadedProfile.Tests[ix];
2019-10-29 14:59:05 +00:00
test1.ItemNr++;
test2.ItemNr--;
2019-10-31 13:02:20 +00:00
LoadedProfile.Tests.RemoveAt(ix);
LoadedProfile.Tests.Insert(ix - 1, test2);
2019-10-29 14:59:05 +00:00
if (SelectedTestIx >= 1) SelectedTestIx--;
2019-10-31 13:02:20 +00:00
RefreshMetrologyAndErrorFlagsTabs();
2019-10-29 14:59:05 +00:00
listViewEx.Focus();
listViewEx.Items[ix - 1].Selected = true;
listViewEx.Items[ix - 1].EnsureVisible();
}
private void downButton_Click(object sender, EventArgs e)
{
ListViewEx listViewEx;
switch (selectedTab)
{
2019-10-31 13:02:20 +00:00
case TestProfileTabs.Metrology:
UpdateFromMetrologyTab();
listViewEx = metrologyListViewEx;
2019-10-29 14:59:05 +00:00
break;
2019-10-31 13:02:20 +00:00
case TestProfileTabs.ErrorFlags:
UpdateFromErrorFlagsTab();
listViewEx = errorFlagsListViewEx;
2019-10-29 14:59:05 +00:00
break;
default: return;
}
2019-10-31 13:02:20 +00:00
/// Check the selected index validity
if (listViewEx.SelectedItems.Count != 1) return;
2019-10-29 14:59:05 +00:00
int ix = listViewEx.SelectedIndices[0];
if (ix < 0 || ix >= listViewEx.Items.Count - 1) return;
/// Swap two items (move the selected item down)
2019-10-31 13:02:20 +00:00
PTest test1 = LoadedProfile.Tests[ix];
PTest test2 = LoadedProfile.Tests[ix + 1];
2019-10-29 14:59:05 +00:00
test1.ItemNr++;
test2.ItemNr--;
2019-10-31 13:02:20 +00:00
LoadedProfile.Tests.RemoveAt(ix + 1);
LoadedProfile.Tests.Insert(ix, test2);
2019-10-29 14:59:05 +00:00
if ((SelectedTestIx >= 0) && (SelectedTestIx < listViewEx.Items.Count - 1)) SelectedTestIx++;
2019-10-31 13:02:20 +00:00
RefreshMetrologyAndErrorFlagsTabs();
2019-10-29 14:59:05 +00:00
listViewEx.Focus();
listViewEx.Items[ix + 1].Selected = true;
listViewEx.Items[ix + 1].EnsureVisible();
}
#endregion
private void metrology1ListViewEx_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); }
private void parametersListViewEx_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); }
/// <summary>
/// Common part for four xxxListViewEx_SelectedIndexChanged event handlers
/// </summary>
void SelectedIndexChanged(object sender, EventArgs e)
{
ListViewEx listViewEx = sender as ListViewEx;
2019-10-31 13:02:20 +00:00
if ((listViewEx == null) || (listViewEx.SelectedItems.Count != 1))
2019-10-29 14:59:05 +00:00
{
UpdateButtonStates(SharedButtons.SelectedItemPos.None);
SelectedTestIx = -1;
return;
}
SelectedTestIx = listViewEx.SelectedIndices[0];
if (listViewEx.Items.Count == 1)
{
UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast);
}
else if (SelectedTestIx == 0)
{
UpdateButtonStates(SharedButtons.SelectedItemPos.First);
}
else if (SelectedTestIx == (listViewEx.Items.Count - 1))
{
UpdateButtonStates(SharedButtons.SelectedItemPos.Last);
}
else
{
UpdateButtonStates(SharedButtons.SelectedItemPos.Middle);
}
}
public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos)
{
if (selectedItemPos == SharedButtons.SelectedItemPos.None)
{
sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down);
}
else if (selectedItemPos == SharedButtons.SelectedItemPos.First)
{
sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down);
sharedButtons.DisableButtons(SharedButtons.Buttons.Up);
}
else if (selectedItemPos == SharedButtons.SelectedItemPos.Last)
{
sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up);
sharedButtons.DisableButtons(SharedButtons.Buttons.Down);
}
else if (selectedItemPos == SharedButtons.SelectedItemPos.FirstAndLast)
{
sharedButtons.EnableButtons(SharedButtons.Buttons.Remove);
sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down);
}
else
{
sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down);
}
}
2019-10-31 13:02:20 +00:00
///
/// ErrorFlagsMode related conversions
///
string SByte2String(SByte e)
{
return ((ErrorFlagsMode) e).ToDescription();
}
bool IsValidEFlagsMode(string str, out sbyte eflags)
{
for (ErrorFlagsMode e = 0; e < ErrorFlagsMode.Count; e++)
{
if (e.ToDescription() == str)
{
eflags = (sbyte)e;
return true;
}
}
eflags = 0;
return false;
}
bool IsValidEFlagsMode(string str, out ErrorFlagsMode eflags)
{
for (ErrorFlagsMode e = 0; e < ErrorFlagsMode.Count; e++)
{
if (e.ToDescription() == str)
{
eflags = e;
return true;
}
}
eflags = 0;
return false;
}
sbyte String2SByte(string str)
{
for (ErrorFlagsMode e = 0; e < ErrorFlagsMode.Count; e++)
{
if (e.ToDescription() == str) return (sbyte)e;
}
return 0;
}
}
2019-10-29 14:59:05 +00:00
}