tbf/TBF/UI/Bench/TestProfiles/TestProfileDlg.cs
2023-05-22 12:59:36 +02:00

1453 lines
54 KiB
C#

///
/// Copyright (c) 2019-2023 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using log4net;
using Common;
using Config.Entities;
using Common.Forms;
using TBF.Rig.Generic;
using TBF.Rig.GenericDevices;
using TBF.Resources;
using TBF.UI.Shared;
using TBF.Rig.Output;
using TBF.Rig.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 NHibernate.ISession session;
readonly bool openUnlocked;
/// <summary>
/// Profile to be updated by this dialog.
/// Set by the constructor or updated by the parent after creation and before loading.
/// </summary>
public Profile LoadedProfile;
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<Rig.Generic.IComponent> TbfComponents;
public IList<ITestMethod> TestMethods;
bool unlocked;
TestProfileDlg()
{
InitializeComponent();
/// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi.
Dpi = (int)this.CreateGraphics().DpiX;
openUnlocked = false;
}
public TestProfileDlg(NHibernate.ISession session, Profile profile, IList<string> usedNames, bool openUnlocked, Form parentForm)
: this()
{
if (profile == null) throw new ArgumentNullException("profile");
this.session = session;
LoadedProfile = profile;
this.usedNames = usedNames;
this.openUnlocked = openUnlocked;
/// Prepare a list of components and a list of test methods
TbfComponents = Rig.TbfComponents.LoadComponentsFromDB(this.session);
TestMethods = new List<ITestMethod>();
foreach (var c in TbfComponents) if (c is ITestMethod) TestMethods.Add(c as ITestMethod);
/// SharedDlgButtons configuration
sharedButtons.ParentForm = parentForm;
sharedButtons.RequiredGroupMembership = new GID[] { GID.MetrologicalAuthority };
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
metrologyListViewEx.SubItemClicked += new SubItemEventHandler(metrologyListViewEx_SubItemClicked);
metrologyListViewEx.SubItemRightClicked += new SubItemEventHandler(metrologyListViewEx_SubItemRightClicked);
metrologyListViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(metrologyListViewEx_SubItemEndEditing);
errorFlagsListViewEx.SubItemClicked += new SubItemEventHandler(errorFlagsListViewEx_SubItemClicked);
errorFlagsListViewEx.SubItemRightClicked += new SubItemEventHandler(errorFlagsListViewEx_SubItemRightClicked);
errorFlagsListViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(errorFlagsListViewEx_SubItemEndEditing);
errorFlags2ListViewEx.SubItemClicked += new SubItemEventHandler(errorFlags2ListViewEx_SubItemClicked);
errorFlags2ListViewEx.SubItemRightClicked += new SubItemEventHandler(errorFlags2ListViewEx_SubItemRightClicked);
errorFlags2ListViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(errorFlags2ListViewEx_SubItemEndEditing);
SelectedTestIx = -1;
}
private void TestProfileDlg_Load(object sender, EventArgs e)
{
Localize();
if (LoadedProfile == null) return; /// return in case the dialog is open in the designer
LoadUISettings();
procNameTextBox.Enabled = false;
descriptionTextBox.Enabled = false;
/// Make some controls readonly
createdByTextBox.ReadOnly = true;
createdOnTextBox.ReadOnly = true;
lastChangedByTextBox.ReadOnly = true;
lastChangedOnTextBox.ReadOnly = true;
profileTypeRadioButton1.Enabled = false;
profileTypeRadioButton2.Enabled = false;
profileTypeRadioButton3.Enabled = false;
profileTypeRadioButton4.Enabled = false;
profileTypeRadioButton5.Enabled = false;
errorCalculationRadioButton1.Enabled = false;
errorCalculationRadioButton2.Enabled = false;
/// LisViewEx columns and edit controls for 'Metrology1', 'Metrology2', 'Process' and 'Parameters' tabs
PrepareMetrologyTab();
PrepareErrorFlags();
PrepareErrorFlags2();
/// Now refresh the content of the dialog
RefreshGeneralTab();
RefreshMetrologyTab();
RefreshErrorFlagsTab();
RefreshErrorFlags2Tab();
/// Optionally unlock this dialog
if (openUnlocked)
{
sharedButtons.UnlockButtons();
Unlocked(sender, e);
}
}
void Localize()
{
Text = Strings.Profile;
generalTabPage.Text = Strings.General;
metrologyTabPage.Text = Strings.Metrology;
errorFlagsTabPage.Text = "Error flags";
errorFlags2TabPage.Text = "Error flags details";
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;
}
#region General
void RefreshGeneralTab()
{
procNameTextBox.Text = LoadedProfile.Name;
Text = string.Format("{0} {1} {2}", Strings.Profile, LoadedProfile.ItemNr + 1, LoadedProfile.Name);
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();
}
switch(LoadedProfile.ProfileType)
{
default:
case ProfileType.Q3R: profileTypeRadioButton1.Checked = true; break;
case ProfileType.QnClassColdWater: profileTypeRadioButton2.Checked = true; break;
case ProfileType.QnClassHotWater: profileTypeRadioButton3.Checked = true; break;
case ProfileType.QpQi: profileTypeRadioButton4.Checked = true; break;
case ProfileType.Manual: profileTypeRadioButton5.Checked = true; break;
}
switch(LoadedProfile.ErrorLimitType)
{
default:
case ErrorLimitType.Manual: errorCalculationRadioButton1.Checked = true; break;
case ErrorLimitType.QpClass: errorCalculationRadioButton2.Checked = true; break;
}
}
void UpdateFromGeneralTab()
{
LoadedProfile.Name = procNameTextBox.Text;
Text = string.Format("{0} {1} {2}", Strings.Profile, LoadedProfile.ItemNr + 1, LoadedProfile.Name);
LoadedProfile.Description = descriptionTextBox.Text;
LoadedProfile.ProfileType = profileTypeRadioButton1.Checked ? ProfileType.Q3R :
(profileTypeRadioButton2.Checked ? ProfileType.QnClassColdWater :
(profileTypeRadioButton3.Checked ? ProfileType.QnClassHotWater :
(profileTypeRadioButton4.Checked ? ProfileType.QpQi
: ProfileType.Manual)));
LoadedProfile.ErrorLimitType = errorCalculationRadioButton1.Checked ? ErrorLimitType.Manual
: ErrorLimitType.QpClass;
}
#endregion
#region Metrology
Control[] metrologyEditors;
public enum MtrlgyClmn
{
Name,
Part,
CoefQfrom,
CoefQto,
ErrLimLo,
ErrLimHi,
TempLimLo,
TempLimHi,
PressLimLo,
PressLimHi,
Publish,
Evaluate,
Method,
ColumnsCount
}
void PrepareMetrologyTab()
{
ListViewEx lv = metrologyListViewEx;
lv.Columns.Add(new ColumnHeader { Text = Strings.Test_chdr, Width = 70 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Part, Width = 40 });
lv.Columns.Add(new ColumnHeader { Text = string.Format("Coef. {0}", Strings.Q_from), Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = string.Format("Coef. {0}", Strings.Q_to), 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 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Publish, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Evaluate, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Method_chdr, Width = 200 });
ComboBox publishCBox = new ComboBox(); /// control for Publish
for (Publish pb = 0; pb < Publish.Count; pb++)
{
publishCBox.Items.Add(pb.ToDescription());
}
ComboBox yesNoCBox = new ComboBox(); /// control for Evaluate
yesNoCBox.Items.Add(Strings.yes);
yesNoCBox.Items.Add(Strings.no);
ComboBox methodCBox = new ComboBox();
foreach (var m in TestMethods) methodCBox.Items.Add(m.Name);
metrologyEditors = new Control[]
{
new TextBox(), /// Name
new TextBox(), /// Part
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. +
publishCBox, /// Publish
yesNoCBox, /// Evaluate
methodCBox, /// Test method
};
foreach (var ctrl in metrologyEditors)
{
metrologyTabPage.Controls.Add(ctrl);
}
}
void RefreshMetrologyTab()
{
metrologyListViewEx.Items.Clear();
foreach (var test in LoadedProfile.Tests) AddToMetrologyTab(test);
if (0 <= SelectedTestIx && SelectedTestIx < metrologyListViewEx.Items.Count)
{
metrologyListViewEx.Items[SelectedTestIx].Selected = true;
}
}
void AddToMetrologyTab(PTest pTest)
{
///
/// Metrology 1 item with subitems
///
ListViewItem lvi = new ListViewItem(pTest.Name);
lvi.Tag = pTest;
lvi.SubItems.Add((pTest.Part == 0) ? "-" : pTest.Part.ToString());
lvi.SubItems.Add(pTest.CoefQfrom.ToString());
lvi.SubItems.Add(pTest.CoefQto.ToString());
if (LoadedProfile.ProfileType != ProfileType.QpQi)
{
lvi.SubItems.Add(pTest.ErrLimLo.ToString());
lvi.SubItems.Add(pTest.ErrLimHi.ToString());
}
else
{
lvi.SubItems.Add(Strings.calculated);
lvi.SubItems.Add(Strings.calculated);
}
lvi.SubItems.Add(pTest.TempLimLo.ToString());
lvi.SubItems.Add(pTest.TempLimHi.ToString());
lvi.SubItems.Add(pTest.PressLimLo.ToString());
lvi.SubItems.Add(pTest.PressLimHi.ToString());
lvi.SubItems.Add(((Publish)pTest.Publish).ToDescription());
lvi.SubItems.Add(pTest.Evaluate ? Strings.yes : Strings.no);
lvi.SubItems.Add((pTest.Method != null) ? pTest.Method : string.Empty);
metrologyListViewEx.Items.Add(lvi);
}
void UpdateFromMetrologyTab()
{
for (int i = 0; i < metrologyListViewEx.Items.Count; i++)
{
try
{
ListViewItem lvi = metrologyListViewEx.Items[i];
PTest entity = (PTest)lvi.Tag;
entity.Name = lvi.Text;
entity.ItemNr = i;
int part = entity.Part;
if (lvi.SubItems[(int)MtrlgyClmn.Part].Text.Equals("-"))
{
entity.Part = 0;
}
else if (int.TryParse(lvi.SubItems[(int)MtrlgyClmn.Part].Text, out part))
{
entity.Part = part;
}
entity.CoefQfrom = Utils.ParseUDouble(lvi.SubItems[(int)MtrlgyClmn.CoefQfrom].Text);
entity.CoefQto = Utils.ParseUDouble(lvi.SubItems[(int)MtrlgyClmn.CoefQto].Text);
if (LoadedProfile.ProfileType != ProfileType.QpQi)
{
entity.ErrLimLo = Utils.ParseSDouble(lvi.SubItems[(int)MtrlgyClmn.ErrLimLo].Text);
entity.ErrLimHi = Utils.ParseSDouble(lvi.SubItems[(int)MtrlgyClmn.ErrLimHi].Text);
}
else
{
entity.ErrLimLo = +1.0;
entity.ErrLimHi = -1.0;
}
entity.TempLimLo = Utils.ParseUDouble(lvi.SubItems[(int)MtrlgyClmn.TempLimLo].Text);
entity.TempLimHi = Utils.ParseUDouble(lvi.SubItems[(int)MtrlgyClmn.TempLimHi].Text);
entity.PressLimLo = Utils.ParseUDouble(lvi.SubItems[(int)MtrlgyClmn.PressLimLo].Text);
entity.PressLimHi = Utils.ParseUDouble(lvi.SubItems[(int)MtrlgyClmn.PressLimHi].Text);
entity.Evaluate = lvi.SubItems[(int)MtrlgyClmn.Evaluate].Text.Equals(Strings.yes);
for (Publish pb = 0; pb < Publish.Count; pb++)
{
if (lvi.SubItems[(int)MtrlgyClmn.Publish].Text.Equals(pb.ToDescription()))
{
entity.Publish = (sbyte)pb;
break;
}
}
entity.Method = lvi.SubItems[(int)MtrlgyClmn.Method].Text;
}
catch (Exception exc)
{
MessageBox.Show(string.Format("Unexpected problem: {0}", exc.Message));
}
}
}
private void metrologyListViewEx_SubItemClicked(object sender, SubItemEventArgs e)
{
if (LoadedProfile.ProfileType == ProfileType.QpQi &&
((e.SubItem == (int)MtrlgyClmn.ErrLimLo) || (e.SubItem == (int)MtrlgyClmn.ErrLimHi)))
{
return; /// Prevent editing calculated error limits
}
if (unlocked && (e.SubItem < (int)MtrlgyClmn.ColumnsCount))
{
metrologyListViewEx.StartEditing(metrologyEditors[e.SubItem], e.Item, e.SubItem);
}
}
void metrologyListViewEx_SubItemRightClicked(object sender, SubItemEventArgs e)
{
if (!unlocked || e.SubItem >= (int)MtrlgyClmn.ColumnsCount) 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 metrologyListViewEx.Items)
{
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;
}
}
}
}
private void metrologyListViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e)
{
if (e.SubItem == (int)MtrlgyClmn.Name)
{
if (!Utils.IsGoodFName(e.DisplayText))
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return; /// NOK
}
}
int idummy;
if (e.SubItem == (int)MtrlgyClmn.Part)
{
if (e.DisplayText.Equals("-")) return; /// OK
if (!int.TryParse(e.DisplayText, out idummy) || !Data.IsGoodPartNr(idummy))
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return; /// NOK
}
}
double dummy;
if ((e.SubItem == (int)MtrlgyClmn.CoefQfrom && !Utils.TryParseUDouble(e.DisplayText, out dummy)) ||
(e.SubItem == (int)MtrlgyClmn.CoefQto && !Utils.TryParseUDouble(e.DisplayText, out dummy)) ||
(e.SubItem == (int)MtrlgyClmn.ErrLimLo && !Utils.TryParseSDouble(e.DisplayText, out dummy)) ||
(e.SubItem == (int)MtrlgyClmn.ErrLimHi && !Utils.TryParseSDouble(e.DisplayText, out dummy)) ||
(e.SubItem == (int)MtrlgyClmn.TempLimLo && !Utils.TryParseUDouble(e.DisplayText, out dummy)) ||
(e.SubItem == (int)MtrlgyClmn.TempLimHi && !Utils.TryParseUDouble(e.DisplayText, out dummy)) ||
(e.SubItem == (int)MtrlgyClmn.PressLimLo && !Utils.TryParseUDouble(e.DisplayText, out dummy)) ||
(e.SubItem == (int)MtrlgyClmn.PressLimHi && !Utils.TryParseUDouble(e.DisplayText, out dummy)))
{
/// Cannot parse => revert content of the cell
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return;
}
/// Combo boxes
if ((e.SubItem == (int)MtrlgyClmn.Publish) || (e.SubItem == (int)MtrlgyClmn.Evaluate) || (e.SubItem == (int)MtrlgyClmn.Method))
{
if (!(metrologyEditors[e.SubItem] as ComboBox).Items.Contains(e.DisplayText))
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return;
}
}
}
#endregion
#region Error flags
public enum ErrorFlagsClmn
{
Name,
E1,
E2,
E3,
E4,
E5,
E6,
E7,
E8,
E9,
E10,
E11,
E12,
E13,
E14,
E15,
E16,
E21,
ColumnsCount
}
Control[] errorFlagsEditors;
void PrepareErrorFlags()
{
ListViewEx lv = errorFlagsListViewEx;
errorFlagsEditors = new Control[(int)ErrorFlagsClmn.ColumnsCount];
int ix = 0;
lv.Columns.Add(new ColumnHeader { Text = Strings.Test_chdr, Width = 70 });
errorFlagsEditors[ix++] = new TextBox(); /// Name
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 });
/// Edit control
ComboBox cb = new ComboBox();
for (ErrorFlagsMode efm = 0; efm < ErrorFlagsMode.Count; efm++) cb.Items.Add(efm.ToDescription());
errorFlagsEditors[ix++] = cb;
}
foreach (var ctrl in errorFlagsEditors) errorFlagsTabPage.Controls.Add(ctrl);
}
void RefreshErrorFlagsTab()
{
errorFlagsListViewEx.Items.Clear();
foreach (var test in LoadedProfile.Tests) AddToErrorFlagsTab(test);
if (0 <= SelectedTestIx && SelectedTestIx < errorFlagsListViewEx.Items.Count)
{
errorFlagsListViewEx.Items[SelectedTestIx].Selected = true;
}
}
void AddToErrorFlagsTab(PTest pTest)
{
ListViewItem lvi = new ListViewItem(pTest.Name);
lvi.Tag = pTest;
lvi.SubItems.Add(SByte2String(pTest.E1));
lvi.SubItems.Add(SByte2String(pTest.E2));
lvi.SubItems.Add(SByte2String(pTest.E3));
lvi.SubItems.Add(SByte2String(pTest.E4));
lvi.SubItems.Add(SByte2String(pTest.E5));
lvi.SubItems.Add(SByte2String(pTest.E6));
lvi.SubItems.Add(SByte2String(pTest.E7));
lvi.SubItems.Add(SByte2String(pTest.E8));
lvi.SubItems.Add(SByte2String(pTest.E9));
lvi.SubItems.Add(SByte2String(pTest.E10));
lvi.SubItems.Add(SByte2String(pTest.E11));
lvi.SubItems.Add(SByte2String(pTest.E12));
lvi.SubItems.Add(SByte2String(pTest.E13));
lvi.SubItems.Add(SByte2String(pTest.E14));
lvi.SubItems.Add(SByte2String(pTest.E15));
lvi.SubItems.Add(SByte2String(pTest.E16));
lvi.SubItems.Add(SByte2String(pTest.E21));
errorFlagsListViewEx.Items.Add(lvi);
}
void UpdateFromErrorFlagsTab()
{
for (int i = 0; i < errorFlagsListViewEx.Items.Count; i++)
{
ListViewItem lvi = errorFlagsListViewEx.Items[i];
PTest entity = (PTest)lvi.Tag;
entity.Name = lvi.Text;
entity.ItemNr = i;
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);
}
}
private void errorFlagsListViewEx_SubItemClicked(object sender, SubItemEventArgs e)
{
if (!unlocked || e.SubItem >= (int)ErrorFlagsClmn.ColumnsCount)
{
return;
}
errorFlagsListViewEx.StartEditing(errorFlagsEditors[e.SubItem], e.Item, e.SubItem);
}
void errorFlagsListViewEx_SubItemRightClicked(object sender, SubItemEventArgs e)
{
if (!unlocked || e.SubItem >= (int)ErrorFlagsClmn.ColumnsCount)
{
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 errorFlagsListViewEx.Items)
{
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;
}
}
}
}
private void errorFlagsListViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e)
{
if (e.SubItem == (int)ErrorFlagsClmn.Name)
{
if (!Utils.IsGoodFName(e.DisplayText))
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return; /// NOK
}
}
sbyte dummy;
if ((e.SubItem >= (int)ErrorFlagsClmn.E1) && (e.SubItem <= (int)ErrorFlagsClmn.E21) && !IsValidEFlagsMode(e.DisplayText, out dummy))
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return; /// NOK
}
}
#endregion
#region Error flags 2
public enum ErrorFlags2Clmn
{
Name,
Delta_Q_pct,
Delta_T,
Delta_Tup_Tdn,
TestTime_min,
TestTime_max,
AmbTemp_min,
AmbTemp_max,
Coef_E9,
Coef_E10,
Coef_E11,
Coef_E12,
Offset_E9,
Offset_E12,
ColumnsCount
}
Control[] errorFlags2Editors;
void PrepareErrorFlags2()
{
string[] paramNames = new string[]
{
Strings.Test_chdr,
"Delta Q [%]",
"Delta T [°C]",
"max. Abs(Tup - Tdn) [°C]",
string.Format("min. {0}", Strings.Test_time_s_chdr),
string.Format("max. {0}", Strings.Test_time_s_chdr),
string.Format("min. {0} [°C]", Strings.Air_temperature),
string.Format("max. {0} [°C]", Strings.Air_temperature),
"Coef.E9",
"Coef.E10",
"Coef.E11",
"Coef.E12",
"Offset E9 [s]",
"Offset E12 [s]",
};
/// Compare ErrorFlags2Clmn with paramNames array. Return on mismatch
if ((int)ErrorFlags2Clmn.ColumnsCount != paramNames.Length) return;
ListViewEx lv = errorFlags2ListViewEx;
errorFlags2Editors = new Control[(int)ErrorFlags2Clmn.ColumnsCount];
int ix = 0;
for (int i = 0; i < paramNames.Length; i++)
{
lv.Columns.Add(new ColumnHeader { Text = paramNames[i], Width = 70 }); /// Column header
Control ctrl;
errorFlags2Editors[ix++] = ctrl = new TextBox(); /// Edit control
errorFlags2TabPage.Controls.Add(ctrl);
}
}
void RefreshErrorFlags2Tab()
{
errorFlags2ListViewEx.Items.Clear();
foreach (var test in LoadedProfile.Tests) AddToErrorFlags2Tab(test);
if (0 <= SelectedTestIx && SelectedTestIx < errorFlags2ListViewEx.Items.Count)
{
errorFlags2ListViewEx.Items[SelectedTestIx].Selected = true;
}
}
void AddToErrorFlags2Tab(PTest pTest)
{
ListViewItem lvi = new ListViewItem(pTest.Name);
lvi.Tag = pTest;
lvi.SubItems.Add(pTest.Delta_Q_pct.ToString());
lvi.SubItems.Add(pTest.Delta_T.ToString());
lvi.SubItems.Add(pTest.Delta_Tup_Tdn.ToString());
lvi.SubItems.Add(pTest.TestTime_min.ToString());
lvi.SubItems.Add(pTest.TestTime_max.ToString());
lvi.SubItems.Add(pTest.AmbTemp_min.ToString());
lvi.SubItems.Add(pTest.AmbTemp_max.ToString());
lvi.SubItems.Add(pTest.Coef_E9.ToString());
lvi.SubItems.Add(pTest.Coef_E10.ToString());
lvi.SubItems.Add(pTest.Coef_E11.ToString());
lvi.SubItems.Add(pTest.Coef_E12.ToString());
lvi.SubItems.Add(pTest.Offset_E9.ToString());
lvi.SubItems.Add(pTest.Offset_E12.ToString());
errorFlags2ListViewEx.Items.Add(lvi);
}
void UpdateFromErrorFlags2Tab()
{
for (int i = 0; i < errorFlags2ListViewEx.Items.Count; i++)
{
ListViewItem lvi = errorFlags2ListViewEx.Items[i];
PTest entity = (PTest)lvi.Tag;
entity.Name = lvi.Text;
entity.ItemNr = i;
int j = 1;
entity.Delta_Q_pct = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.Delta_T = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.Delta_Tup_Tdn = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.TestTime_min = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.TestTime_max = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.AmbTemp_min = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.AmbTemp_max = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.Coef_E9 = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.Coef_E10 = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.Coef_E11 = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.Coef_E12 = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.Offset_E9 = Utils.ParseUDouble(lvi.SubItems[j++].Text);
entity.Offset_E12 = Utils.ParseUDouble(lvi.SubItems[j++].Text);
}
}
private void errorFlags2ListViewEx_SubItemClicked(object sender, SubItemEventArgs e)
{
if (!unlocked || e.SubItem >= (int)ErrorFlags2Clmn.ColumnsCount)
{
return;
}
errorFlags2ListViewEx.StartEditing(errorFlags2Editors[e.SubItem], e.Item, e.SubItem);
}
void errorFlags2ListViewEx_SubItemRightClicked(object sender, SubItemEventArgs e)
{
if (!unlocked || e.SubItem >= (int)ErrorFlags2Clmn.ColumnsCount)
{
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 errorFlags2ListViewEx.Items)
{
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;
}
}
}
}
private void errorFlags2ListViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e)
{
if (e.SubItem == (int)ErrorFlags2Clmn.Name)
{
if (!Utils.IsGoodFName(e.DisplayText))
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return; /// NOK
}
}
double dummy;
if ((e.SubItem >= 1) && (e.SubItem < (int)ErrorFlags2Clmn.ColumnsCount) && !Utils.TryParseUDouble(e.DisplayText, out dummy))
{
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
return; /// NOK
}
}
#endregion
void RefreshMetrologyAndErrorFlagsTabs()
{
RefreshMetrologyTab();
RefreshErrorFlagsTab();
RefreshErrorFlags2Tab();
}
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;
profileTypeRadioButton1.Enabled = true;
profileTypeRadioButton2.Enabled = true;
profileTypeRadioButton1.Enabled = true;
profileTypeRadioButton2.Enabled = true;
profileTypeRadioButton3.Enabled = true;
profileTypeRadioButton4.Enabled = true;
profileTypeRadioButton5.Enabled = true;
errorCalculationRadioButton1.Enabled = true;
errorCalculationRadioButton2.Enabled = true;
ListViewEx listViewEx = null;
switch (selectedTab)
{
case TestProfileTabs.Metrology: listViewEx = metrologyListViewEx; break;
case TestProfileTabs.ErrorFlags: listViewEx = errorFlagsListViewEx; break;
case TestProfileTabs.ErrorFlags2: listViewEx = errorFlags2ListViewEx; break;
}
if ((listViewEx != null) && (listViewEx.SelectedItems.Count == 1))
{
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)
{
case TestProfileTabs.General: UpdateFromGeneralTab(); break;
case TestProfileTabs.Metrology: UpdateFromMetrologyTab(); break;
case TestProfileTabs.ErrorFlags: UpdateFromErrorFlagsTab(); break;
case TestProfileTabs.ErrorFlags2: UpdateFromErrorFlags2Tab(); break;
}
//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));
if (usedNames != null && usedNames.Contains(LoadedProfile.Name.ToLower()))
{
MessageBox.Show(string.Format("There is already a procedure named '{0}'.{1}Choose another name please.", LoadedProfile.Name, Environment.NewLine),
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
enum TestProfileTabs
{
General,
Metrology,
ErrorFlags,
ErrorFlags2,
}
TestProfileTabs selectedTab = TestProfileTabs.General;
private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
switch (selectedTab)
{
case TestProfileTabs.General:
UpdateFromGeneralTab();
break;
case TestProfileTabs.Metrology:
UpdateFromMetrologyTab();
break;
case TestProfileTabs.ErrorFlags:
UpdateFromErrorFlagsTab();
break;
case TestProfileTabs.ErrorFlags2:
UpdateFromErrorFlags2Tab();
break;
}
selectedTab = (TestProfileTabs)tabControl.SelectedIndex;
bool isMetrologyOrErrorFlags = selectedTab == TestProfileTabs.Metrology ||
selectedTab == TestProfileTabs.ErrorFlags ||
selectedTab == TestProfileTabs.ErrorFlags2;
if (isMetrologyOrErrorFlags)
{
sharedButtons.EnableButtons(SharedButtons.Buttons.Add);
}
else
{
sharedButtons.DisableButtons(SharedButtons.Buttons.Add);
}
//bool removeBtnEnabled = (selectedTab != TestProfileTabs.General);
sharedButtons.DisableButtons(SharedButtons.Buttons.Remove);
ListViewEx lv = null;
///
switch (selectedTab)
{
case TestProfileTabs.General:
RefreshGeneralTab();
break;
case TestProfileTabs.Metrology:
RefreshMetrologyTab();
lv = metrologyListViewEx; /// ListVIewEx for test selection
break;
case TestProfileTabs.ErrorFlags:
RefreshErrorFlagsTab();
lv = errorFlagsListViewEx; /// ListVIewEx for test selection
break;
case TestProfileTabs.ErrorFlags2:
RefreshErrorFlags2Tab();
lv = errorFlags2ListViewEx; /// ListVIewEx for test selection
break;
default:
UpdateButtonStates(SharedButtons.SelectedItemPos.None);
break;
}
///
/// Highlight the selected test
///
if ((lv != null) && (0 <= SelectedTestIx) && (SelectedTestIx < lv.Items.Count))
{
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)
{
ListViewEx listViewEx;
switch (selectedTab)
{
case TestProfileTabs.Metrology: listViewEx = metrologyListViewEx; break;
case TestProfileTabs.ErrorFlags: listViewEx = errorFlagsListViewEx; break;
case TestProfileTabs.ErrorFlags2: listViewEx = errorFlags2ListViewEx; break;
default: return;
}
///
/// Find an unused test name
///
string newName;
for (int nameId = 1; true; nameId++)
{
if (nameId >= 5 || (nameId >= 4 && LoadedProfile.ProfileType == ProfileType.QpQi) || LoadedProfile.ProfileType == ProfileType.Manual)
{
newName = Strings.New_test_name + nameId.ToString();
}
else
{
switch (LoadedProfile.ProfileType)
{
default:
case ProfileType.Q3R:
newName = string.Format("Q{0}", 5 - nameId);
break;
case ProfileType.QnClassColdWater:
case ProfileType.QnClassHotWater:
newName = (nameId == 1) ? "Qmax" : (nameId == 2) ? "Qn" : (nameId == 3) ? "Qt" : "Qmin";
break;
case ProfileType.QpQi:
newName = (nameId == 1) ? "qp" : (nameId == 2) ? "0,1qp" : "qi";
break;
}
}
bool notUsed = true;
foreach (var t in LoadedProfile.Tests) if (t.Name.Equals(newName)) notUsed = false;
if (notUsed) break;
}
///
/// Add a profile test
///
int count = listViewEx.Items.Count;
PTest ptest = new PTest(newName, count, LoadedProfile);
///
/// Upper and lower limits of flow
///
switch (LoadedProfile.ProfileType)
{
case ProfileType.Q3R:
case ProfileType.QnClassColdWater:
case ProfileType.QnClassHotWater:
switch (count)
{
case 0:
case 1:
ptest.CoefQfrom = 0.9;
ptest.CoefQto = 1.0;
break;
default:
ptest.CoefQfrom = 1.0;
ptest.CoefQto = 1.1;
break;
}
break;
case ProfileType.QpQi:
switch (count)
{
case 0:
ptest.CoefQfrom = 0.9;
ptest.CoefQto = 1.0;
break;
default:
ptest.CoefQfrom = 1.0;
ptest.CoefQto = 1.1;
break;
}
break;
}
///
/// Upper and lower limits of relative error
///
switch (LoadedProfile.ProfileType)
{
case ProfileType.Q3R:
case ProfileType.QnClassColdWater:
switch (count)
{
case 3:
ptest.ErrLimLo = -5.0;
ptest.ErrLimHi = 5.0;
break;
default:
ptest.ErrLimLo = -2.0;
ptest.ErrLimHi = 2.0;
break;
}
break;
case ProfileType.QnClassHotWater:
switch (count)
{
case 3:
ptest.ErrLimLo = -5.0;
ptest.ErrLimHi = 5.0;
break;
default:
ptest.ErrLimLo = -3.0;
ptest.ErrLimHi = 3.0;
break;
}
break;
}
LoadedProfile.Tests.Add(ptest);
AddToMetrologyTab(ptest);
AddToErrorFlagsTab(ptest);
if (listViewEx != null)
{
listViewEx.Focus();
listViewEx.SelectedItems.Clear();
listViewEx.Items[listViewEx.Items.Count - 1].Selected = true;
listViewEx.Items[listViewEx.Items.Count - 1].EnsureVisible();
}
}
private void removeButton_Click(object sender, EventArgs e)
{
ListViewEx listViewEx;
switch (selectedTab)
{
case TestProfileTabs.Metrology:
UpdateFromMetrologyTab();
listViewEx = metrologyListViewEx;
break;
case TestProfileTabs.ErrorFlags:
UpdateFromErrorFlagsTab();
listViewEx = errorFlagsListViewEx;
break;
case TestProfileTabs.ErrorFlags2:
UpdateFromErrorFlags2Tab();
listViewEx = errorFlags2ListViewEx;
break;
default: return;
}
/// Check the selected index validity
if (listViewEx.SelectedItems.Count != 1) return;
int removeItemNr = listViewEx.SelectedIndices[0];
/// Remove the selected test
PTest toBeDeleted = LoadedProfile.Tests[removeItemNr];
LoadedProfile.Tests.Remove(toBeDeleted);
for (int i = removeItemNr; i < LoadedProfile.Tests.Count; i++) LoadedProfile.Tests[i].ItemNr--;
RefreshMetrologyAndErrorFlagsTabs();
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)
{
case TestProfileTabs.Metrology:
UpdateFromMetrologyTab();
listViewEx = metrologyListViewEx;
break;
case TestProfileTabs.ErrorFlags:
UpdateFromErrorFlagsTab();
listViewEx = errorFlagsListViewEx;
break;
case TestProfileTabs.ErrorFlags2:
UpdateFromErrorFlags2Tab();
listViewEx = errorFlags2ListViewEx;
break;
default: return;
}
/// Check the selected index validity
if (listViewEx.SelectedItems.Count != 1) return;
int ix = listViewEx.SelectedIndices[0];
if (ix <= 0 || ix >= listViewEx.Items.Count) return;
/// Swap two items (move the selected item up)
PTest test1 = LoadedProfile.Tests[ix - 1];
PTest test2 = LoadedProfile.Tests[ix];
test1.ItemNr++;
test2.ItemNr--;
LoadedProfile.Tests.RemoveAt(ix);
LoadedProfile.Tests.Insert(ix - 1, test2);
if (SelectedTestIx >= 1) SelectedTestIx--;
RefreshMetrologyAndErrorFlagsTabs();
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)
{
case TestProfileTabs.Metrology:
UpdateFromMetrologyTab();
listViewEx = metrologyListViewEx;
break;
case TestProfileTabs.ErrorFlags:
UpdateFromErrorFlagsTab();
listViewEx = errorFlagsListViewEx;
break;
case TestProfileTabs.ErrorFlags2:
UpdateFromErrorFlags2Tab();
listViewEx = errorFlags2ListViewEx;
break;
default: return;
}
/// Check the selected index validity
if (listViewEx.SelectedItems.Count != 1) return;
int ix = listViewEx.SelectedIndices[0];
if (ix < 0 || ix >= listViewEx.Items.Count - 1) return;
/// Swap two items (move the selected item down)
PTest test1 = LoadedProfile.Tests[ix];
PTest test2 = LoadedProfile.Tests[ix + 1];
test1.ItemNr++;
test2.ItemNr--;
LoadedProfile.Tests.RemoveAt(ix + 1);
LoadedProfile.Tests.Insert(ix, test2);
if ((SelectedTestIx >= 0) && (SelectedTestIx < listViewEx.Items.Count - 1)) SelectedTestIx++;
RefreshMetrologyAndErrorFlagsTabs();
listViewEx.Focus();
listViewEx.Items[ix + 1].Selected = true;
listViewEx.Items[ix + 1].EnsureVisible();
}
#endregion
private void metrologyListViewEx_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); }
private void errorFlagsListViewEx_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); }
private void errorFlags2ListViewEx_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;
if ((listViewEx == null) || (listViewEx.SelectedItems.Count != 1))
{
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);
}
}
///
/// 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;
}
}
}