/// /// Copyright (c) 2013-2015 Sensus Metering Systems /// using System.Collections.Generic; using System.Windows.Forms; using log4net; using TBF.BenchControl; using TBF.BenchControl.GenericDevices; using TBF.Resources; namespace TBF.UiControls { public partial class TransitionStepsCtrl : BaseWithListViewEx, ITabWithListViewEx { static readonly ILog log = LogManager.GetLogger(typeof(TransitionStepsCtrl)); /// /// Fixed ListViewEx columns /// enum Column { Duration, Message, Condition, Communication, FixedColumnsCount, } readonly int fixedCount = (int)Column.FixedColumnsCount; Entities.TransitionSequence sequence; TransitionsDlg parent; Control parentControl; Control[] editors; int fmPumpCount; /// Number of pumps with FM control int regvCount; /// Number of regulating valves int vCount; /// Number of valves public TransitionStepsCtrl() : base() { } public void Initialize(Entities.TransitionSequence sequence, TransitionsDlg parent, Control parentControl) { this.sequence = sequence; this.parent = parent; this.parentControl = parentControl; Name = sequence.Name; MyItems = sequence.TransitionSteps; SubItemClicked += new SubItemEventHandler(listViewEx_SubItemClicked); SubItemEndEditing += new SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); vCount = 0; fmPumpCount = 0; regvCount = parent.RegulValves.Count; /// /// ListViewEx columns /// Columns.Add(Strings.Duration_s, 70 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.Message, 100 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.End_Condition, 80 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.Communication, 85 * parent.Dpi / PathsDlg.Dpi100pct); foreach (var vlv in parent.Valves) { if (vlv is BenchControl.GenericDevices.IPumpFM) { Columns.Add(vlv.Cfg.Name + " [%]", 45 * parent.Dpi / PathsDlg.Dpi100pct); fmPumpCount++; } } foreach (var rvlv in parent.RegulValves) { Columns.Add(rvlv.Cfg.Name + " [%]", 55 * parent.Dpi / PathsDlg.Dpi100pct); } foreach (var vlv in parent.Valves) { if (!(vlv is BenchControl.GenericDevices.IPumpFM)) { Columns.Add(vlv.Cfg.Name, 40 * parent.Dpi / PathsDlg.Dpi100pct); vCount++; } } /// /// Prepare valve combo-boxes /// editors = new Control[fixedCount + fmPumpCount + regvCount + vCount]; /// Duration editors[(int)Column.Duration] = new TextBox(); parent.Controls.Add(editors[(int)Column.Duration]); /// Message editors[(int)Column.Message] = new TextBox(); parent.Controls.Add(editors[(int)Column.Message]); /// End condition ComboBox condCombo = new ComboBox(); condCombo.Items.Add("---"); for (int i = 1; i < (int)Entities.StepCondition.Count; i++) { condCombo.Items.Add(((Entities.StepCondition)i).ToString()); } editors[(int)Column.Condition] = condCombo; parent.Controls.Add(editors[(int)Column.Condition]); /// Communication editors[(int)Column.Communication] = new TextBox(); parent.Controls.Add(editors[(int)Column.Communication]); /// FM controlled pumps for (int i = fixedCount; i < fixedCount + fmPumpCount; i++) { ComboBox cb = new ComboBox(); cb.Items.Add("---"); cb.Items.Add(Strings.dflt); cb.Items.Add("0"); cb.Items.Add("30"); cb.Items.Add("40"); cb.Items.Add("50"); cb.Items.Add("60"); cb.Items.Add("70"); cb.Items.Add("75"); cb.Items.Add("80"); cb.Items.Add("85"); cb.Items.Add("90"); cb.Items.Add("92"); cb.Items.Add("94"); cb.Items.Add("96"); cb.Items.Add("98"); cb.Items.Add("100"); editors[i] = cb; parent.Controls.Add(editors[i]); } /// Regulation valves for (int i = fixedCount + fmPumpCount; i < fixedCount + fmPumpCount + regvCount; i++) { ComboBox cb = new ComboBox(); cb.Items.Add("---"); cb.Items.Add("0"); cb.Items.Add("25"); cb.Items.Add("50"); cb.Items.Add("75"); cb.Items.Add("100"); editors[i] = cb; parent.Controls.Add(editors[i]); } /// Valves for (int i = fixedCount + fmPumpCount + regvCount; i < fixedCount + fmPumpCount + regvCount + vCount; i++) { ComboBox cb = new ComboBox(); cb.Items.Add("---"); cb.Items.Add(Strings.open); cb.Items.Add(Strings.close); editors[i] = cb; parent.Controls.Add(cb); } base.RedrawAll(); } void listViewEx_SubItemClicked(object sender, SubItemEventArgs e) { if (!Unlocked || e.SubItem >= editors.Length) return; StartEditing(editors[e.SubItem], e.Item, e.SubItem); } void listViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e) { if (e.SubItem == (int)Column.Duration) { int duration; if (!int.TryParse(e.DisplayText, out duration) || duration <= 0) { e.DisplayText = e.Item.Text; e.Cancel = true; } } else if (e.SubItem == (int)Column.Message) { if (e.DisplayText.Length >= 255) { // Message too long e.DisplayText = e.Item.SubItems[e.SubItem].Text; e.Cancel = true; } } else if (e.SubItem == (int)Column.Condition) { if (!((ComboBox)editors[(int)Column.Condition]).Items.Contains(e.DisplayText)) { e.DisplayText = e.Item.SubItems[e.SubItem].Text; e.Cancel = true; } } else if (e.SubItem == (int)Column.Communication) { if (e.DisplayText.Length >= 255) { // Communication string too long e.DisplayText = e.Item.SubItems[e.SubItem].Text; e.Cancel = true; } } else if ((e.SubItem >= fixedCount) && (e.SubItem < fixedCount + fmPumpCount)) { float pct; if (!e.DisplayText.Equals("---") && !e.DisplayText.Equals(Strings.dflt) && !(Utils.TryParseUFloat(e.DisplayText, out pct) && (pct >= 0) && (pct <= 100.0f))) { e.DisplayText = e.Item.SubItems[e.SubItem].Text; e.Cancel = true; } } else if ((e.SubItem >= fixedCount + fmPumpCount) && (e.SubItem < fixedCount + fmPumpCount + regvCount)) { float pct; if (!e.DisplayText.Equals("---") && !(Utils.TryParseUFloat(e.DisplayText, out pct) && (pct >= 0) && (pct <= 100.0f))) { e.DisplayText = e.Item.SubItems[e.SubItem].Text; e.Cancel = true; } } else if ((e.SubItem >= fixedCount + fmPumpCount + regvCount) && (e.SubItem < fixedCount + fmPumpCount + regvCount + vCount)) { if ((e.DisplayText != Strings.open) && (e.DisplayText != Strings.close) && (e.DisplayText != "---")) { e.DisplayText = e.Item.SubItems[e.SubItem].Text; e.Cancel = true; } } } public override void DrawOne(object myItem) { Entities.TransitionStep step = (Entities.TransitionStep)myItem; IList valvesOpen = new List(); if (step.ValvesOpen != null) { string[] vOpen = step.ValvesOpen.Split(new char[] { ';' }); foreach (var vName in vOpen) valvesOpen.Add((IValve)TbfComponents.FindComponent(vName, parent.TbfComponents)); } IList valvesClose = new List(); if (step.ValvesClose != null) { string[] vClose = step.ValvesClose.Split(new char[] { ';' }); foreach (var vName in vClose) valvesClose.Add((IValve)TbfComponents.FindComponent(vName, parent.TbfComponents)); } ListViewItem lvi = new ListViewItem(step.Duration.ToString()); lvi.SubItems.Add(string.IsNullOrEmpty(step.Message) ? string.Empty : step.Message); lvi.SubItems.Add((step.EndCondition == Entities.StepCondition.None) ? "---" : step.EndCondition.ToString()); lvi.SubItems.Add(string.IsNullOrEmpty(step.Communication) ? string.Empty : step.Communication); string[] fmPumpsStr = (step.PumpWithFMPcts != null) ? step.PumpWithFMPcts.Split(new char[] { ';' }) : new string[0]; for (int i = 0; i < fmPumpCount; i++) { lvi.SubItems.Add((i < fmPumpsStr.Length) ? fmPumpsStr[i] : "---"); } string[] rvPosStr = (step.RegulValvesPct != null) ? step.RegulValvesPct.Split(new char[] { ';' }) : new string[0]; for (int i = 0; i < regvCount; i++) { lvi.SubItems.Add((i < rvPosStr.Length) ? rvPosStr[i] : "---"); } foreach (var valve in parent.Valves) { if (!(valve is BenchControl.GenericDevices.IPumpFM)) { if (valvesOpen != null && valvesOpen.Contains(valve)) { lvi.SubItems.Add(Strings.open); } else if (valvesClose != null && valvesClose.Contains(valve)) { lvi.SubItems.Add(Strings.close); } else { lvi.SubItems.Add("---"); } } } lvi.Tag = step; Items.Add(lvi); } public override void UpdateOne(ListViewItem lvi, object myItem) { Entities.TransitionStep step = (Entities.TransitionStep)myItem; /// /// Duration /// int duration; if (int.TryParse(lvi.Text, out duration) && duration > 0) step.Duration = duration; else lvi.Text = step.Duration.ToString(); /// /// Message /// if (lvi.SubItems[(int)Column.Message].Text.Length == 0) step.Message = string.Empty; else step.Message = lvi.SubItems[(int)Column.Message].Text; /// /// Condition /// step.EndCondition = Entities.StepCondition.None; /// When item text is "---" or a wrong value for (int cond = 1; cond < (int)Entities.StepCondition.Count; cond++) { if (lvi.SubItems[(int)Column.Condition].Text.Equals(((Entities.StepCondition)cond).ToString())) { step.EndCondition = (Entities.StepCondition)cond; break; } } /// /// Communication string /// if (lvi.SubItems[(int)Column.Communication].Text.Length == 0) step.Communication = string.Empty; else step.Communication = lvi.SubItems[(int)Column.Communication].Text; /// Required for pumps with FM and valves string valvesOpen = string.Empty; string valvesClose = string.Empty; /// /// Pumps with FM control /// string fmPumpsPcts = string.Empty; int i = 0; foreach (var valve in parent.Valves) { if (valve is BenchControl.GenericDevices.IPumpFM) { string lviSubitText = lvi.SubItems[fixedCount + i++].Text; if (fmPumpsPcts.Length > 0) fmPumpsPcts += ";"; float fdummy; if (lviSubitText.Equals("---")) { fmPumpsPcts += lviSubitText; } else if (lviSubitText.Equals(Strings.dflt)) { fmPumpsPcts += lviSubitText; if (valvesOpen != string.Empty) valvesOpen += ";"; valvesOpen += valve.Cfg.Name; } else if (Utils.TryParseUFloat(lviSubitText, out fdummy) && (fdummy >= 0) && (fdummy <= 100.0f)) { fmPumpsPcts += lviSubitText; if (fdummy > 0) { if (valvesOpen != string.Empty) valvesOpen += ";"; valvesOpen += valve.Cfg.Name; } else { if (valvesClose != string.Empty) valvesClose += ";"; valvesClose += valve.Cfg.Name; } } } } step.PumpWithFMPcts = fmPumpsPcts; /// /// Regulation valves /// string regulValvesPct = string.Empty; for (int k = fixedCount + fmPumpCount; k < fixedCount + fmPumpCount + regvCount; k++) { if (regulValvesPct.Length > 0) regulValvesPct += ";"; float fdummy; if (lvi.SubItems[k].Text.Equals("---") || (Utils.TryParseUFloat(lvi.SubItems[k].Text, out fdummy) && (fdummy >= 0) && (fdummy <= 100.0f))) { regulValvesPct += lvi.SubItems[k].Text; } } step.RegulValvesPct = regulValvesPct; /// /// Valves /// for (int j = 0, k = 0; j < vCount; j++) { if (!(parent.Valves[j] is BenchControl.GenericDevices.IPumpFM)) { string lviSubitText = lvi.SubItems[fixedCount + fmPumpCount + regvCount + k++].Text; if (lviSubitText.Equals(Strings.open)) { if (valvesOpen != string.Empty) valvesOpen += ";"; valvesOpen += parent.Valves[j].Cfg.Name; } if (lviSubitText.Equals(Strings.close)) { if (valvesClose != string.Empty) valvesClose += ";"; valvesClose += parent.Valves[j].Cfg.Name; } } } step.ValvesOpen = valvesOpen; step.ValvesClose = valvesClose; } public void AddOne() { base.AddOne(new Entities.TransitionStep(MyItems.Count, sequence)); } public new void RemoveSelected() { bool lastItemRemoved = base.RemoveSelected(); if (lastItemRemoved && parent != null) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); } } } }