using System.Collections.Generic; using System.Globalization; using System.Windows.Forms; using log4net; using TBF.BenchControl; using TBF.BenchControl.GenericDevices; using TBF.Resources; namespace TBF.UiControls { public class PathsOutputCtrl : BaseWithListViewEx, ITabWithListViewEx { static readonly ILog log = LogManager.GetLogger(typeof(PathsOutputCtrl)); /// /// Fixed ListViewEx columns /// enum Column { Name, Qfrom, Qto, RV, Ref, Div, Tdiv, Scale, EmptV, FixedColumnsCount, } readonly int fixedColumnsCount = (int)Column.FixedColumnsCount; PathsDlg parent; Control parentControl; Control[] editors; public PathsOutputCtrl() : base() { FixedRowsCount = 1; } public void Initialize(PathsDlg parent, Control parentControl) { this.parent = parent; this.parentControl = parentControl; /// Load the paths MyItems = parent.Session .CreateQuery("FROM OutputPath ORDER BY ItemNr") .List(); SubItemClicked += new SubItemEventHandler(listViewEx_SubItemClicked); SubItemEndEditing += new SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); /// ListViewEx columns Columns.Add(Strings.Name, 60 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.Q_from_m3h, 50 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.Q_to_m3h, 50 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.Reg_valve, 80 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.Reference, 85 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.Diverter, 60 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.T_div, 70 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.Balance, 50 * parent.Dpi / PathsDlg.Dpi100pct); Columns.Add(Strings.Emptying_valve, 80 * parent.Dpi / PathsDlg.Dpi100pct); foreach (var vlv in parent.Valves) Columns.Add(vlv.Cfg.Name, 50 * parent.Dpi / PathsDlg.Dpi100pct); /// Prepare fixed columns combo boxes ComboBox regulValveComboBox = new ComboBox(); ComboBox flowMeterComboBox = new ComboBox(); ComboBox diverterComboBox = new ComboBox(); ComboBox balanceComboBox = new ComboBox(); ComboBox tempMeterDivComboBox = new ComboBox(); ComboBox emptyValveComboBox = new ComboBox(); foreach (var cmpnt in parent.TbfComponents) { if (cmpnt is IRegulValve) regulValveComboBox.Items.Add(cmpnt.Cfg.Name); if (cmpnt is IFlowMeter) flowMeterComboBox.Items.Add(cmpnt.Cfg.Name); if (cmpnt is IDiverter) diverterComboBox.Items.Add(cmpnt.Cfg.Name); if (cmpnt is IBalance) balanceComboBox.Items.Add(cmpnt.Cfg.Name); if (cmpnt is ITempMeter) tempMeterDivComboBox.Items.Add(cmpnt.Cfg.Name); if (cmpnt is IValve && (cmpnt as IValve).CoupledTo == null) emptyValveComboBox.Items.Add(cmpnt.Cfg.Name); } editors = new Control[fixedColumnsCount + 64]; /// editors[(int)Column.Name] = new TextBox(); /// Name editors[(int)Column.Qfrom] = new TextBox(); /// Q_from editors[(int)Column.Qto] = new TextBox(); /// Q_to editors[(int)Column.RV] = regulValveComboBox; editors[(int)Column.Ref] = flowMeterComboBox; editors[(int)Column.Div] = diverterComboBox; editors[(int)Column.Tdiv] = tempMeterDivComboBox; editors[(int)Column.Scale] = balanceComboBox; editors[(int)Column.EmptV] = emptyValveComboBox; /// Prepare valve combo-boxes (max. 64 valves) for (int i = 0; i < 64; i++) { ComboBox cb = new ComboBox(); cb.Items.Add("---"); cb.Items.Add(Strings.open); cb.Items.Add(Strings.close); editors[fixedColumnsCount + i] = cb; } /// for (int i = 0; i < editors.Length; i++) parent.Controls.Add(editors[i]); base.RedrawAll(); } void listViewEx_SubItemClicked(object sender, SubItemEventArgs e) { if (!Unlocked || e.SubItem >= editors.Length) return; if ((e.Item.Tag is Entities.IHasItemNr) && ((e.Item.Tag as Entities.IHasItemNr).ItemNr < FixedRowsCount) && (e.SubItem < fixedColumnsCount)) { return; } StartEditing(editors[e.SubItem], e.Item, e.SubItem); } void listViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e) { } public override void DrawOne(object myItem) { Entities.OutputPath entity =(Entities.OutputPath)myItem; BenchControl.OutputPath path = new BenchControl.OutputPath(entity, parent.TbfComponents); ListViewItem lvi = new ListViewItem(entity.Name); lvi.SubItems.Add(path.Qfrom.ToString()); lvi.SubItems.Add(path.Qto.ToString()); lvi.SubItems.Add(path.RegulValve != null ? path.RegulValve.Cfg.Name : "---"); lvi.SubItems.Add(path.FlowMeter != null ? path.FlowMeter.Cfg.Name : "---"); lvi.SubItems.Add(path.Diverter != null ? path.Diverter.Cfg.Name : "---"); lvi.SubItems.Add(path.TempDiv != null ? path.TempDiv.Cfg.Name : "---"); lvi.SubItems.Add(path.Balance != null ? path.Balance.Cfg.Name : "---"); lvi.SubItems.Add(path.EmptyTankValve != null ? path.EmptyTankValve.Cfg.Name : "---"); foreach (var valve in parent.Valves) { if (path.ValvesOpen != null && path.ValvesOpen.Contains(valve)) { lvi.SubItems.Add(Strings.open); } else if (path.ValvesClose != null && path.ValvesClose.Contains(valve)) { lvi.SubItems.Add(Strings.close); } else { lvi.SubItems.Add("---"); } } lvi.Tag = entity; Items.Add(lvi); } public override void UpdateOne(ListViewItem lvi, object myItem) { Entities.OutputPath entity = (Entities.OutputPath)myItem; entity.Name = lvi.Text; float Qfrom; bool allOk = Utils.TryParseUFloat(lvi.SubItems[(int)Column.Qfrom].Text, out Qfrom); entity.Qfrom = Qfrom; float Qto; allOk &= Utils.TryParseUFloat(lvi.SubItems[(int)Column.Qto].Text, out Qto); entity.Qto = Qto; entity.RegulValve = lvi.SubItems[(int)Column.RV].Text; entity.FlowMeter = lvi.SubItems[(int)Column.Ref].Text; entity.Diverter = lvi.SubItems[(int)Column.Div].Text; entity.TempDiv = lvi.SubItems[(int)Column.Tdiv].Text; entity.Balance = lvi.SubItems[(int)Column.Scale].Text; entity.EmptyTankValve = lvi.SubItems[(int)Column.EmptV].Text; string valvesOpen = string.Empty; string valvesClose = string.Empty; for (int j = 0; j < parent.Valves.Count; j++) { string text = lvi.SubItems[fixedColumnsCount + j].Text; if (text.Equals(Strings.open)) { if (valvesOpen != string.Empty) valvesOpen += ";"; valvesOpen += parent.Valves[j].Cfg.Name; } if (text.Equals(Strings.close)) { if (valvesClose != string.Empty) valvesClose += ";"; valvesClose += parent.Valves[j].Cfg.Name; } } entity.ValvesOpen = valvesOpen; entity.ValvesClose = valvesClose; } /// /// Update the entities and save them to the database /// public new void OkBtnClicked() { base.OkBtnClicked(); foreach (var entity in ToBeRemovedItems) { FluentCommon.DeleteFromDb(parent.Session, entity); } foreach (var entity in MyItems) { FluentCommon.SaveToDb(parent.Session, entity); } } public void AddOne() { Entities.OutputPath entity; if (MyItems.Count < FixedRowsCount) { entity = new Entities.OutputPath(new BenchControl.OutputPath(Strings._none_, MyItems.Count)); } else { /// Find an unused test name string newName; for (int nameId = 1; true; nameId++) { newName = Strings.New_output_path_name + nameId.ToString(); bool notUsed = true; foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false; if (notUsed) break; } entity = new Entities.OutputPath(new BenchControl.OutputPath(newName, MyItems.Count)); } base.AddOne(entity); } public new void RemoveSelected() { bool lastOneRemoved = base.RemoveSelected(); if (lastOneRemoved && parent != null) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); } } } }