/// /// Copyright (c) 2013-2015 Sensus Metering Systems /// using System; using System.Collections.Generic; using System.Globalization; using System.Windows.Forms; using NHibernate; using log4net; using Config.Entities; using TBF.BenchControl; using TBF.BenchControl.GenericDevices; using TBF.Resources; namespace TBF.UiControls { public class ProceduresCtrl : BaseWithListViewEx, ITabWithListViewEx { static readonly ILog log = LogManager.GetLogger(typeof(ProceduresCtrl)); /// /// ListViewEx columns /// enum Column { Name, Description, ColumnsCount, } readonly int columnsCount = (int)Column.ColumnsCount; ProceduresDlg parent; Control parentControl; Control[] editors; ISession session; public ProceduresCtrl() : base() { Name = "ProceduresCtrl"; } public void Initialize(ProceduresDlg parent, Control parentControl) { this.parent = parent; this.parentControl = parentControl; SubItemClicked += new SubItemEventHandler(listViewEx_SubItemClicked); SubItemEndEditing += new SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); /// ListViewEx columns TBF.LocalSettings ls = Program.LocalSettings; Columns.Add(Strings.Name, (ls.ProceduresColumnCount > 0) ? ls.ProceduresColumnWidths[0] : (100 * parent.Dpi / PathsDlg.Dpi100pct)); Columns.Add(Strings.DescriptionColHdr, (ls.ProceduresColumnCount > 1) ? ls.ProceduresColumnWidths[1] : (300 * parent.Dpi / PathsDlg.Dpi100pct)); editors = new Control[columnsCount]; /// editors[(int)Column.Name] = new TextBox(); /// Name editors[(int)Column.Description] = new TextBox(); /// Description /// for (int i = 0; i < editors.Length; i++) parent.Controls.Add(editors[i]); ReloadAndRedrawAll(); } void ReloadAndRedrawAll() { /// Load the procedures session = Config.FluentCommon.CreateSession(Config.Entities.DBKind.Config); MyItems = session.CreateQuery("FROM Procedure WHERE ProcedureState = 'Active' ORDER BY ItemNr") .List(); base.RedrawAll(); } void listViewEx_SubItemClicked(object sender, SubItemEventArgs e) { } void listViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e) { } public override void DrawOne(object myItem) { Procedure entity = (Procedure)myItem; ListViewItem lvi = new ListViewItem(entity.Name); lvi.SubItems.Add(entity.Description); lvi.Tag = entity; Items.Add(lvi); } public override void UpdateOne(ListViewItem lvi, object myItem) { Procedure entity = (Procedure)myItem; entity.Name = lvi.Text; entity.Description = lvi.SubItems[(int)Column.Description].Text; } /// /// Update the entities and save them to the database /// public new void OkBtnClicked() { base.OkBtnClicked(); foreach (var entity in ToBeRemovedItems) { Config.FluentCommon.DeleteFromDb(session, entity); } int itemNr = 0; foreach (var entity in MyItems) { (entity as Procedure).ItemNr = itemNr++; Config.FluentCommon.SaveToDb(session, entity); } /// Update the column widths Program.LocalSettings.ProceduresColumnWidths = new int[Columns.Count]; for (int i = 0; i < Columns.Count; i++) { Program.LocalSettings.ProceduresColumnWidths[i] = Columns[i].Width; } Program.LocalSettings.Save(); Program.MainWnd.ReloadProcedures(); } public void AddOne() { /// Find an unused procedure name string newName; for (int nameId = 1; true; nameId++) { newName = Strings.New_procedure_name + nameId.ToString(); bool notUsed = true; foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false; if (notUsed) break; } Procedure newProcedure = new Procedure(newName, MyItems.Count); newProcedure.ProcedureState = ProcedureState.Active; newProcedure.Revision = 1; newProcedure.PredecessorId = 0; newProcedure.ObtainedByCopy = false; newProcedure.CreationUser = User.CurrentUser.Name; newProcedure.CreationTime = DateTime.Now; if (new ProcedureDlg(newProcedure).ShowDialog() == DialogResult.OK) { /// TODO: Make name uniqueness test parent.Unlock(); using(var transaction = session.BeginTransaction()) { try { newProcedure.LastChgUser = User.CurrentUser.Name; newProcedure.LastChgTime = DateTime.Now; base.AddOne(newProcedure); session.SaveOrUpdate(newProcedure); transaction.Commit(); MessageBox.Show(string.Format(Strings.Procedure_0_added, newProcedure.Name), Strings.Confirmation, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception exc) { transaction.Rollback(); } } session.Flush(); } } public new void RemoveSelected() { bool lastOneRemoved = base.RemoveSelected(); if (lastOneRemoved && parent != null) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); } } public void editButton_Click(object sender, EventArgs e) { if (SelectedItems.Count != 1) return; Procedure originalProcedure = SelectedItems[0].Tag as Procedure; Procedure modifiedProcedure = originalProcedure.Clone(); modifiedProcedure.ItemNr = originalProcedure.ItemNr; modifiedProcedure.Revision = originalProcedure.Revision + 1; modifiedProcedure.ObtainedByCopy = false; if (new ProcedureDlg(modifiedProcedure).ShowDialog() == DialogResult.OK) { /// TODO: Make name uniqueness test parent.Unlock(); using (var transaction = session.BeginTransaction()) { try { originalProcedure.ProcedureState = ProcedureState.History; modifiedProcedure.LastChgUser = User.CurrentUser.Name; modifiedProcedure.LastChgTime = DateTime.Now; session.SaveOrUpdate(originalProcedure); session.SaveOrUpdate(modifiedProcedure); transaction.Commit(); SelectedItems[0].Tag = modifiedProcedure; MessageBox.Show(string.Format(Strings.Procedure_0_modified, modifiedProcedure.Name), Strings.Confirmation, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception exc) { transaction.Rollback(); } } session.Flush(); } ReloadAndRedrawAll(); } public void copyButton_Click(object sender, EventArgs e) { if (SelectedItems.Count != 1) return; Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag; /// Make a copy of the selected procedure Procedure newProcedure = selectedProcedure.Clone(); newProcedure.Name = selectedProcedure.Name + Strings.New_name_copy; newProcedure.ItemNr = MyItems.Count; newProcedure.ProcedureState = ProcedureState.Active; newProcedure.Revision = 1; newProcedure.PredecessorId = selectedProcedure.Id; newProcedure.ObtainedByCopy = true; newProcedure.CreationUser = User.CurrentUser.Name; newProcedure.CreationTime = DateTime.Now; if ((new ProcedureDlg(newProcedure)).ShowDialog() == DialogResult.OK) { /// TODO: Make name uniqueness test parent.Unlock(); using (var transaction = session.BeginTransaction()) { newProcedure.LastChgUser = User.CurrentUser.Name; newProcedure.LastChgTime = DateTime.Now; base.AddOne(newProcedure); session.SaveOrUpdate(newProcedure); transaction.Commit(); MessageBox.Show(string.Format(Strings.Procedure_0_added, newProcedure.Name), Strings.Confirmation, MessageBoxButtons.OK, MessageBoxIcon.Information); } base.AddOne(newProcedure); } } } }