tbf/TBF/UI/Procedures/ProceduresCtrl.cs

686 lines
25 KiB
C#

///
/// Copyright (c) 2013-2019 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<Procedure>, ITabWithListViewEx
{
static readonly ILog log = LogManager.GetLogger(typeof(ProceduresCtrl));
/// <summary>
/// ListViewEx columns
/// </summary>
enum Column
{
ItemNr,
Name,
Description,
More,
ColumnsCount,
}
readonly int columnsCount = (int)Column.ColumnsCount;
ProceduresDlg parent;
Control parentControl;
Control[] editors;
ISession session;
IErrorFlags errorFlagsCmpnt;
public ProceduresCtrl()
: base()
{
session = null;
}
public void Initialize(ProceduresDlg parent, Control parentControl)
{
/// 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));
editors = new Control[columnsCount];
///
editors[(int)Column.ItemNr] = new TextBox(); /// ItemNr
editors[(int)Column.Name] = new TextBox(); /// Name
editors[(int)Column.Description] = new TextBox(); /// Description
editors[(int)Column.More] = null;
///
for (int i = 0; i < editors.Length; i++)
{
if (editors[i] != null)
{
editors[i].Visible = false;
parent.Controls.Add(editors[i]);
}
}
ReloadAndRedrawAll();
}
void ReloadAndRedrawAll()
{
try
{
/// Find ErrorFlags component
foreach (var cmpnt in TBF.BenchControl.TbfComponents.LoadComponentsFromDB(session))
{
if (cmpnt is IErrorFlags)
{
errorFlagsCmpnt = cmpnt as IErrorFlags;
break;
}
}
/// Load the procedures
MyItems = session.QueryOver<Procedure>()
.Where(x => (x.ProcedureState == ProcedureState.Active))
.OrderBy(x => x.ItemNr).Asc
.List();
}
catch (Exception exc)
{
log.ErrorFormat("Loading Procedures from DB failed: {0}", exc.Message);
MyItems = new List<Procedure>();
}
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;
StringBuilder tests = new StringBuilder();
foreach (var test in entity.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);
lvi.SubItems.Add(tests.ToString());
lvi.Tag = entity;
Items.Add(lvi);
}
/// <summary>
/// Update the entities and save them to the database
/// </summary>
public new void OkBtnClicked()
{
base.OkBtnClicked();
using (ITransaction transaction = session.BeginTransaction())
{
try
{
foreach (var entity in ToBeRemovedItems) session.Delete(entity);
ToBeRemovedItems.Clear();
int itemNr = 0;
foreach (var entity in MyItems)
{
(entity as Procedure).ItemNr = itemNr++;
session.SaveOrUpdate(entity);
}
transaction.Commit();
session.Flush();
}
catch (Exception exc)
{
transaction.Rollback();
log.ErrorFormat("Cannot save changes to DB: {0}", exc.Message);
MessageBox.Show(Strings.Cannot_save_changes, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
SaveUISettings();
Program.MainWnd.ReloadProcedureComboBoxItems();
}
void SaveUISettings()
{
LocalSettings ls = Program.LocalSettings;
/// Compare list view column widths with the saved ones
bool anyColumnDiffers = false;
if (Columns.Count != ls.ProceduresColumnCount)
{
anyColumnDiffers = true;
}
else
{
for (int i = 0; i < Columns.Count; i++)
{
if (Columns[i].Width != ls.ProceduresColumnWidths[i]) { anyColumnDiffers = true; 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;
}
ls.Save();
}
}
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;
}
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;
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()
{
if (MessageBox.Show(Strings.Do_you_want_to_delete_the_procedure,
Strings.Question, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
bool lastOneRemoved = base.RemoveSelected();
if (lastOneRemoved && parent != null)
{
parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None);
}
/// Update the database
using (ITransaction transaction = session.BeginTransaction())
{
try
{
foreach (var entity in ToBeRemovedItems) session.Delete(entity);
ToBeRemovedItems.Clear();
int itemNr = 0;
foreach (var entity in MyItems)
{
(entity as Procedure).ItemNr = itemNr++;
session.SaveOrUpdate(entity);
}
transaction.Commit();
session.Flush();
}
catch (Exception exc)
{
transaction.Rollback();
log.ErrorFormat("Cannot save changes to DB: {0}", exc.Message);
MessageBox.Show(Strings.Cannot_save_changes, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}
}
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.Revision = originalProcedure.Revision + 1;
modifiedProcedure.ObtainedByCopy = false;
IList<string> usedNames = GetUsedNames(false);
usedNames.Remove(originalProcedure.Name.ToLower()); /// Allow original procedure name
///
if (new ProcedureDlg(modifiedProcedure, usedNames).ShowDialog() == DialogResult.OK)
{
parent.Unlock();
using (var transaction = session.BeginTransaction())
{
try
{
originalProcedure.ProcedureState = ProcedureState.History;
modifiedProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName;
modifiedProcedure.LastChgTime = DateTime.Now;
session.SaveOrUpdate(originalProcedure);
session.SaveOrUpdate(modifiedProcedure);
transaction.Commit();
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,
MessageBoxIcon.Information);
}
catch (Exception exc)
{
log.ErrorFormat("Exception when saving Procedure '{0}' : {1}", modifiedProcedure.Name, exc.Message);
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 = Users.GlobalData.CurrentUser.UserName;
newProcedure.CreationTime = DateTime.Now;
newProcedure.Protected = false;
if ((new ProcedureDlg(newProcedure, GetUsedNames(false), true)).ShowDialog() == DialogResult.OK)
{
/// TODO: Make name uniqueness test
parent.Unlock();
using (var transaction = session.BeginTransaction())
{
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);
}
}
}
public void exportButton_Click(object sender, EventArgs e)
{
if (SelectedItems.Count != 1) return;
Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag;
SaveFileDialog dlg = new SaveFileDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
selectedProcedure.Export(new StreamWriter(dlg.FileName, false, System.Text.Encoding.UTF8));
}
}
public void importButton_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() != DialogResult.OK) return;
/// Import a procedure from a file
Procedure newProcedure = Procedure.Import(new StreamReader(dlg.FileName, System.Text.Encoding.UTF8));
newProcedure.Name = newProcedure.Name + " imported";
newProcedure.ItemNr = 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;
if ((new ProcedureDlg(newProcedure, GetUsedNames(false), true)).ShowDialog() == DialogResult.OK)
{
/// TODO: Make name uniqueness test
parent.Unlock();
using (var transaction = session.BeginTransaction())
{
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);
}
}
}
public void compareButton_Click(object sender, EventArgs e)
{
if (SelectedItems.Count != 1) return;
Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag;
OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
string diff = selectedProcedure.Compare(new StreamReader(dlg.FileName, System.Text.Encoding.UTF8));
if (!string.IsNullOrEmpty(diff))
{
MessageBox.Show(diff, "Differences", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
MessageBox.Show("No differences found", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
public void CreateFromProfile()
{
IList<Profile> profiles;
try
{
profiles = session.QueryOver<Profile>().List();
}
catch (Exception)
{
log.Error("Reading Profiles failed");
MessageBox.Show("Reading Profiles failed");
return;
}
TestWizard.TestProfileSelection dlg = new TestWizard.TestProfileSelection(profiles);
if (dlg.ShowDialog() != DialogResult.OK) return;
/// 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;
}
ProfileType pt = dlg.SelectedProfile.ProfileType;
Procedure newProcedure = new Procedure(newName, MyItems.Count);
Medium medium = (pt == ProfileType.QnClassHotWater) ? Medium.HotWater : Medium.ColdWater;
IList<IParamsProvider> errorFlagsParamsOfCreatedTests = new List<IParamsProvider>();
IList<IParamsProvider> waterMeterParamsOfNewProcedure = new List<IParamsProvider>();
IList<Component> cmpntEntities = session.QueryOver<Component>()
.OrderBy(x => x.ItemNr).Asc
.List<Component>();
IList<BenchControl.Generic.IComponent> components = BenchControl.TbfComponents.LoadComponentsFromDB(session);
foreach (var cmptn in components)
{
if (cmptn.ClassName == "WaterMeter")
{
IParamsProvider waterMeterParams = cmptn.Cfg.GetUIProcParamsProvider(newProcedure);
TBF.BenchControl.WaterMeters.WaterMeter.ProcParams wmParams = waterMeterParams as TBF.BenchControl.WaterMeters.WaterMeter.ProcParams;
if (wmParams != null)
{
wmParams.NewQnames = (pt == ProfileType.Q3R);
wmParams.Qmax = (float)((pt == ProfileType.Manual) ? 0 : Config.Utils.GetQ4Qmax(dlg.Qn, dlg.MetroClass, medium));
wmParams.Qn = (float)dlg.Qn;
wmParams.Qt = (float)((pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? (0.1 * dlg.Qn) : Config.Utils.GetQ2Qt(dlg.Qn, dlg.MetroClass, medium));
wmParams.Qmin = (float)((pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? dlg.Qn / dlg.QpQiRatio : Config.Utils.GetQ1Qmin(dlg.Qn, dlg.MetroClass, medium));
wmParams.MetrologicalClass = dlg.MetroClass;
wmParams.WaterTemp = medium;
}
waterMeterParamsOfNewProcedure.Add(waterMeterParams);
}
}
int itemNr = 0;
foreach (var ptest in dlg.SelectedProfile.Tests)
{
double Qtg;
if (ptest.Name.Contains("Q4") || ptest.Name.Contains("Qmax"))
{
Qtg = Config.Utils.GetQ4Qmax(dlg.Qn, dlg.MetroClass, medium, ptest.CoefQto);
}
else if (ptest.Name.Contains("Q3") || ptest.Name.Contains("Qn") || ptest.Name.Equals("qp"))
{
Qtg = dlg.Qn;
}
else if (ptest.Name.Contains("Q2") || ptest.Name.Contains("Qt"))
{
Qtg = Config.Utils.GetQ2Qt(dlg.Qn, dlg.MetroClass, medium, ptest.CoefQto);
}
else if (ptest.Name.Contains("Q1") || ptest.Name.Contains("Qmin"))
{
Qtg = Config.Utils.GetQ1Qmin(dlg.Qn, dlg.MetroClass, medium, ptest.CoefQto);
}
else if (ptest.Name.Contains("0,1qp") || ptest.Name.Contains("0.1qp"))
{
Qtg = 0.1 * dlg.Qn;
}
else if (ptest.Name.Contains("qi"))
{
Qtg = dlg.Qn / dlg.QpQiRatio;
}
else
{
Qtg = dlg.Qn; /// Manual flow selection: CoefQfrom and CoefQto are used to calculate Qfrom and Qto from Qn
}
Test test = new Test(ptest.Name, itemNr++, newProcedure);
test.Part = ptest.Part;
test.Profile = (pt == ProfileType.QpQi) ? TestProfile.ProtectedHeatMeter : TestProfile.Protected;
test.Qtg = (float)Qtg;
test.Qfrom = (float)(Qtg * ptest.CoefQfrom);
test.Qto = (float)(Qtg * ptest.CoefQto);
test.TempLimLo = (float)ptest.TempLimLo;
test.TempLimHi = (float)ptest.TempLimHi;
test.Publish = ptest.Publish;
test.DoEvaluate = ptest.Evaluate;
if (pt != ProfileType.QpQi)
{
test.ErrLimLo = (float)ptest.ErrLimLo;
test.ErrLimHi = (float)ptest.ErrLimHi;
}
else
{
int metroClass;
if (int.TryParse(dlg.MetroClass, out metroClass)) test.ErrLimLo = (float)metroClass;
test.ErrLimHi = -(float)dlg.Qn;
}
newProcedure.Tests.Add(test);
if (errorFlagsCmpnt != null)
{
IParamsProvider errorFlagsParams = errorFlagsCmpnt.Cfg.GetUITestParamsProvider(test);
TBF.BenchControl.Various.ErrorFlags.TestParams eFlagParams = errorFlagsParams as TBF.BenchControl.Various.ErrorFlags.TestParams;
if (eFlagParams != null)
{
eFlagParams.E1 = ptest.E1;
eFlagParams.E2 = ptest.E2;
eFlagParams.E3 = ptest.E3;
eFlagParams.E4 = ptest.E4;
eFlagParams.E5 = ptest.E5;
eFlagParams.E6 = ptest.E6;
eFlagParams.E7 = ptest.E7;
eFlagParams.E8 = ptest.E8;
eFlagParams.E9 = ptest.E9;
eFlagParams.E10 = ptest.E10;
eFlagParams.E11 = ptest.E11;
eFlagParams.E12 = ptest.E12;
eFlagParams.E13 = ptest.E13;
eFlagParams.E14 = ptest.E14;
eFlagParams.E15 = ptest.E15;
eFlagParams.E16 = ptest.E16;
eFlagParams.E21 = ptest.E21;
eFlagParams.Delta_Q_pct = ptest.Delta_Q_pct;
eFlagParams.Delta_T = ptest.Delta_T;
eFlagParams.Delta_Tup_Tdn = ptest.Delta_Tup_Tdn;
eFlagParams.TestTime_min = ptest.TestTime_min;
eFlagParams.TestTime_max = ptest.TestTime_max;
eFlagParams.AmbTemp_min = ptest.AmbTemp_min;
eFlagParams.AmbTemp_max = ptest.AmbTemp_max;
eFlagParams.Pressure_min = ptest.PressLimLo;
eFlagParams.Pressure_max = ptest.PressLimHi;
eFlagParams.Coef_E9 = ptest.Coef_E9;
eFlagParams.Coef_E10 = ptest.Coef_E10;
eFlagParams.Coef_E11 = ptest.Coef_E11;
eFlagParams.Coef_E12 = ptest.Coef_E12;
eFlagParams.Offset_E9 = ptest.Offset_E9;
eFlagParams.Offset_E12 = ptest.Offset_E12;
}
errorFlagsParamsOfCreatedTests.Add(errorFlagsParams);
}
}
newProcedure.AltProcName = dlg.SelectedProfile.Name;
newProcedure.ProcedureState = ProcedureState.Active;
newProcedure.Revision = 1;
newProcedure.PredecessorId = 0;
newProcedure.ObtainedByCopy = false;
newProcedure.CreationUser = Users.GlobalData.CurrentUser.UserName;
newProcedure.CreationTime = DateTime.Now;
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);
foreach (var efp in errorFlagsParamsOfCreatedTests)
{
efp.UpdateEmbeddedDbEntity();
}
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 string GetWarningsBeforeSaving(ref Dictionary<string, string> renmInfo)
{
return string.Empty;
}
public void UpdateRelatedItems(Dictionary<string, string> renameInfo)
{
}
}
}