From 51c24f8c4c02d352e0279514ba793fe9a8ad6773 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Thu, 23 Jan 2020 10:04:25 +0100 Subject: [PATCH] Filters in ProceduresDlg : ProceduresCtrl with SplitContainer: 1 UI for filters and 2 ListViewEx, BaseWithListViewEx is not used, ver. 2.25.1404 --- Config/Entities/Procedure.cs | 15 + TBF/Properties/AssemblyInfo.cs | 4 +- TBF/Resources/Strings.Designer.cs | 9 + TBF/Resources/Strings.resx | 3 + TBF/TBF.csproj | 8 +- TBF/UI/Procedures/ProceduresCtrl.Designer.cs | 194 ++++++ TBF/UI/Procedures/ProceduresCtrl.cs | 608 ++++++++++++++----- TBF/UI/Procedures/ProceduresCtrl.resx | 120 ++++ TBF/UI/Procedures/ProceduresDlg.Designer.cs | 12 +- TBF/UI/Procedures/ProceduresDlg.cs | 54 +- 10 files changed, 843 insertions(+), 184 deletions(-) create mode 100644 TBF/UI/Procedures/ProceduresCtrl.Designer.cs create mode 100644 TBF/UI/Procedures/ProceduresCtrl.resx diff --git a/Config/Entities/Procedure.cs b/Config/Entities/Procedure.cs index a09c60c3e..f3e602126 100644 --- a/Config/Entities/Procedure.cs +++ b/Config/Entities/Procedure.cs @@ -44,6 +44,11 @@ namespace Config.Entities public virtual string AltProcName { get; set; } /// Alternative procedure name (null or string.Empty = no alt. procedure) public virtual int AltProcPeriod { get; set; } /// Period of alternative procedures (0 = no alt. procedure) + public virtual float DN { get; set; } /// Not mapped to DB, valid in ProceduresCtrl for procedure filtering only + public virtual float Qn { get; set; } /// - ' ' - + public virtual string MClass { get; set; } /// - ' ' - + public virtual string Producer { get; set; } /// - ' ' - + public virtual IList MoreParams { get; set; } public virtual IList Tests { get; set; } @@ -65,6 +70,11 @@ namespace Config.Entities Watermeters = string.Empty; Description = string.Empty; LongDescription = string.Empty; + + DN = 0; + Qn = 0; + MClass = string.Empty; + Producer = string.Empty; } public Procedure(string name, int itemNr) @@ -103,6 +113,11 @@ namespace Config.Entities result.AltProcName = AltProcName; result.AltProcPeriod = AltProcPeriod; + result.DN = DN; + result.Qn = Qn; + result.MClass = MClass; + result.Producer = Producer; + foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone(result)); } foreach (var test in Tests) { result.Tests.Add(test.Clone()); } diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index 88c9c7ad8..7482708a2 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.25.1403.0")] -[assembly: AssemblyFileVersion("2.25.1403.0")] +[assembly: AssemblyVersion("2.25.1404.0")] +[assembly: AssemblyFileVersion("2.25.1404.0")] diff --git a/TBF/Resources/Strings.Designer.cs b/TBF/Resources/Strings.Designer.cs index 34941bc48..9d30c7fdd 100644 --- a/TBF/Resources/Strings.Designer.cs +++ b/TBF/Resources/Strings.Designer.cs @@ -321,6 +321,15 @@ namespace TBF.Resources { } } + /// + /// Looks up a localized string similar to any. + /// + internal static string any { + get { + return ResourceManager.GetString("any", resourceCulture); + } + } + /// /// Looks up a localized string similar to Approval. /// diff --git a/TBF/Resources/Strings.resx b/TBF/Resources/Strings.resx index 3881c104c..4d0af4a9b 100644 --- a/TBF/Resources/Strings.resx +++ b/TBF/Resources/Strings.resx @@ -2134,4 +2134,7 @@ Empty the tank + + any + \ No newline at end of file diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index b52662beb..7d02314fa 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -2244,7 +2244,10 @@ ProcedureParamsCtrl.cs - Component + UserControl + + + ProceduresCtrl.cs Form @@ -3243,6 +3246,9 @@ ProcedureParamsCtrl.cs + + ProceduresCtrl.cs + ProceduresDlg.cs diff --git a/TBF/UI/Procedures/ProceduresCtrl.Designer.cs b/TBF/UI/Procedures/ProceduresCtrl.Designer.cs new file mode 100644 index 000000000..fb4597906 --- /dev/null +++ b/TBF/UI/Procedures/ProceduresCtrl.Designer.cs @@ -0,0 +1,194 @@ +namespace TBF.UI.Procedures +{ + partial class ProceduresCtrl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.filtersSplitContainer = new System.Windows.Forms.SplitContainer(); + this.producerLabel = new System.Windows.Forms.Label(); + this.mclassLabel = new System.Windows.Forms.Label(); + this.q3Label = new System.Windows.Forms.Label(); + this.dnLabel = new System.Windows.Forms.Label(); + this.producerComboBox = new System.Windows.Forms.ComboBox(); + this.mclassComboBox = new System.Windows.Forms.ComboBox(); + this.q3ComboBox = new System.Windows.Forms.ComboBox(); + this.dnComboBox = new System.Windows.Forms.ComboBox(); + this.listViewEx = new Results.Forms.ListViewEx(); + ((System.ComponentModel.ISupportInitialize)(this.filtersSplitContainer)).BeginInit(); + this.filtersSplitContainer.Panel1.SuspendLayout(); + this.filtersSplitContainer.Panel2.SuspendLayout(); + this.filtersSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // filtersSplitContainer + // + this.filtersSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.filtersSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.filtersSplitContainer.Location = new System.Drawing.Point(0, 0); + this.filtersSplitContainer.Name = "filtersSplitContainer"; + this.filtersSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // filtersSplitContainer.Panel1 + // + this.filtersSplitContainer.Panel1.Controls.Add(this.producerLabel); + this.filtersSplitContainer.Panel1.Controls.Add(this.mclassLabel); + this.filtersSplitContainer.Panel1.Controls.Add(this.q3Label); + this.filtersSplitContainer.Panel1.Controls.Add(this.dnLabel); + this.filtersSplitContainer.Panel1.Controls.Add(this.producerComboBox); + this.filtersSplitContainer.Panel1.Controls.Add(this.mclassComboBox); + this.filtersSplitContainer.Panel1.Controls.Add(this.q3ComboBox); + this.filtersSplitContainer.Panel1.Controls.Add(this.dnComboBox); + // + // filtersSplitContainer.Panel2 + // + this.filtersSplitContainer.Panel2.Controls.Add(this.listViewEx); + this.filtersSplitContainer.Size = new System.Drawing.Size(600, 400); + this.filtersSplitContainer.SplitterDistance = 40; + this.filtersSplitContainer.TabIndex = 2; + // + // producerLabel + // + this.producerLabel.AutoSize = true; + this.producerLabel.Location = new System.Drawing.Point(381, 15); + this.producerLabel.Name = "producerLabel"; + this.producerLabel.Size = new System.Drawing.Size(50, 13); + this.producerLabel.TabIndex = 7; + this.producerLabel.Text = "Producer"; + // + // mclassLabel + // + this.mclassLabel.AutoSize = true; + this.mclassLabel.Location = new System.Drawing.Point(257, 15); + this.mclassLabel.Name = "mclassLabel"; + this.mclassLabel.Size = new System.Drawing.Size(32, 13); + this.mclassLabel.TabIndex = 6; + this.mclassLabel.Text = "Class"; + // + // q3Label + // + this.q3Label.AutoSize = true; + this.q3Label.Location = new System.Drawing.Point(125, 15); + this.q3Label.Name = "q3Label"; + this.q3Label.Size = new System.Drawing.Size(40, 13); + this.q3Label.TabIndex = 5; + this.q3Label.Text = "Q3/Qn"; + // + // dnLabel + // + this.dnLabel.AutoSize = true; + this.dnLabel.Location = new System.Drawing.Point(12, 15); + this.dnLabel.Name = "dnLabel"; + this.dnLabel.Size = new System.Drawing.Size(23, 13); + this.dnLabel.TabIndex = 4; + this.dnLabel.Text = "DN"; + // + // producerComboBox + // + this.producerComboBox.FormattingEnabled = true; + this.producerComboBox.Location = new System.Drawing.Point(437, 12); + this.producerComboBox.Name = "producerComboBox"; + this.producerComboBox.Size = new System.Drawing.Size(133, 21); + this.producerComboBox.TabIndex = 3; + this.producerComboBox.SelectedIndexChanged += new System.EventHandler(this.producerComboBox_SelectedIndexChanged); + this.producerComboBox.TextChanged += new System.EventHandler(this.producerComboBox_TextChanged); + // + // mclassComboBox + // + this.mclassComboBox.FormattingEnabled = true; + this.mclassComboBox.Location = new System.Drawing.Point(295, 12); + this.mclassComboBox.Name = "mclassComboBox"; + this.mclassComboBox.Size = new System.Drawing.Size(72, 21); + this.mclassComboBox.TabIndex = 2; + this.mclassComboBox.SelectedIndexChanged += new System.EventHandler(this.mclassComboBox_SelectedIndexChanged); + this.mclassComboBox.TextChanged += new System.EventHandler(this.mclassComboBox_TextChanged); + // + // q3ComboBox + // + this.q3ComboBox.FormattingEnabled = true; + this.q3ComboBox.Location = new System.Drawing.Point(171, 12); + this.q3ComboBox.Name = "q3ComboBox"; + this.q3ComboBox.Size = new System.Drawing.Size(72, 21); + this.q3ComboBox.TabIndex = 1; + this.q3ComboBox.SelectedIndexChanged += new System.EventHandler(this.q3ComboBox_SelectedIndexChanged); + this.q3ComboBox.TextChanged += new System.EventHandler(this.q3ComboBox_TextChanged); + // + // dnComboBox + // + this.dnComboBox.FormattingEnabled = true; + this.dnComboBox.Location = new System.Drawing.Point(41, 12); + this.dnComboBox.Name = "dnComboBox"; + this.dnComboBox.Size = new System.Drawing.Size(72, 21); + this.dnComboBox.TabIndex = 0; + this.dnComboBox.SelectedIndexChanged += new System.EventHandler(this.dnComboBox_SelectedIndexChanged); + this.dnComboBox.TextChanged += new System.EventHandler(this.dnComboBox_TextChanged); + // + // listViewEx + // + this.listViewEx.AllowColumnReorder = true; + this.listViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + this.listViewEx.DoubleClickActivation = false; + this.listViewEx.FullRowSelect = true; + this.listViewEx.GridLines = true; + this.listViewEx.Location = new System.Drawing.Point(0, 0); + this.listViewEx.Name = "listViewEx"; + this.listViewEx.Size = new System.Drawing.Size(600, 356); + this.listViewEx.TabIndex = 0; + this.listViewEx.UseCompatibleStateImageBehavior = false; + this.listViewEx.View = System.Windows.Forms.View.Details; + this.listViewEx.SelectedIndexChanged += new System.EventHandler(this.listViewEx_SelectedIndexChanged); + this.listViewEx.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listViewEx_MouseDoubleClick); + // + // ProceduresCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.filtersSplitContainer); + this.Name = "ProceduresCtrl"; + this.Size = new System.Drawing.Size(600, 400); + this.filtersSplitContainer.Panel1.ResumeLayout(false); + this.filtersSplitContainer.Panel1.PerformLayout(); + this.filtersSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.filtersSplitContainer)).EndInit(); + this.filtersSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer filtersSplitContainer; + private System.Windows.Forms.Label producerLabel; + private System.Windows.Forms.Label mclassLabel; + private System.Windows.Forms.Label q3Label; + private System.Windows.Forms.Label dnLabel; + private System.Windows.Forms.ComboBox producerComboBox; + private System.Windows.Forms.ComboBox mclassComboBox; + private System.Windows.Forms.ComboBox q3ComboBox; + private System.Windows.Forms.ComboBox dnComboBox; + private Results.Forms.ListViewEx listViewEx; + } +} diff --git a/TBF/UI/Procedures/ProceduresCtrl.cs b/TBF/UI/Procedures/ProceduresCtrl.cs index fabf860ad..460bcdc7c 100644 --- a/TBF/UI/Procedures/ProceduresCtrl.cs +++ b/TBF/UI/Procedures/ProceduresCtrl.cs @@ -1,27 +1,53 @@ /// -/// Copyright (c) 2013-2019 Sensus Slovensko a.s. +/// Copyright (c) 2020 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; -using System.Globalization; using System.IO; using System.Text; using System.Windows.Forms; using NHibernate; using log4net; using Config.Entities; -using Results.Forms; -using TBF.BenchControl; using TBF.BenchControl.GenericDevices; using TBF.Resources; using TBF.UI.Shared; namespace TBF.UI.Procedures { - public class ProceduresCtrl : BaseWithListViewEx, ITabWithListViewEx - { + public partial class ProceduresCtrl : UserControl + { static readonly ILog log = LogManager.GetLogger(typeof(ProceduresCtrl)); + /// + /// List of all active procedures + /// + public IList AllProcedures; + + /// + /// List of procedures satisfying filter criteria + /// + public IList Procedures; + + /// + /// List of removed items that have to be removed from the database + /// when completed with OK. + /// + public IList ToBeRemovedProcedures; + + /// + /// true = editing was unlocked + /// + public bool Unlocked { get { return unlocked; } } /// read only + bool unlocked; + + + float selectedDN; + float selectedQ3; + string selectedMClass; + string selectedProducer; + + /// /// ListViewEx columns /// @@ -40,31 +66,51 @@ namespace TBF.UI.Procedures Control[] editors; ISession session; + IWaterMeter waterMeterCmpnt; IErrorFlags errorFlagsCmpnt; public ProceduresCtrl() - : base() { + InitializeComponent(); + session = null; - } + waterMeterCmpnt = null; + errorFlagsCmpnt = null; + ToBeRemovedProcedures = new List(); + + dnComboBox.Text = Strings.any; + dnComboBox.Items.Add(Strings.any); + selectedDN = 0; + + q3ComboBox.Text = Strings.any; + q3ComboBox.Items.Add(Strings.any); + selectedQ3 = 0; + + mclassComboBox.Text = Strings.any; + mclassComboBox.Items.Add(Strings.any); + selectedMClass = null; + + producerComboBox.Text = Strings.any; + producerComboBox.Items.Add(Strings.any); + selectedProducer = null; + } public void Initialize(ProceduresDlg parent, Control parentControl) { + if (parent == null) return; + /// Create a DB session session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); - + 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.Nr, (ls.ProceduresColumnCount > 0) ? ls.ProceduresColumnWidths[0] : ( 30 * parent.Dpi / Constants.Dpi100pct)); - Columns.Add(Strings.Name, (ls.ProceduresColumnCount > 1) ? ls.ProceduresColumnWidths[1] : (100 * parent.Dpi / Constants.Dpi100pct)); - Columns.Add(Strings.DescriptionColHdr, (ls.ProceduresColumnCount > 2) ? ls.ProceduresColumnWidths[2] : (300 * parent.Dpi / Constants.Dpi100pct)); - Columns.Add(Strings.More, (ls.ProceduresColumnCount > 3) ? ls.ProceduresColumnWidths[3] : (300 * parent.Dpi / Constants.Dpi100pct)); + listViewEx.Columns.Add(Strings.Nr, (ls.ProceduresColumnCount > 0) ? ls.ProceduresColumnWidths[0] : (30 * parent.Dpi / Constants.Dpi100pct)); + listViewEx.Columns.Add(Strings.Name, (ls.ProceduresColumnCount > 1) ? ls.ProceduresColumnWidths[1] : (100 * parent.Dpi / Constants.Dpi100pct)); + listViewEx.Columns.Add(Strings.DescriptionColHdr, (ls.ProceduresColumnCount > 2) ? ls.ProceduresColumnWidths[2] : (300 * parent.Dpi / Constants.Dpi100pct)); + listViewEx.Columns.Add(Strings.More, (ls.ProceduresColumnCount > 3) ? ls.ProceduresColumnWidths[3] : (300 * parent.Dpi / Constants.Dpi100pct)); editors = new Control[columnsCount]; /// @@ -85,82 +131,141 @@ namespace TBF.UI.Procedures ReloadAndRedrawAll(); } - void ReloadAndRedrawAll() - { + public void Unlock() + { + unlocked = true; + + if (listViewEx.SelectedItems.Count == 1) + { + int ix = listViewEx.SelectedIndices[0]; + Focus(); + listViewEx.Items[ix].Selected = true; + listViewEx.Items[ix].EnsureVisible(); + } + } + + bool ReloadProcedures() + { + bool isFirstTime = AllProcedures == null; + try { - /// Find ErrorFlags component - foreach (var cmpnt in TBF.BenchControl.TbfComponents.LoadComponentsFromDB(session)) + if (isFirstTime) { - if (cmpnt is IErrorFlags) + /// Find WaterMeter and ErrorFlags components, this is done just once when AllProcedures == null + foreach (var cmpnt in TBF.BenchControl.TbfComponents.LoadComponentsFromDB(session)) { - errorFlagsCmpnt = cmpnt as IErrorFlags; - break; + if (waterMeterCmpnt == null && cmpnt is IWaterMeter) waterMeterCmpnt = cmpnt as IWaterMeter; + if (errorFlagsCmpnt == null && cmpnt is IErrorFlags) errorFlagsCmpnt = cmpnt as IErrorFlags; } } - /// Load the procedures - MyItems = session.QueryOver() - .Where(x => (x.ProcedureState == ProcedureState.Active)) - .OrderBy(x => x.ItemNr).Asc - .List(); + /// (Re)Load all procedures unconditionally + AllProcedures = session.QueryOver() + .Where(x => (x.ProcedureState == ProcedureState.Active)) + .OrderBy(x => x.ItemNr).Asc + .List(); + + if (waterMeterCmpnt != null) + { + foreach (var proc in AllProcedures) + { + IParamsProvider waterMeterParams = waterMeterCmpnt.Cfg.GetUIProcParamsProvider(proc); + TBF.BenchControl.WaterMeters.WaterMeter.ProcParams wmParams = waterMeterParams as TBF.BenchControl.WaterMeters.WaterMeter.ProcParams; + if (wmParams != null) + { + proc.DN = wmParams.DN; + proc.Qn = wmParams.Qn; + proc.MClass = wmParams.MetrologicalClass; + proc.Producer = wmParams.Producer; + + if (isFirstTime) + { + if (!dnComboBox.Items.Contains(wmParams.DN.ToString())) dnComboBox.Items.Add(wmParams.DN.ToString()); + if (!q3ComboBox.Items.Contains(wmParams.Qn.ToString())) q3ComboBox.Items.Add(wmParams.Qn.ToString()); + if (!mclassComboBox.Items.Contains(wmParams.MetrologicalClass)) mclassComboBox.Items.Add(wmParams.MetrologicalClass); + if (!producerComboBox.Items.Contains(wmParams.Producer)) producerComboBox.Items.Add(wmParams.Producer); + } + } + } + } + + return true; /// Reloading successful } catch (Exception exc) { log.ErrorFormat("Loading Procedures from DB failed: {0}", exc.Message); - MyItems = new List(); + AllProcedures = new List(); + return false; + } + } + + void ReloadAndRedrawAll() + { + if (ReloadProcedures()) + { + RedrawAll(); + } + } + + void RedrawAll() + { + Procedures = new List(); + + /// Select procedures satisfying filter criteria: AllProcedures -> Procedures + if (AllProcedures != null) + { + foreach (var proc in AllProcedures) + { + if ((selectedDN == 0 || selectedDN == proc.DN) && + (selectedQ3 == 0 || selectedQ3 == proc.Qn) && + ((selectedMClass == null) || (selectedMClass == proc.MClass)) && + ((selectedProducer == null) || (selectedProducer == proc.Producer))) + { + Procedures.Add(proc); + } + } } - 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; + listViewEx.Items.Clear(); + foreach (var procedure in Procedures) DrawOne(procedure); + } + void DrawOne(Procedure procedure) + { StringBuilder tests = new StringBuilder(); - foreach (var test in entity.Tests) + foreach (var test in procedure.Tests) { tests.Append(test.Name); tests.Append(", "); } - ListViewItem lvi = new ListViewItem((entity.ItemNr + 1).ToString()); - lvi.SubItems.Add(entity.Name); - lvi.SubItems.Add(entity.Description); + ListViewItem lvi = new ListViewItem((procedure.ItemNr + 1).ToString()); + lvi.SubItems.Add(procedure.Name); + lvi.SubItems.Add(procedure.Description); lvi.SubItems.Add(tests.ToString()); - lvi.Tag = entity; + lvi.Tag = procedure; - Items.Add(lvi); - } + listViewEx.Items.Add(lvi); + } /// /// Update the entities and save them to the database /// - public new void OkBtnClicked() + public void OkBtnClicked() { - base.OkBtnClicked(); - using (ITransaction transaction = session.BeginTransaction()) { try { - foreach (var entity in ToBeRemovedItems) session.Delete(entity); - ToBeRemovedItems.Clear(); + foreach (var entity in ToBeRemovedProcedures) session.Delete(entity); + ToBeRemovedProcedures.Clear(); int itemNr = 0; - foreach (var entity in MyItems) + foreach (var proc in AllProcedures) { - (entity as Procedure).ItemNr = itemNr++; - session.SaveOrUpdate(entity); + (proc as Procedure).ItemNr = itemNr++; + session.SaveOrUpdate(proc); } transaction.Commit(); @@ -179,93 +284,91 @@ namespace TBF.UI.Procedures Program.MainWnd.ReloadProcedureComboBoxItems(); } - void SaveUISettings() + public void CancelBtnClicked() { - LocalSettings ls = Program.LocalSettings; + } - /// Compare list view column widths with the saved ones - bool anyColumnDiffers = false; - if (Columns.Count != ls.ProceduresColumnCount) + + /// + /// 'Add' button was clicked. + /// + public void AddOne() + { + /// Find an unused procedure name + string newName; + for (int nameId = 1; true; nameId++) { - anyColumnDiffers = true; - } - else - { - for (int i = 0; i < Columns.Count; i++) - { - if (Columns[i].Width != ls.ProceduresColumnWidths[i]) { anyColumnDiffers = true; break; } - } + newName = Strings.New_procedure_name + nameId.ToString(); + bool notUsed = true; + foreach (var t in Procedures) if (t.Name.ToLower().Equals(newName.ToLower())) notUsed = false; + if (notUsed) break; } - if (anyColumnDiffers) - { - /// Update column widths - ls.ProceduresColumnWidths = new int[Columns.Count]; - for (int i = 0; i < Columns.Count; i++) - { - ls.ProceduresColumnWidths[i] = Columns[i].Width; - } + Procedure newProcedure = new Procedure(newName, Procedures.Count); + newProcedure.ItemNr = AllProcedures.Count; + newProcedure.ProcedureState = ProcedureState.Active; + newProcedure.Revision = 1; + newProcedure.PredecessorId = 0; + newProcedure.ObtainedByCopy = false; + newProcedure.CreationUser = Users.GlobalData.CurrentUser.UserName; + newProcedure.CreationTime = DateTime.Now; - ls.Save(); + if (new ProcedureDlg(newProcedure, GetUsedNames(false), true).ShowDialog() == DialogResult.OK) + { + /// TODO: Make name uniqueness test + parent.Unlock(); + + using (var transaction = session.BeginTransaction()) + { + try + { + newProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName; + newProcedure.LastChgTime = DateTime.Now; + + DoAddOne(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(); + log.ErrorFormat("Exception when saving Procedure '{0}' : {1}", newProcedure.Name, exc.Message); + } + } } } - 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.ToLower().Equals(newName.ToLower())) notUsed = false; - if (notUsed) break; - } + /// + /// Adds an item to the ListView and at the end of the list. + /// Focuses onto the added item. + /// + public void DoAddOne(Procedure procedure) + { + Procedures.Add(procedure); + AllProcedures.Add(procedure); + DrawOne(procedure); - Procedure newProcedure = new Procedure(newName, MyItems.Count); - newProcedure.ProcedureState = ProcedureState.Active; - newProcedure.Revision = 1; - newProcedure.PredecessorId = 0; - newProcedure.ObtainedByCopy = false; - newProcedure.CreationUser = Users.GlobalData.CurrentUser.UserName; - newProcedure.CreationTime = DateTime.Now; + Focus(); + listViewEx.SelectedItems.Clear(); + listViewEx.Items[listViewEx.Items.Count - 1].Selected = true; + listViewEx.Items[listViewEx.Items.Count - 1].EnsureVisible(); + } - if (new ProcedureDlg(newProcedure, GetUsedNames(false), true).ShowDialog() == DialogResult.OK) - { - /// TODO: Make name uniqueness test - parent.Unlock(); - using(var transaction = session.BeginTransaction()) - { - try - { - newProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName; - 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(); - log.ErrorFormat("Exception when saving Procedure '{0}' : {1}", newProcedure.Name, exc.Message); - } - } - } - } - - public new void RemoveSelected() - { + /// + /// 'Remove' button was clicked. + /// + public void RemoveSelected() + { if (MessageBox.Show(Strings.Do_you_want_to_delete_the_procedure, Strings.Question, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - bool lastOneRemoved = base.RemoveSelected(); + bool lastOneRemoved = DoRemoveSelected(); if (lastOneRemoved && parent != null) { @@ -277,11 +380,11 @@ namespace TBF.UI.Procedures { try { - foreach (var entity in ToBeRemovedItems) session.Delete(entity); - ToBeRemovedItems.Clear(); + foreach (var entity in ToBeRemovedProcedures) session.Delete(entity); + ToBeRemovedProcedures.Clear(); int itemNr = 0; - foreach (var entity in MyItems) + foreach (var entity in Procedures) { (entity as Procedure).ItemNr = itemNr++; session.SaveOrUpdate(entity); @@ -300,11 +403,143 @@ namespace TBF.UI.Procedures } } + /// + /// Removes an item from the ListView and from the list itself. + /// Adds it on ToBeRemovedItems list. + /// Focuses on the next item. + /// + /// true when the last item was removed and 'Remove' button should be disabled + public bool DoRemoveSelected() + { + if (listViewEx.SelectedItems.Count != 1) return false; + + int removeItemNr = listViewEx.SelectedIndices[0]; + if (removeItemNr < 0) return false; + + Procedure selectedItem = (Procedure)listViewEx.SelectedItems[0].Tag; + + /// Add to ToBeRemovedProcedures if necessary + if (selectedItem.Id != 0) + { + /// Procedure to be removed was loaded from the DB (was not recenlu created) + ToBeRemovedProcedures.Add(selectedItem); + } + + /// Remove from AllProcedures + AllProcedures.Remove(selectedItem); + + /// Remove + Procedures.RemoveAt(removeItemNr); + for (int i = removeItemNr; i < Procedures.Count; i++) + { + Procedures[i].ItemNr--; + } + + RedrawAll(); + + if (removeItemNr < listViewEx.Items.Count) + { + Focus(); + listViewEx.Items[removeItemNr].Selected = true; + listViewEx.Items[removeItemNr].EnsureVisible(); + return false; + } + else + { + return true; + } + } + + public void MoveUpSelected() + { + if (listViewEx.SelectedItems.Count != 1) return; + if (Procedures.Count != AllProcedures.Count) return; + + int ix = listViewEx.SelectedIndices[0]; + if (ix <= 0 || ix >= Procedures.Count) return; + + Procedure proc1 = (Procedure)(listViewEx.Items[ix - 1].Tag); + Procedure proc2 = (Procedure)(listViewEx.Items[ix].Tag); + proc1.ItemNr++; + proc2.ItemNr--; + Procedures.RemoveAt(ix); + Procedures.Insert(ix - 1, proc2); + AllProcedures.RemoveAt(ix); + AllProcedures.Insert(ix - 1, proc2); + + RedrawAll(); + + listViewEx.Focus(); + listViewEx.Items[ix - 1].Selected = true; + listViewEx.Items[ix - 1].EnsureVisible(); + } + + public void MoveDownSelected() + { + if (listViewEx.SelectedItems.Count != 1) return; + if (Procedures.Count != AllProcedures.Count) return; + + int ix = listViewEx.SelectedIndices[0]; + if (ix < 0 || ix >= Procedures.Count - 1) return; + + Procedure proc1 = (Procedure)(listViewEx.Items[ix].Tag); + Procedure proc2 = (Procedure)(listViewEx.Items[ix + 1].Tag); + proc1.ItemNr++; + proc2.ItemNr--; + Procedures.RemoveAt(ix + 1); + Procedures.Insert(ix, proc2); + AllProcedures.RemoveAt(ix + 1); + AllProcedures.Insert(ix, proc2); + + RedrawAll(); + + listViewEx.Focus(); + listViewEx.Items[ix + 1].Selected = true; + listViewEx.Items[ix + 1].EnsureVisible(); + } + + + void SaveUISettings() + { + LocalSettings ls = Program.LocalSettings; + + /// Compare list view column widths with the saved ones + bool anyColumnDiffers = false; + if (listViewEx.Columns.Count != ls.ProceduresColumnCount) + { + anyColumnDiffers = true; + } + else + { + for (int i = 0; i < listViewEx.Columns.Count; i++) + { + if (listViewEx.Columns[i].Width != ls.ProceduresColumnWidths[i]) { anyColumnDiffers = true; break; } + } + } + + if (anyColumnDiffers) + { + /// Update column widths + ls.ProceduresColumnWidths = new int[listViewEx.Columns.Count]; + for (int i = 0; i < listViewEx.Columns.Count; i++) + { + ls.ProceduresColumnWidths[i] = listViewEx.Columns[i].Width; + } + + ls.Save(); + } + } + + private void listViewEx_MouseDoubleClick(object sender, MouseEventArgs e) + { + editButton_Click(sender, e); + } + /// public void editButton_Click(object sender, EventArgs e) { - if (SelectedItems.Count != 1) return; + if (listViewEx.SelectedItems.Count != 1) return; - Procedure originalProcedure = SelectedItems[0].Tag as Procedure; + Procedure originalProcedure = listViewEx.SelectedItems[0].Tag as Procedure; Procedure modifiedProcedure = originalProcedure.Clone(); modifiedProcedure.Revision = originalProcedure.Revision + 1; @@ -329,7 +564,7 @@ namespace TBF.UI.Procedures session.SaveOrUpdate(modifiedProcedure); transaction.Commit(); - SelectedItems[0].Tag = modifiedProcedure; + listViewEx.SelectedItems[0].Tag = modifiedProcedure; MessageBox.Show(string.Format(Strings.Procedure_0_modified, string.Format(" {0} '{1}' ", modifiedProcedure.ItemNr + 1, modifiedProcedure.Name)), Strings.Confirmation, MessageBoxButtons.OK, @@ -349,15 +584,15 @@ namespace TBF.UI.Procedures public void copyButton_Click(object sender, EventArgs e) { - if (SelectedItems.Count != 1) return; + if (listViewEx.SelectedItems.Count != 1) return; - Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag; + Procedure selectedProcedure = (Procedure)listViewEx.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.ItemNr = AllProcedures.Count; newProcedure.ProcedureState = ProcedureState.Active; newProcedure.Revision = 1; newProcedure.PredecessorId = selectedProcedure.Id; @@ -376,7 +611,7 @@ namespace TBF.UI.Procedures newProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName; newProcedure.LastChgTime = DateTime.Now; - base.AddOne(newProcedure); + DoAddOne(newProcedure); session.SaveOrUpdate(newProcedure); transaction.Commit(); @@ -390,9 +625,9 @@ namespace TBF.UI.Procedures public void exportButton_Click(object sender, EventArgs e) { - if (SelectedItems.Count != 1) return; + if (listViewEx.SelectedItems.Count != 1) return; - Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag; + Procedure selectedProcedure = (Procedure)listViewEx.SelectedItems[0].Tag; SaveFileDialog dlg = new SaveFileDialog(); if (dlg.ShowDialog() == DialogResult.OK) @@ -411,7 +646,7 @@ namespace TBF.UI.Procedures Procedure newProcedure = Procedure.Import(new StreamReader(dlg.FileName, System.Text.Encoding.UTF8)); newProcedure.Name = newProcedure.Name + " imported"; - newProcedure.ItemNr = MyItems.Count; + newProcedure.ItemNr = Procedures.Count; newProcedure.ProcedureState = ProcedureState.Active; newProcedure.Revision = 1; newProcedure.PredecessorId = 0; @@ -429,7 +664,7 @@ namespace TBF.UI.Procedures newProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName; newProcedure.LastChgTime = DateTime.Now; - base.AddOne(newProcedure); + DoAddOne(newProcedure); session.SaveOrUpdate(newProcedure); transaction.Commit(); @@ -443,9 +678,9 @@ namespace TBF.UI.Procedures public void compareButton_Click(object sender, EventArgs e) { - if (SelectedItems.Count != 1) return; + if (listViewEx.SelectedItems.Count != 1) return; - Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag; + Procedure selectedProcedure = (Procedure)listViewEx.SelectedItems[0].Tag; OpenFileDialog dlg = new OpenFileDialog(); if (dlg.ShowDialog() == DialogResult.OK) @@ -486,13 +721,13 @@ namespace TBF.UI.Procedures { newName = Strings.New_procedure_name + nameId.ToString(); bool notUsed = true; - foreach (var t in MyItems) if (t.Name.ToLower().Equals(newName.ToLower())) notUsed = false; + foreach (var t in Procedures) if (t.Name.ToLower().Equals(newName.ToLower())) notUsed = false; if (notUsed) break; } ProfileType pt = dlg.SelectedProfile.ProfileType; - Procedure newProcedure = new Procedure(newName, MyItems.Count); + Procedure newProcedure = new Procedure(newName, Procedures.Count); Medium medium = (pt == ProfileType.QnClassHotWater) ? Medium.HotWater : Medium.ColdWater; IList errorFlagsParamsOfCreatedTests = new List(); IList waterMeterParamsOfNewProcedure = new List(); @@ -649,7 +884,7 @@ namespace TBF.UI.Procedures newProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName; newProcedure.LastChgTime = DateTime.Now; - base.AddOne(newProcedure); + DoAddOne(newProcedure); session.SaveOrUpdate(newProcedure); foreach (var efp in errorFlagsParamsOfCreatedTests) @@ -673,13 +908,78 @@ namespace TBF.UI.Procedures } } - public string GetWarningsBeforeSaving(ref Dictionary renmInfo) - { - return string.Empty; - } - public void UpdateRelatedItems(Dictionary renameInfo) + public IList GetUsedNames(bool caseSensitive = true) { + IList usedNames = new List(); + + if (Procedures != null) + { + if (caseSensitive) + { + foreach (var procedure in Procedures) + { + usedNames.Add(procedure.Name); + } + } + else + { + foreach (var procedure in Procedures) + { + usedNames.Add(procedure.Name.ToLower()); + } + } + } + + return usedNames; + } + + private void dnComboBox_SelectedIndexChanged(object sender, EventArgs e) { UpdateSelectedDN(); } + private void dnComboBox_TextChanged(object sender, EventArgs e) { UpdateSelectedDN(); } + /// + void UpdateSelectedDN() + { + uint ival; + selectedDN = uint.TryParse(dnComboBox.Text, out ival) ? ival : 0; + RedrawAll(); + listViewEx_SelectedIndexChanged(null, null); + } + + private void q3ComboBox_SelectedIndexChanged(object sender, EventArgs e) { UpdateSelectedQn(); } + private void q3ComboBox_TextChanged(object sender, EventArgs e) { UpdateSelectedQn(); } + /// + void UpdateSelectedQn() + { + float fval; + selectedQ3 = Utils.TryParseUFloat(q3ComboBox.Text, out fval) ? fval : 0; + RedrawAll(); + listViewEx_SelectedIndexChanged(null, null); + } + + private void mclassComboBox_SelectedIndexChanged(object sender, EventArgs e) { UpdateSelectedMClass(); } + private void mclassComboBox_TextChanged(object sender, EventArgs e) { UpdateSelectedMClass(); } + /// + void UpdateSelectedMClass() + { + selectedMClass = (mclassComboBox.Text != Strings.any) ? mclassComboBox.Text : null; + RedrawAll(); + listViewEx_SelectedIndexChanged(null, null); + } + + private void producerComboBox_SelectedIndexChanged(object sender, EventArgs e) { UpdateSelectedProducer(); } + private void producerComboBox_TextChanged(object sender, EventArgs e) { UpdateSelectedProducer(); } + /// + void UpdateSelectedProducer() + { + selectedProducer = (producerComboBox.Text != Strings.any) ? producerComboBox.Text : null; + RedrawAll(); + listViewEx_SelectedIndexChanged(null, null); + } + + private void listViewEx_SelectedIndexChanged(object sender, EventArgs e) + { + bool isFilterAny = (selectedDN == 0) && (selectedQ3 == 0) && (selectedMClass == null) && (selectedProducer == null); + if (parent != null) parent.SelectedIndexChanged(listViewEx, isFilterAny); } } } diff --git a/TBF/UI/Procedures/ProceduresCtrl.resx b/TBF/UI/Procedures/ProceduresCtrl.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/UI/Procedures/ProceduresCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF/UI/Procedures/ProceduresDlg.Designer.cs b/TBF/UI/Procedures/ProceduresDlg.Designer.cs index 8f92d3916..3f12e0835 100644 --- a/TBF/UI/Procedures/ProceduresDlg.Designer.cs +++ b/TBF/UI/Procedures/ProceduresDlg.Designer.cs @@ -54,23 +54,17 @@ namespace TBF.UI.Procedures // splitContainer.Panel2 // this.splitContainer.Panel2.Controls.Add(this.sharedButtons); - this.splitContainer.Size = new System.Drawing.Size(517, 402); - this.splitContainer.SplitterDistance = 412; + this.splitContainer.Size = new System.Drawing.Size(711, 402); + this.splitContainer.SplitterDistance = 606; this.splitContainer.TabIndex = 0; // // proceduresCtrl // this.proceduresCtrl.Dock = System.Windows.Forms.DockStyle.Fill; - this.proceduresCtrl.DoubleClickActivation = false; - this.proceduresCtrl.FullRowSelect = true; - this.proceduresCtrl.GridLines = true; this.proceduresCtrl.Location = new System.Drawing.Point(0, 0); this.proceduresCtrl.Name = "proceduresCtrl"; this.proceduresCtrl.Size = new System.Drawing.Size(412, 402); this.proceduresCtrl.TabIndex = 0; - this.proceduresCtrl.UseCompatibleStateImageBehavior = false; - this.proceduresCtrl.View = System.Windows.Forms.View.Details; - this.proceduresCtrl.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.proceduresCtrl_MouseDoubleClick); // // sharedButtons // @@ -83,7 +77,7 @@ namespace TBF.UI.Procedures // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(517, 402); + this.ClientSize = new System.Drawing.Size(711, 402); this.Controls.Add(this.splitContainer); this.Name = "ProceduresDlg"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; diff --git a/TBF/UI/Procedures/ProceduresDlg.cs b/TBF/UI/Procedures/ProceduresDlg.cs index 1461f1b2f..02fabbe07 100644 --- a/TBF/UI/Procedures/ProceduresDlg.cs +++ b/TBF/UI/Procedures/ProceduresDlg.cs @@ -1,13 +1,11 @@ /// -/// Copyright (c) 2013-2019 Sensus Slovensko a.s. +/// Copyright (c) 2013-2020 Sensus Slovensko a.s. /// using System; -using System.Collections.Generic; using System.Windows.Forms; using log4net; using TBF.Resources; using TBF.UI.Shared; -using Config.Entities; namespace TBF.UI.Procedures { @@ -179,16 +177,17 @@ namespace TBF.UI.Procedures proceduresCtrl.MoveDownSelected(); } - private void proceduresCtrl_MouseDoubleClick(object sender, MouseEventArgs e) - { - proceduresCtrl.editButton_Click(sender, e); - } + private void custom1Button_Click(object sender, EventArgs e) + { + proceduresCtrl.CreateFromProfile(); + } + /// /// Common part for three xxxListViewEx_SelectedIndexChanged event handlers /// /// - void SelectedIndexChanged(object sender, EventArgs e) + public void SelectedIndexChanged(ListView sender, bool isFilterAny) { Results.Forms.ListViewEx listViewEx = sender as Results.Forms.ListViewEx; if (listViewEx.SelectedItems.Count != 1) @@ -205,27 +204,46 @@ namespace TBF.UI.Procedures else if (listViewEx.SelectedIndices[0] == 0) { /// The first of many items selected - sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); - sharedButtons.DisableButtons(SharedButtons.Buttons.Up); + if (isFilterAny) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up); + } + else + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } } else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) { /// The last of many items selected - sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); - sharedButtons.DisableButtons(SharedButtons.Buttons.Down); + if (isFilterAny) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); + sharedButtons.DisableButtons(SharedButtons.Buttons.Down); + } + else + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } } else { /// One of middle items selected - sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + if (isFilterAny) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } } } - private void custom1Button_Click(object sender, EventArgs e) - { - proceduresCtrl.CreateFromProfile(); - } - public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) { if (selectedItemPos == SharedButtons.SelectedItemPos.None)