/// /// Copyright (c) 2017-2020 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Globalization; using System.Windows.Forms; using log4net; using Config.Entities; using Common.Forms; using TBF.Resources; using TBF.UI.Shared; namespace TBF.UI.Bench.Metrology { public partial class MetrologyDlgTempMeterTab : UserControl, IMetrologyDlgTab { static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlgTempMeterTab)); /// /// Component entity that has a list of 'measurement-correction' pairs /// to be updated in the database on OK. /// Component meterEntity; public Component MeterEntity { get { return meterEntity; } set { meterEntity = value; } } /// /// Balance configuration (with buoyancy parameters) /// public Rig.GenericDevices.ICalibInfoCfg CalibInfoCfg; /// /// A list of 'measurement-correction' pairs to be deleted from the database on OK. /// public IList ToBeRemoved { get { return toBeRemoved; } set { toBeRemoved = value; } } IList toBeRemoved; MetrologyDlg parent; bool unlocked; Control measurementTextBox; Control correctionTextBox; Control errorTextBox; public MetrologyDlgTempMeterTab() { InitializeComponent(); calibDateTimePicker.CustomFormat = Constants.DateFormat; calibDateTimePicker.MinDate = Constants.MinDate; calibExpirationDateTimePicker.CustomFormat = Constants.DateFormat; calibExpirationDateTimePicker.MinDate = Constants.MinDate; toBeRemoved = new List(); unlocked = false; } private void MetrologyDlgTempMeterTab_Load(object sender, System.EventArgs e) { if (meterEntity == null) return; parent = ParentForm as MetrologyDlg; Localize(); /// Panel1 cmpntNameLabel.Text = meterEntity.Name; /// Panel2 this.Controls.Add(measurementTextBox = new TextBox()); this.Controls.Add(correctionTextBox = new TextBox()); this.Controls.Add(errorTextBox = new TextBox()); listViewEx.SubItemClicked += new SubItemEventHandler(listViewEx_SubItemClicked); listViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); listViewEx.Columns.Add(new ColumnHeader() { Text = Strings.Nr, Width = 40 }); listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [°C]", Strings.Temperature), Width = 120 }); listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [1/1000 °C]", Strings.Correction), Width = 150 }); listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [%]", Strings.Error), Width = 100 }); RefreshAll(); } void Localize() { componentLabel.Text = Strings.Component; testGroupBox.Text = Strings.Test_measured_corrected; measuredLabel.Text = Strings.Measured; correctedLabel.Text = Strings.Corrected; measuredTextBox.Text = string.Empty; correctedTextBox.Text = string.Empty; calibrationGroupBox.Text = Strings.Calibration; calibCertificateNrLabel.Text = Strings.Certificate; calibDateLabel.Text = Strings.Date; calibValidDateLabel.Text = Strings.Valid_until; } void RefreshAll() { if (CalibInfoCfg != null) { calibCertificateNrTextBox.Text = CalibInfoCfg.CalibCertificateNr; calibDateTimePicker.Value = (CalibInfoCfg.CalibDate < Constants.MinDate) ? Constants.MinDate : CalibInfoCfg.CalibDate; calibExpirationDateTimePicker.Value = (CalibInfoCfg.CalibValidDate < Constants.MinDate) ? Constants.MinDate : CalibInfoCfg.CalibValidDate; } listViewEx.Items.Clear(); foreach (var corr in MeterEntity.Corrections) AddOneLVI(corr); } void AddOneLVI(MeasurementCorrection corr) { int nr = listViewEx.Items.Count + 1; ListViewItem lvi = new ListViewItem(nr.ToString()); lvi.Tag = corr; lvi.SubItems.Add(corr.Measurement.ToString()); lvi.SubItems.Add((1000 * corr.Correction).ToString()); if (corr.Measurement == 0) { lvi.SubItems.Add(Strings.NaN); } else { double error = Config.Formulas.ErrorFromVolumes(corr.Measurement, corr.Measurement + corr.Correction); lvi.SubItems.Add(error.ToString(Config.Utils.SignificantDigitsToFmt(error, 5))); } listViewEx.Items.Add(lvi); } void listViewEx_SubItemClicked(object sender, SubItemEventArgs e) { if (unlocked && e.SubItem == 1) { listViewEx.StartEditing(measurementTextBox, e.Item, e.SubItem); } else if (unlocked && e.SubItem == 2) { listViewEx.StartEditing(correctionTextBox, e.Item, e.SubItem); } else if (unlocked && e.SubItem == 3) { listViewEx.StartEditing(correctionTextBox, e.Item, e.SubItem); } } void listViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e) { if (ParseItem(e.Item, e.SubItem, e.DisplayText)) return; /// New value is NOK, revert the original text e.DisplayText = e.Item.Text; e.Cancel = true; } /// /// Parse text of a ListViewItem /// /// true = value parsed OK bool ParseItem(ListViewItem item, int subItem, string strValue) { double dblValue = 0; if (subItem == 1 && Utils.TryParseEDouble(strValue, out dblValue) && dblValue >= 0) { (item.Tag as MeasurementCorrection).Measurement = (float)dblValue; /// Update error (if possible) double correction1000; if (Utils.TryParseEDouble(item.SubItems[2].Text, out correction1000) && (dblValue != 0)) { double correction = correction1000 / 1000; double error = Config.Formulas.ErrorFromVolumes(dblValue, dblValue + correction); item.SubItems[3].Text = error.ToString(Config.Utils.SignificantDigitsToFmt(error, 5)); } else { item.SubItems[3].Text = Strings.NaN; } return true; } else if (subItem == 2 && Utils.TryParseEDouble(strValue, out dblValue)) { double correctionInDefaultUnits = dblValue / 1000; (item.Tag as MeasurementCorrection).Correction = (float)correctionInDefaultUnits; /// Update error (if possible) double measurement; if (Utils.TryParseEDouble(item.SubItems[1].Text, out measurement) && (measurement != 0)) { double error = Config.Formulas.ErrorFromVolumes(measurement, measurement + correctionInDefaultUnits); item.SubItems[3].Text = error.ToString(Config.Utils.SignificantDigitsToFmt(error, 5)); } else { item.SubItems[3].Text = Strings.NaN; } return true; } else if (subItem == 3 && ((strValue == Strings.NaN) || Utils.TryParseEDouble(strValue, out dblValue))) { if (strValue == Strings.NaN) { } else { double measurement; if (Utils.TryParseEDouble(item.SubItems[1].Text, out measurement) && measurement != 0) { double correction = Config.Formulas.CorrectionFromError(measurement, dblValue); double correction1000 = 1000 * correction; item.SubItems[2].Text = correction1000.ToString(Config.Utils.SignificantDigitsToFmt(correction1000, 5)); (item.Tag as MeasurementCorrection).Correction = (float)correction; } } return true; } else { return false; } } public void Unlock() { unlocked = true; calibCertificateNrTextBox.Enabled = true; calibDateTimePicker.Enabled = true; calibExpirationDateTimePicker.Enabled = true; if (listViewEx.SelectedItems.Count == 1) { int ix = listViewEx.SelectedIndices[0]; listViewEx.Focus(); listViewEx.Items[ix].Selected = true; listViewEx.Items[ix].EnsureVisible(); } } public void OkBtnClicked() { if (CalibInfoCfg != null) { try { CalibInfoCfg.CalibCertificateNr = calibCertificateNrTextBox.Text; CalibInfoCfg.CalibDate = calibDateTimePicker.Value.Date; CalibInfoCfg.CalibValidDate = calibExpirationDateTimePicker.Value.Date; Component modified = CalibInfoCfg.CreateDbEntity(); MeterEntity.Parameters = modified.Parameters; } catch { MessageBox.Show(Strings.Invalid_calib_info_Correct_pls, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } public void CancelBtnClicked() { } public void AddOne() { MeasurementCorrection corr = new MeasurementCorrection(); MeterEntity.Corrections.Add(corr); AddOneLVI(corr); listViewEx.Focus(); listViewEx.SelectedItems.Clear(); listViewEx.Items[listViewEx.Items.Count - 1].Selected = true; listViewEx.Items[listViewEx.Items.Count - 1].EnsureVisible(); } public void RemoveSelected() { if (listViewEx.SelectedItems.Count != 1) return; int removeItemNr = listViewEx.SelectedIndices[0]; MeasurementCorrection selected = (MeasurementCorrection)listViewEx.SelectedItems[0].Tag; if (selected.Id != 0) toBeRemoved.Add(selected); MeterEntity.Corrections.RemoveAt(removeItemNr); RefreshAll(); if (removeItemNr < listViewEx.Items.Count) { listViewEx.Focus(); listViewEx.Items[removeItemNr].Selected = true; listViewEx.Items[removeItemNr].EnsureVisible(); } else { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); } } public void MoveUpSelected() { } public void MoveDownSelected() { } /// /// Event handler that indicates the selected item position /// and updates 'Remove', 'Up' and 'Down' buttons in the parent dialog. /// private void listViewEx_SelectedIndexChanged(object sender, EventArgs e) { if (listViewEx.SelectedItems.Count != 1) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); } else if (listViewEx.Items.Count == 1) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast); } else if (listViewEx.SelectedIndices[0] == 0) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.First); } else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Last); } else { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Middle); } } private void measuredTextBox_TextChanged(object sender, EventArgs e) { float measured; if (float.TryParse(measuredTextBox.Text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out measured) || float.TryParse(measuredTextBox.Text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out measured)) { double corrected = MeasurementCorrection.CorrectedValue(measured, meterEntity.Corrections); correctedTextBox.Text = corrected.ToString(); } } public string GetWarningsBeforeSaving(ref Dictionary renmInfo) { return string.Empty; } public void UpdateRelatedItems(Dictionary renameInfo) { } public void SaveEntityToDB(NHibernate.ISession session) { session.SaveOrUpdate(MeterEntity); } } }