/// /// Copyright (c) 2013-2023 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Windows.Forms; using NHibernate; using log4net; using Config.Entities; using TBF.Rig; using TBF.Resources; using TBF.UI.Shared; namespace TBF.UI.Bench.Metrology { public partial class MetrologyDlg : Form, IParentOfListViewEx { static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlg)); public ISession Session; public IList cmpntEntities; public MetrologyDlg() { InitializeComponent(); /// Open a database session try { Session = TBF.DB.ConfigDBSessionFactory.OpenSession(); } catch (Exception e) { MessageBox.Show(Strings.Cannot_connect_to_the_database + Environment.NewLine + e.Message, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } /// SharedDlgButtons configuration sharedButtons.ParentForm = this; sharedButtons.RequiredGroupMembership = new Common.GID[] { Common.GID.Metrologists, Common.GID.MetrologicalAuthority }; sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | SharedButtons.Buttons.Remove; sharedButtons.Unlocked += unlockButton_Click; sharedButtons.OKClicked += okButton_Click; sharedButtons.CancelClicked += cancelButton_Click; sharedButtons.AddClicked += addButton_Click; sharedButtons.RemoveClicked += removeButton_Click; } private void MetrologyDlg_Load(object sender, EventArgs e) { LoadUISettings(); Text = Strings.Metrology; int fixedCount = 0; int balancesCount = 0; int levelMetersCount = 0; int divertersCount = 0; int flowMetersCount = 0; int pressMetersCount = 0; int tempMetersCount = 0; int platinumTempMetersCount = 0; int evaporationsCount = 0; cmpntEntities = (Session == null) ? new List() : Session.QueryOver() .OrderBy(x => x.ItemNr).Asc .List(); foreach (var cmpnt in cmpntEntities) { Rig.Generic.IComponentFactory factory = TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName); /// Tab-page density if (factory is Rig.DataContainers.Density.ComponentFactory) { fixedCount++; TabPage tabPage = new TabPage(" " + Strings.Density + " "); MetrologyDlgDensityTab uiControl = new MetrologyDlgDensityTab(); uiControl.MeterEntity = cmpnt; uiControl.DensityCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.DataContainers.Density.ComponentCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } /// Tab-page buoyancy if (factory is Rig.DataContainers.Buoyancy.ComponentFactory) { fixedCount++; TabPage tabPage = new TabPage(" Buoyancy "); MetrologyDlgBuoyancyTab uiControl = new MetrologyDlgBuoyancyTab(); uiControl.MeterEntity = cmpnt; uiControl.BuoyancyCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.DataContainers.Buoyancy.ComponentCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } /// Tab-pages for scales if (factory is Rig.MettlerToledo.Standard.BalanceFactory || factory is Rig.MettlerToledo.Standard.BalanceOldFactory || factory is Rig.MettlerToledo.Standard.BalanceNewFactory || factory is Rig.MettlerToledo.Multi.BalanceFactory) { balancesCount++; TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); MetrologyDlgBalanceTab uiControl = new MetrologyDlgBalanceTab(); uiControl.MeterEntity = cmpnt; uiControl.BalanceCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.GenericDevices.IScaleCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } /// Tab-pages for flowmeters if (factory is Rig.Elde.FlowMeter.FlowMeterFactory) { Rig.Elde.FlowMeter.FlowMeterCfg flowMeterCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.Elde.FlowMeter.FlowMeterCfg; for (int r = 0; r <= 5; r++) { if (flowMeterCfg.RangeEnabled(r)) { bool isLastFlowMeterRange = true; for (int nxt = r + 1; nxt <= 5; nxt++) { if (flowMeterCfg.RangeEnabled(nxt)) { isLastFlowMeterRange = false; break; } } flowMetersCount++; TabPage tabPage = new TabPage(string.Format(((r == 0) ? " {0} " : " {0} r{1} "), cmpnt.Name, r)); MetrologyDlgFlowMeterTab uiControl = new MetrologyDlgFlowMeterTab(r, isLastFlowMeterRange); uiControl.MeterEntity = cmpnt; uiControl.CalibInfoCfg = flowMeterCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } } } /// Tab-pages for pressure meters if (factory is Rig.Elde.PressureMeter.PressureMeterFactory || factory is Rig.Elde.PressureMeterInternal.PressureMeterFactory || factory is Rig.Modbus.PressureMeter.Meret.Factory) { pressMetersCount++; TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); MetrologyDlgPressMeterTab uiControl = new MetrologyDlgPressMeterTab(); uiControl.MeterEntity = cmpnt; uiControl.CalibInfoCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.GenericDevices.ICalibInfoCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } /// Tab-pages for temperature meters if (factory is Rig.Elde.TempMeter.TempMeterFactory || factory is Rig.Elde.TempMeterInternal.TempMeterFactory) { tempMetersCount++; TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); MetrologyDlgTempMeterTab uiControl = new MetrologyDlgTempMeterTab(); uiControl.MeterEntity = cmpnt; uiControl.CalibInfoCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.GenericDevices.ICalibInfoCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } /// Tab-pages for platinum resistance temperature meters if (factory is Rig.Keithley.TempMeter.Factory) { platinumTempMetersCount++; TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); MetrologyDlgPlatinumResistanceTMeterTab uiControl = new MetrologyDlgPlatinumResistanceTMeterTab(); uiControl.MeterEntity = cmpnt; uiControl.TempMeterCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.Keithley.TempMeter.TempMeterCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } /// Tab-pages for diverters if (factory is Rig.Elde.Diverter.DiverterFactory) { divertersCount++; TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); MetrologyDlgDiverterTab uiControl = new MetrologyDlgDiverterTab(); uiControl.MeterEntity = cmpnt; uiControl.CalibInfoCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.GenericDevices.ICalibInfoCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } /// Tab-pages for level meters inside water tanks if (factory is Rig.Hart.Nivotrack.Factory) { levelMetersCount++; TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); MetrologyDlgLevelMeterTab uiControl = new MetrologyDlgLevelMeterTab(); uiControl.MeterEntity = cmpnt; uiControl.CalibInfoCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.GenericDevices.ICalibInfoCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } /// Tab-pages for water tank evaporation rates if (factory is Rig.DataContainers.Evaporation.Factory) { evaporationsCount++; TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); MetrologyDlgEvaporationTab uiControl = new MetrologyDlgEvaporationTab(); uiControl.MeterEntity = cmpnt; uiControl.CalibInfoCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as Rig.GenericDevices.ICalibInfoCfg; uiControl.Dock = DockStyle.Fill; tabPage.Tag = uiControl; tabPage.Controls.Add(uiControl); metrologyTabControl.TabPages.Add(tabPage); } } } private void unlockButton_Click(object sender, EventArgs e) { foreach (TabPage tabPage in metrologyTabControl.TabPages) { (tabPage.Tag as IMetrologyDlgTab).Unlock(); } } private void okButton_Click(object sender, EventArgs e) { using (ITransaction transaction = Session.BeginTransaction()) { try { foreach (TabPage tabPage in metrologyTabControl.TabPages) { IMetrologyDlgTab tab = tabPage.Tag as IMetrologyDlgTab; if (tab != null) { tab.OkBtnClicked(); tab.SaveEntityToDB(Session); foreach (var entity in tab.ToBeRemoved) Session.Delete(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(); DialogResult = DialogResult.OK; Close(); } private void cancelButton_Click(object sender, EventArgs e) { foreach (TabPage tabPage in metrologyTabControl.TabPages) { (tabPage.Tag as IMetrologyDlgTab).CancelBtnClicked(); } SaveUISettings(); DialogResult = DialogResult.Cancel; Close(); } private void SaveUISettings() { /// Obtain MetrologyDlg dimensions, etc. bool isMaximized = (WindowState == FormWindowState.Maximized); int left = (WindowState == FormWindowState.Normal) ? Location.X : RestoreBounds.Left; int top = (WindowState == FormWindowState.Normal) ? Location.Y : RestoreBounds.Top; int width = (WindowState == FormWindowState.Normal) ? Size.Width : RestoreBounds.Width; int height = (WindowState == FormWindowState.Normal) ? Size.Height : RestoreBounds.Height; LocalSettings ls = Program.LocalSettings; if (ls != null && (ls.MetrologyDlgMaximized != isMaximized || ls.MetrologyDlgLeft != left || ls.MetrologyDlgTop != top || ls.MetrologyDlgWidth != width || ls.MetrologyDlgHeight != height)) { /// At least one MetrologyDlg dimension differs => Update local settings and save them ls.MetrologyDlgMaximized = isMaximized; ls.MetrologyDlgLeft = left; ls.MetrologyDlgTop = top; ls.MetrologyDlgWidth = width; ls.MetrologyDlgHeight = height; ls.Save(); } } private void LoadUISettings() { TBF.LocalSettings ls = Program.LocalSettings; WindowState = (ls.MetrologyDlgMaximized ? FormWindowState.Maximized : FormWindowState.Normal); Width = (ls.MetrologyDlgWidth > 0) ? ls.MetrologyDlgWidth : 900; Height = (ls.MetrologyDlgHeight > 0) ? ls.MetrologyDlgHeight : 500; Left = (ls.MetrologyDlgLeft != 0) ? ls.MetrologyDlgLeft : 200; Top = (ls.MetrologyDlgTop != 0) ? ls.MetrologyDlgTop : 100; } private void addButton_Click(object sender, EventArgs e) { (metrologyTabControl.SelectedTab.Tag as IMetrologyDlgTab).AddOne(); } private void removeButton_Click(object sender, EventArgs e) { (metrologyTabControl.SelectedTab.Tag as IMetrologyDlgTab).RemoveSelected(); } public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) { if (selectedItemPos == SharedButtons.SelectedItemPos.None) { sharedButtons.DisableButtons(SharedButtons.Buttons.Remove); } else { sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); } } private void metrologyTabControl_SelectedIndexChanged(object sender, EventArgs e) { sharedButtons.DisableButtons(SharedButtons.Buttons.Remove); } private void MetrologyDlg_FormClosing(object sender, FormClosingEventArgs e) { if (Users.CurrentUser.Restore(this)) Program.MainWnd.UpdateUser(); if (Session != null && Session.IsOpen) Session.Close(); } } }