/// /// Copyright (c) 2013-2017 Sensus Metering Systems /// using System; 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 PathsMetersCtrl : BaseWithListViewEx, ITabWithListViewEx { static readonly ILog log = LogManager.GetLogger(typeof(PathsMetersCtrl)); /// /// Fixed ListViewEx columns /// enum Column { Name, FixedColumnsCount, } readonly int fixedColumnsCount = (int)Column.FixedColumnsCount; PathsDlg parent; Control parentControl; Control[] editors; public PathsMetersCtrl() : base() { } public void Initialize(PathsDlg parent, Control parentControl) { this.parent = parent; this.parentControl = parentControl; /// Load the paths MyItems = parent.Session.QueryOver() .OrderBy(x => x.ItemNr).Asc .List(); foreach (var path in MyItems) path.OriName = path.Name; SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); IList readers = new List(); foreach (var cmpnt in parent.TbfComponents) { if (cmpnt is IRegisterReader) readers.Add(cmpnt as IRegisterReader); } /// ListViewEx columns TBF.LocalSettings ls = Program.LocalSettings; Columns.Add(Strings.Name, (ls.MetersColumnCount > 0) ? ls.MetersColumnWidths[0] : 60 * parent.Dpi / PathsDlg.Dpi100pct); int clmn = (int)Column.FixedColumnsCount; for (int i = 0; i < Config.Data.WMsCount; i++) { Columns.Add(Strings.Sensor_ + (i + 1).ToString(), (ls.MetersColumnCount > clmn) ? ls.MetersColumnWidths[clmn] : 50 * parent.Dpi / PathsDlg.Dpi100pct); clmn++; } /// Editors editors = new Control[fixedColumnsCount + Config.Data.WMsCount]; /// editors[(int)Column.Name] = new TextBox(); /// Name /// Prepare valve combo-boxes (max. 64 valves) for (int i = 0; i < Config.Data.WMsCount; i++) { ComboBox cb = new ComboBox(); foreach (var rr in readers) cb.Items.Add(rr.Cfg.Name); editors[fixedColumnsCount + i] = cb; } /// for (int i = 0; i < editors.Length; i++) { editors[i].Visible = false; parent.Controls.Add(editors[i]); } base.RedrawAll(); } void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) { if (!Unlocked || e.SubItem >= editors.Length) return; StartEditing(editors[e.SubItem], e.Item, e.SubItem); } void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) { if (!Unlocked || e.SubItem >= editors.Length) 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 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; } } } } void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) { } public override void DrawOne(object myItem) { Config.Entities.MetersPath entity =(Config.Entities.MetersPath)myItem; BenchControl.MetersPath path = new BenchControl.MetersPath(entity, parent.TbfComponents); ListViewItem lvi = new ListViewItem(entity.Name); for (int i = 0; i < Config.Data.WMsCount; i++) { if (path.RegisterReaders != null && path.RegisterReaders[i] != null) { lvi.SubItems.Add(path.RegisterReaders[i].Cfg.Name); } else { lvi.SubItems.Add("---"); } } lvi.Tag = entity; Items.Add(lvi); } public override void UpdateOne(ListViewItem lvi, object myItem) { Config.Entities.MetersPath entity = (Config.Entities.MetersPath)myItem; entity.Name = lvi.Text; for (int j = 0; j < Config.Data.WMsCount; j++) { entity.SetSensor(j, lvi.SubItems[fixedColumnsCount + j].Text); } } public void AddOne() { /// Find an unused test name string newName; for (int nameId = 1; true; nameId++) { newName = Strings.New_sensors_path_name + nameId.ToString(); bool notUsed = true; foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false; if (notUsed) break; } Config.Entities.MetersPath entity = new Config.Entities.MetersPath(newName, MyItems.Count); base.AddOne(entity); } public new void RemoveSelected() { bool lastOneRemoved = base.RemoveSelected(); if (lastOneRemoved && parent != null) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); } } public string GetWarningsBeforeSaving(ref Dictionary renmInfo) { base.OkBtnClicked(); /// = UpdateAll() string warnings = string.Empty; foreach (var entity in ToBeRemovedItems) { if (!string.IsNullOrEmpty(entity.OriName)) { int occurances = 0; foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.MetersPath) && tst.MetersPath.Equals(entity.OriName)) occurances++; if (occurances > 0) { warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_removed_3, Strings.MetersTabPageTitle, entity.Name, occurances, Environment.NewLine); renmInfo.Add(entity.OriName, string.Empty); } } } foreach (var entity in MyItems) { if (!string.IsNullOrEmpty(entity.OriName) && entity.OriName != entity.Name) { int occurances = 0; foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.MetersPath) && tst.MetersPath.Equals(entity.OriName)) occurances++; if (occurances > 0) { warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_renamed_to_3_4, Strings.MetersTabPageTitle, entity.OriName, occurances, entity.Name, Environment.NewLine); renmInfo.Add(entity.OriName, entity.Name); } } } return warnings; } public void UpdateRelatedItems(Dictionary renameInfo) { foreach (var ri in renameInfo) { var tests = parent.Session.QueryOver() .Where(x => x.MetersPath == ri.Key) .List(); foreach (var t in tests) { t.MetersPath = ri.Value; parent.Session.Update(t); } } } /// /// Update the entities and save them to the database /// public new void OkBtnClicked() { base.OkBtnClicked(); /// Update the database foreach (var entity in ToBeRemovedItems) { parent.Session.Delete(entity); } foreach (var entity in MyItems) { parent.Session.SaveOrUpdate(entity); } /// Update the column widths Program.LocalSettings.MetersColumnWidths = new int[Columns.Count]; for (int i = 0; i < Columns.Count; i++) { Program.LocalSettings.MetersColumnWidths[i] = Columns[i].Width; } Program.LocalSettings.Save(); } } }