/// /// Copyright (c) 2019 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using Common; using Config; using Results.Entities; using Results.Resources; using System.Globalization; namespace Results { public class ManualEntryItemSpec { /// /// Public fields /// public readonly int Uid; public readonly string Name; /// Name-s of all items must be unique public readonly string ToolTipText; /// Tool-Tip Text public readonly Quantity Quantity; /// Quantity public readonly ItemCategory Category; /// public string Caption; /// Specifies item description to be printed as a caption (in the header, etc.) public Unit Units; /// Specifies units for the output public ManualEntryItemSpec Clone() { ManualEntryItemSpec item = new ManualEntryItemSpec((ItemID)Uid, Name, ToolTipText, Quantity, Category, updateDlgt); item.Caption = Caption; item.Units = Units; return item; } /// /// Function to pick a MeterTestResult field and convert it into a string /// public delegate bool UpdateDlgt(string str, MeterTestRslt meterTestRslt); private readonly UpdateDlgt updateDlgt; public bool Update(string str, MeterTestRslt meterTestRslt) { return (updateDlgt != null) ? updateDlgt(str, meterTestRslt) : true; } public static bool ParseBool(string str, out bool success) { bool b; success = bool.TryParse(str, out b); return b; } public static int ParseInt(string str, out bool success) { int i; success = int.TryParse(str, out i); return i; } public static float ParseFloat(string str, out bool success) { float f; success = float.TryParse(str, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out f) || float.TryParse(str, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out f); return f; } public static double ParseDouble(string str, out bool success) { double d; success = double.TryParse(str, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out d) || double.TryParse(str, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out d); return d; } /// /// Public constructor /// public ManualEntryItemSpec(ItemID itemId, string name, string toolTipText, Quantity quantity, ItemCategory category, UpdateDlgt updateDlgt) { Uid = (int)itemId; Name = name; ToolTipText = toolTipText; Quantity = quantity; Category = category; this.updateDlgt = updateDlgt; } /// Static list of all available items public static readonly IList AllItems; /// /// Initializes the class. /// /// Static constructor that initializes the list of all items static ManualEntryItemSpec() { AllItems = new List(); AllItems.Add(new ManualEntryItemSpec(ItemID.P_PMax_test_mean, string.Format("{0} PMax mean", Strings.VName_Press), "PMax test pressure", Quantity.Pressure, ItemCategory.TestResult, (str, mtr) => { bool r; mtr.TestRslt.PressUpMean = mtr.TestRslt.PressDownMean = ParseFloat(str, out r); return r; })); AllItems.Add(new ManualEntryItemSpec(ItemID.T_line_mean, string.Format("{0} LN ME", Strings.VName_Temp), Strings.Tooltip_T_ln_me, Quantity.Temperature, ItemCategory.TestResult, (str, mtr) => { bool r; mtr.TestRslt.TempUpMean = mtr.TestRslt.TempDownMean = ParseFloat(str, out r); return r; })); AllItems.Add(new ManualEntryItemSpec(ItemID.Test_time, Strings.T_s, "Test time", Quantity.Time, ItemCategory.MeterResult, (str, mtr) => { bool r; mtr.TestTime = ParseDouble(str, out r); return r; })); AllItems.Add(new ManualEntryItemSpec(ItemID.PMax_test_time, "Pressure test time", "Pressure test time", Quantity.Time, ItemCategory.MeterResult, (str, mtr) => { bool r; mtr.TestTime = ParseDouble(str, out r); return r; })); AllItems.Add(new ManualEntryItemSpec(ItemID.TestPassed, Strings.Test_passed, "Passed", Quantity.Boolean, ItemCategory.MeterResult, (str, mtr) => { bool r; mtr.Passed = ParseBool(str, out r); return r; })); } /// /// Converts a list of 'Output item specifications' to a string array /// /// /// public static string[] ToStrArray(IList items) { int count = (items != null) ? items.Count : 0; string[] result = new string[count]; for (int i = 0; i < count; i++) { if (items[i].Caption == null) items[i].Caption = string.Empty; result[i] = string.Format("{0}~{1}~{2}", items[i].Uid, items[i].Caption.Replace("~", "\n"), items[i].Units); } return result; } /// /// Converts a string array to a list of 'Output item specifications' /// /// /// public static IList FromStrArray(string[] strArray) { IList result = new List(); if (strArray != null) { for (int i = 0; i < strArray.Length; i++) { try { ManualEntryItemSpec item; string[] field = strArray[i].Split(new char[] { '~' }); if (!strArray[i].Contains("~")) { item = GetItem(0); item.Caption = "Prs.Err."; result.Add(item); } else if ((item = GetItem(int.Parse(field[0]))) != null) { /// /// Load the new style results item specification /// item.Caption = field[1].Replace("\n", "~"); item.Units = 0; for (Unit u = 0; u < Unit.Count; u++) { if (u.ToString().Equals(field[2])) { item.Units = u; break; } } result.Add(item); } else { /// /// Create an item with parse error information /// ManualEntryItemSpec item2 = GetItem(0); item2.Caption = "Prs.Err."; result.Add(item2); } } catch { ManualEntryItemSpec item = GetItem(0); item.Caption = "Prs.Err."; result.Add(item); } } } return result; } public static ManualEntryItemSpec GetItem(int uid) { foreach (var item in AllItems) { if (item.Uid == uid) return item.Clone(); } return null; } public static ManualEntryItemSpec GetItem(ItemID itemId) { return GetItem((int)itemId); } public override string ToString() { if (!string.IsNullOrEmpty(Caption)) return Caption; else return ((ItemID)Uid).ToString(); } } }