From 7f75af7119cbe21fb08a854867400608994aaa39 Mon Sep 17 00:00:00 2001 From: mschill Date: Thu, 25 Jun 2026 15:46:25 -0400 Subject: [PATCH 01/11] B2026-052 - Issue when parens inside a Hardspaced Multi-RO Return Values. PROMS crashes when doing an update ROFst. --- .../Config/ROFSTLookup.cs | 255 ++++++++++-------- 1 file changed, 142 insertions(+), 113 deletions(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Config/ROFSTLookup.cs b/PROMS/VEPROMS.CSLA.Library/Config/ROFSTLookup.cs index 72eb066c..fe72f0f8 100644 --- a/PROMS/VEPROMS.CSLA.Library/Config/ROFSTLookup.cs +++ b/PROMS/VEPROMS.CSLA.Library/Config/ROFSTLookup.cs @@ -8,7 +8,6 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; -using static System.Net.Mime.MediaTypeNames; namespace VEPROMS.CSLA.Library @@ -61,7 +60,8 @@ namespace VEPROMS.CSLA.Library #region Structs / Internal Classes [Serializable] - public struct roHdr + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "Keep Older Pre-existing naming conventions")] + public struct roHdr { public int hSize; public int hYear; @@ -78,7 +78,8 @@ namespace VEPROMS.CSLA.Library }; [Serializable] - public struct rodbi + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "Keep Older Pre-existing naming conventions")] + public struct rodbi { public int dbiID; public int dbiType; @@ -91,7 +92,8 @@ namespace VEPROMS.CSLA.Library }; [Serializable] - public struct rogrp + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "Keep Older Pre-existing naming conventions")] + public struct rogrp { public string value; public string appid; @@ -102,7 +104,8 @@ namespace VEPROMS.CSLA.Library }; [Serializable] - public struct rochild + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "Keep Older Pre-existing naming conventions")] + public struct rochild { public int ID; public int ParentID; @@ -133,7 +136,7 @@ namespace VEPROMS.CSLA.Library private List _baseAccPageKeys; // RofstLookup/Conversion Variables - private int _rofstID; + private readonly int _rofstID; private DocVersionInfo _myDocVersionInfo; private int _selectedSlave; private string _otherChild = string.Empty; @@ -149,7 +152,7 @@ namespace VEPROMS.CSLA.Library // B2022-107: Display Progress Bar Messages/Statuses when a new ROFST binary file is loaded into the database private frmRofstLoadStatus _frmRofstLoadStatus = null; private Dictionary _dicRoCounts = null; - private bool _showLoadingStatus = true; + private readonly bool _showLoadingStatus = true; private int _curRoCnt = 0; private int _dbRoCnt = 0; @@ -414,7 +417,6 @@ namespace VEPROMS.CSLA.Library ROFSTLookup.rochild rc = RofstDataGetChildByAccPageID(_rofstID, accPageBase); - //if (rc.ID >=0 && rc.roid.Length < 16 && Regex.IsMatch(accPageKey, @".*\.[A-Z]") && rc.children != null && rc.children.Count() > 0) if (rc.ID >= 0 && rc.roid.Length < 16 && !string.IsNullOrEmpty(accPageExt) && rc.children != null && rc.children.Count() > 0) { // Check if AccPageID/Key has a return value specific extension. Try to find the RoChild record with the specific return value type, @@ -507,8 +509,6 @@ namespace VEPROMS.CSLA.Library // B2023-037: Handle <=, >=, +-, -> and <- symbols. Convert to unicode for output, i.e. print and edit/view (when editing // step, will show as 2 characters, not unicode, unless ro inserted when code replaced link text with unicode. - //(_MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.UseDashGreaterLessThenForArrowsInROValue || - // _MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertGTELTEPMinROValue)) bool arrows1 = myiteminfo.ActiveFormat.PlantFormat.FormatData.SectData.UseDashGreaterLessThenForArrowsInROValue; bool arrows2 = myiteminfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertGTELTEPMinROValue; @@ -681,11 +681,10 @@ namespace VEPROMS.CSLA.Library if (minutes > 0) duration = string.Format("{0} min(s) ", minutes.ToString("n0")); if (secs < 0) secs = 0.00; - duration = duration + string.Format("{0,10:#####0.00} sec(s)", secs).Trim(); + duration += string.Format("{0,10:#####0.00} sec(s)", secs).Trim(); return duration; - //return string.Format("{0,10:#####0.00}", TimeSpan.FromTicks(DateTime.Now.Ticks - dtStart.Ticks).TotalSeconds); } //C2026-008 Re-Architect RO.FST to include RO Modification date/time @@ -1475,21 +1474,22 @@ namespace VEPROMS.CSLA.Library private ROFSTLookup.roHdr ConvertFst2Objects(byte[] ab) { - ROFSTLookup.roHdr roh = new ROFSTLookup.roHdr(); + ROFSTLookup.roHdr roh = new ROFSTLookup.roHdr + { + hSize = BitConverter.ToInt32(ab, 0), + hYear = BitConverter.ToInt16(ab, 4), + hMonth = ab[6], + hDay = ab[7], + hcYear = BitConverter.ToInt16(ab, 8), + hcMonth = ab[10], + hcDay = ab[11], + hcHour = ab[12], + hcMin = ab[13], + hcSec = ab[14], + hcHund = ab[15] + }; - roh.hSize = BitConverter.ToInt32(ab, 0); - roh.hYear = BitConverter.ToInt16(ab, 4); - roh.hMonth = ab[6]; - roh.hDay = ab[7]; - roh.hcYear = BitConverter.ToInt16(ab, 8); - roh.hcMonth = ab[10]; - roh.hcDay = ab[11]; - roh.hcHour = ab[12]; - roh.hcMin = ab[13]; - roh.hcSec = ab[14]; - roh.hcHund = ab[15]; - - int hdrOffset = BitConverter.ToInt32(ab, 16); + int hdrOffset = BitConverter.ToInt32(ab, 16); int dbs = BitConverter.ToInt16(ab, hdrOffset + 4); roh.myDbs = new ROFSTLookup.rodbi[dbs]; @@ -1525,12 +1525,13 @@ namespace VEPROMS.CSLA.Library private ROFSTLookup.rogrp LoadGroup(byte[] ab, int offset, int tableID) { - ROFSTLookup.rogrp myGrp = new ROFSTLookup.rogrp(); + ROFSTLookup.rogrp myGrp = new ROFSTLookup.rogrp + { + ID = BitConverter.ToInt32(ab, offset), + ParentID = BitConverter.ToInt32(ab, offset + 4) + }; - myGrp.ID = BitConverter.ToInt32(ab, offset); - myGrp.ParentID = BitConverter.ToInt32(ab, offset + 4); - - int numChildren = BitConverter.ToInt16(ab, offset + 8); + int numChildren = BitConverter.ToInt16(ab, offset + 8); if (numChildren > 0) { @@ -1660,7 +1661,7 @@ namespace VEPROMS.CSLA.Library } // Update Progress Bar Accordingly - if (_totalRoCnt > 0) _pctComplete = _pctComplete + ((Convert.ToDouble(_dbRoCnt) / Convert.ToDouble(_totalRoCnt)) * 80.0); + if (_totalRoCnt > 0) _pctComplete += ((Convert.ToDouble(_dbRoCnt) / Convert.ToDouble(_totalRoCnt)) * 80.0); OnProgressChanged(displayText, Convert.ToInt32(_pctComplete), 100); } @@ -1720,15 +1721,13 @@ namespace VEPROMS.CSLA.Library protected virtual void OnProgressChanged(string title, string displayText, int curVal = 0, int maxVal = 100) { // If frmRofstLoadStatus is not null then call Update Progress Method - if (_frmRofstLoadStatus != null) - _frmRofstLoadStatus.UpdateProgress(title, displayText, curVal, maxVal); + _frmRofstLoadStatus?.UpdateProgress(title, displayText, curVal, maxVal); } protected virtual void OnProgressChanged(string displayText, int curVal = 0, int maxVal = 100) { // If frmRofstLoadStatus is not null then call Update Progress Method - if (_frmRofstLoadStatus != null) - _frmRofstLoadStatus.UpdateProgress(_frmRofstLoadStatus.Title, displayText, curVal, maxVal); + _frmRofstLoadStatus?.UpdateProgress(_frmRofstLoadStatus.Title, displayText, curVal, maxVal); } #endregion @@ -1739,21 +1738,22 @@ namespace VEPROMS.CSLA.Library private ROFSTLookup.roHdr ConvertToRoHdrObject(SafeDataReader dr, bool loadChildren) { - ROFSTLookup.roHdr rh = new ROFSTLookup.roHdr(); + ROFSTLookup.roHdr rh = new ROFSTLookup.roHdr + { + hSize = (int)dr.GetValue("hSize"), + hYear = (int)dr.GetValue("hYear"), + hMonth = (byte)dr.GetValue("hMonth"), + hDay = (byte)dr.GetValue("hDay"), + hcYear = (int)dr.GetValue("hcYear"), + hcMonth = (byte)dr.GetValue("hcMonth"), + hcDay = (byte)dr.GetValue("hcDay"), + hcHour = (byte)dr.GetValue("hcHour"), + hcMin = (byte)dr.GetValue("hcMin"), + hcSec = (byte)dr.GetValue("hcSec"), + hcHund = (byte)dr.GetValue("hcHund") + }; - rh.hSize = (int)dr.GetValue("hSize"); - rh.hYear = (int)dr.GetValue("hYear"); - rh.hMonth = (byte)dr.GetValue("hMonth"); - rh.hDay = (byte)dr.GetValue("hDay"); - rh.hcYear = (int)dr.GetValue("hcYear"); - rh.hcMonth = (byte)dr.GetValue("hcMonth"); - rh.hcDay = (byte)dr.GetValue("hcDay"); - rh.hcHour = (byte)dr.GetValue("hcHour"); - rh.hcMin = (byte)dr.GetValue("hcMin"); - rh.hcSec = (byte)dr.GetValue("hcSec"); - rh.hcHund = (byte)dr.GetValue("hcHund"); - - if (loadChildren) + if (loadChildren) { rh.myDbs = RofstDataGetDatabases(_rofstID); } @@ -1763,17 +1763,18 @@ namespace VEPROMS.CSLA.Library private ROFSTLookup.rodbi ConvertToRodbiObject(SafeDataReader dr, bool loadChildren, bool loadAllChildren) { - ROFSTLookup.rodbi rd = new ROFSTLookup.rodbi(); + ROFSTLookup.rodbi rd = new ROFSTLookup.rodbi + { + dbiID = (int)dr.GetValue("dbiID"), + dbiType = (int)dr.GetValue("dbiType"), + dbiAW = (int)dr.GetValue("dbiAW"), + dbiAP = (string)dr.GetValue("dbiAP"), + dbiTitle = (string)dr.GetValue("dbiTitle"), + ID = (int)dr.GetValue("ID"), + ParentID = (int)dr.GetValue("ParentID") + }; - rd.dbiID = (int)dr.GetValue("dbiID"); - rd.dbiType = (int)dr.GetValue("dbiType"); - rd.dbiAW = (int)dr.GetValue("dbiAW"); - rd.dbiAP = (string)dr.GetValue("dbiAP"); - rd.dbiTitle = (string)dr.GetValue("dbiTitle"); - rd.ID = (int)dr.GetValue("ID"); - rd.ParentID = (int)dr.GetValue("ParentID"); - - if (loadChildren || loadAllChildren) + if (loadChildren || loadAllChildren) { rd.children = RofstDataGetChildrenByID(_rofstID, rd.dbiID, rd.ID, false, loadAllChildren); } @@ -1783,15 +1784,16 @@ namespace VEPROMS.CSLA.Library private ROFSTLookup.rochild ConvertToRochildObject(SafeDataReader dr, bool loadChildren, bool loadAllChildren) { - ROFSTLookup.rochild rc = new ROFSTLookup.rochild(); + ROFSTLookup.rochild rc = new ROFSTLookup.rochild + { + ID = (int)dr.GetValue("ID"), + ParentID = (int)dr.GetValue("ParentID"), + type = (int)dr.GetValue("type"), + title = (string)dr.GetValue("title"), + roid = (string)dr.GetValue("roid") + }; - rc.ID = (int)dr.GetValue("ID"); - rc.ParentID = (int)dr.GetValue("ParentID"); - rc.type = (int)dr.GetValue("type"); - rc.title = (string)dr.GetValue("title"); - rc.roid = (string)dr.GetValue("roid"); - - if (!string.IsNullOrEmpty((string)dr.GetValue("appid"))) + if (!string.IsNullOrEmpty((string)dr.GetValue("appid"))) { rc.appid = (string)dr.GetValue("AccPageID"); @@ -1811,13 +1813,14 @@ namespace VEPROMS.CSLA.Library private ROFSTLookup.RoExtension ConvertToRoExtensionObject(SafeDataReader dr) { - ROFSTLookup.RoExtension re = new ROFSTLookup.RoExtension(); + ROFSTLookup.RoExtension re = new ROFSTLookup.RoExtension + { + Offset = (int)dr.GetValue("Offset"), + RoidExt = (string)dr.GetValue("RoidExt"), + AccPageExt = (string)dr.GetValue("AccPageExt") + }; - re.Offset = (int)dr.GetValue("Offset"); - re.RoidExt = (string)dr.GetValue("RoidExt"); - re.AccPageExt = (string)dr.GetValue("AccPageExt"); - - return re; + return re; } #endregion @@ -1875,7 +1878,6 @@ namespace VEPROMS.CSLA.Library // Instead of returning the RoChildBase object with a single RoReturnVal object attached, just return the single Ro ReturnValue object. var roRetVal = child.children.First(); - //child.title = roRetVal.title; child.appid = roRetVal.appid; child.roid = roRetVal.roid; child.value = roRetVal.value; @@ -2129,44 +2131,71 @@ namespace VEPROMS.CSLA.Library return ProcessRO(match, multiRtnVal); } - private string ProcessMacros(string str) - { - // Takes the RO text value and sees if a macro has been used. - // If so it will perform the macro operation on the substring in the text value - // Note** Right now the only macro is @HSP(), where every space between the "(" and ")" will be replaced with a hard space + // Takes the RO text value and sees if a macro has been used. + // If so it will perform the macro operation on the substring in the text value + // Note** Right now the only macro is @HSP(), where every space between the "(" and ")" will be replaced with a hard space + private static string ProcessMacros(string str) + { - if (string.IsNullOrEmpty(str)) - return str; + if (string.IsNullOrEmpty(str) || str.ToUpper().IndexOf("@HSP(") < 0) + return str; - string rtnstr = str; - int indx; - while ((indx = rtnstr.ToUpper().IndexOf("@HSP(")) > -1) - { - string resstr = rtnstr.Substring(0, indx); - int endHsp = rtnstr.IndexOf(")", indx); + string processingstr = str; //holds current string being processed + int indx; //current position of @HSP( in string + int endpos = 0; //end of last parens - //B2026 - 002 handle if parens inside a HSP - int startpos = indx + 5; - while (rtnstr.Substring(startpos, endHsp - startpos).Contains("(")) - { - startpos = rtnstr.IndexOf("(", startpos + 1, endHsp - startpos) + 1; - endHsp = rtnstr.IndexOf(")", endHsp + 1); - } + StringBuilder sb = new StringBuilder(); + Stack endparens = new Stack(); - string tmpstr = rtnstr.Substring(indx + 5, endHsp - indx - 5); + while ((indx = processingstr.ToUpper().IndexOf("@HSP(")) > -1) + { + sb.Append(processingstr.Substring(0, indx)); // initial string before @HSP( - // B2017-012 Don't convert space to hard spaces for XY Plots. - if (!tmpstr.Contains("< 0) + { + //if cloing parens and it matches an opening parens inside of HSP, remove a level + _ = endparens.Pop(); + } + else if (ch == ')' && endparens.Count == 0) + { + //if closing parens and at same level as HSP, break out since found correct closing parens + endpos = i; + break; + } + else if (i == processingstr.Length - 1) + { + //if hit the end of the string and no matching closing parens found, take to the end of the string + endpos = processingstr.Length; + } + } - return rtnstr; - } + //Add the text inside the @HSP(...) + string tmpstr = processingstr.Substring(indx + 5, endpos - indx - 5); + // B2017-012 Don't convert space to hard spaces for XY Plots. + if (!tmpstr.Contains("<= processingstr.Length ? "" : processingstr.Substring(endpos + 1); + } + + //add text after last end parens + sb.Append(processingstr); + + return sb.ToString(); + } + + private int StringLength(byte[] ab, int offset) { int i = 0; while (ab[i + offset] != 0) i++; @@ -2275,7 +2304,7 @@ namespace VEPROMS.CSLA.Library { rc.roid = FormatRoidKey(roid).Substring(0, 12); - DocVersionConfig dvc = (_myDocVersionInfo != null) ? _myDocVersionInfo.DocVersionConfig : null; + DocVersionConfig dvc = _myDocVersionInfo?.DocVersionConfig; if (dvc != null) dvc.SelectedSlave = this.SelectedSlave; switch (rc.roid) @@ -2283,49 +2312,49 @@ namespace VEPROMS.CSLA.Library case "FFFF00000001": rc.title = "Number"; rc.appid = "U-NUMBER"; - rc.value = (dvc != null) ? dvc.Unit_Number : null; + rc.value = dvc?.Unit_Number; break; case "FFFF00000002": rc.title = "Other Number"; rc.appid = "U-OTHERNUMBER"; - rc.value = (dvc != null) ? dvc.Other_Unit_Number : null; + rc.value = dvc?.Other_Unit_Number; break; case "FFFF00000003": rc.title = "Text"; rc.appid = "U-TEXT"; - rc.value = (dvc != null) ? dvc.Unit_Text : null; + rc.value = dvc?.Unit_Text; break; case "FFFF00000004": rc.title = "Other Text"; rc.appid = "U-OTHERTEXT"; - rc.value = (dvc != null) ? dvc.Other_Unit_Text : null; + rc.value = dvc?.Other_Unit_Text; break; case "FFFF00000005": rc.title = "ID"; rc.appid = "U-ID"; - rc.value = (dvc != null) ? dvc.Unit_ID : null; + rc.value = dvc?.Unit_ID; break; case "FFFF00000006": rc.title = "Other ID"; rc.appid = "U-OTHERID"; - rc.value = (dvc != null) ? dvc.Other_Unit_ID : null; + rc.value = dvc?.Other_Unit_ID; break; case "FFFF00000007": rc.title = "Name"; rc.appid = "U-NAME"; - rc.value = (dvc != null) ? dvc.Unit_Name : null; + rc.value = dvc?.Unit_Name; break; case "FFFF00000008": rc.title = "Other Name"; rc.appid = "U-OTHERNAME"; - rc.value = (dvc != null) ? dvc.Other_Unit_Name : null; + rc.value = dvc?.Other_Unit_Name; break; } From 94db524a119ec021d4f28bdb0cf575b64bea7dfb Mon Sep 17 00:00:00 2001 From: mschill Date: Mon, 29 Jun 2026 09:51:48 -0400 Subject: [PATCH 02/11] =?UTF-8?q?B2026-057=20-=20Issue=20when=20ROs=20are?= =?UTF-8?q?=20out=20of=20date=20and=20swapping=20between=20sets=20?= =?UTF-8?q?=E2=80=93=20sometimes=20asked=20if=20want=20to=20update=20ROs?= =?UTF-8?q?=20twice=20if=20said=20no=20the=20first=20time.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROMS/Volian.Controls.Library/DisplayRO.cs | 1976 ++++++++++---------- 1 file changed, 996 insertions(+), 980 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplayRO.cs b/PROMS/Volian.Controls.Library/DisplayRO.cs index 35216fff..2252e704 100644 --- a/PROMS/Volian.Controls.Library/DisplayRO.cs +++ b/PROMS/Volian.Controls.Library/DisplayRO.cs @@ -2,13 +2,12 @@ using DevComponents.DotNetBar; using JR.Utils.GUI.Forms; using System; using System.Collections.Generic; -using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; -using System.Text; using System.Text.RegularExpressions; +using System.Threading.Tasks; using System.Windows.Forms; using VEPROMS.CSLA.Library; using Volian.Base.Library; @@ -16,47 +15,47 @@ using XYPlots; namespace Volian.Controls.Library { - public partial class DisplayRO : UserControl - { - #region Log4Net + public partial class DisplayRO : UserControl + { + #region Log4Net - private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - #endregion + #endregion - #region Fields + #region Fields - private const string DummyNodeText = "VLN_DUMMY_NODE"; - private const int MaxNumSearchRecords = 1000; + private const string DummyNodeText = "VLN_DUMMY_NODE"; + private const int MaxNumSearchRecords = 1000; - // B2019-161 When tracking timing time this action - private static VolianTimer _timeActivity = new VolianTimer("DisplayRO MyRTB_SelectionChanged", 117); - private static Regex _regExGetNumber = new Regex(@"^ *[+-]?[.,0-9/]+(E[+-]?[0-9]+)?"); - private static UserInfo _myUserInfo = null; + // B2019-161 When tracking timing time this action + private static VolianTimer _timeActivity = new VolianTimer("DisplayRO MyRTB_SelectionChanged", 117); + private static Regex _regExGetNumber = new Regex(@"^ *[+-]?[.,0-9/]+(E[+-]?[0-9]+)?"); + private static UserInfo _myUserInfo = null; - private Timer _searchTimer = null; - private string _lastSearchValue = string.Empty; + private Timer _searchTimer = null; + private string _lastSearchValue = string.Empty; - private ProgressBarItem _progressBar; - private DisplayTabControl _tabControl; - private StepRTB _myRTB; - private string _selectedRoidBeforeRoEditor = null; + private ProgressBarItem _progressBar; + private DisplayTabControl _tabControl; + private StepRTB _myRTB; + private string _selectedRoidBeforeRoEditor = null; - private ROFstInfo _myROFST; - private DocVersionInfo _docVersionInfo; - private RoUsageInfo _savCurROLink; - private E_ROValueType _roTypeFilter = E_ROValueType.All; + private ROFstInfo _myROFST; + private DocVersionInfo _docVersionInfo; + private RoUsageInfo _savCurROLink; + private E_ROValueType _roTypeFilter = E_ROValueType.All; - //private ROFstInfo _curROFST = null; - private int? _currRofstID = null; - private int? _currDocVersionID = null; - - private RoUsageInfo _curROLink; - private E_ROValueType _curROTypeFilter = E_ROValueType.All; + //private ROFstInfo _curROFST = null; + private int? _currRofstID = null; + private int? _currDocVersionID = null; - private ROFSTLookup.rochild selectedChld; + private RoUsageInfo _curROLink; + private E_ROValueType _curROTypeFilter = E_ROValueType.All; - private DisplayTags displayTags; + private ROFSTLookup.rochild selectedChld; + + private DisplayTags displayTags; #endregion @@ -64,205 +63,210 @@ namespace Volian.Controls.Library #region Properties public ProgressBarItem ProgressBar - { - get { return _progressBar; } - set { _progressBar = value; } - } + { + get { return _progressBar; } + set { _progressBar = value; } + } - public DisplayTabControl TabControl - { - get { return _tabControl; } - set { _tabControl = value; } - } + public DisplayTabControl TabControl + { + get { return _tabControl; } + set { _tabControl = value; } + } - public bool IsRofstValid - { - get { return (_myROFST != null && _myROFST.ROFstAssociations != null && _myROFST.ROFstAssociationCount > 0); } - } + public bool IsRofstValid + { + get { return (_myROFST != null && _myROFST.ROFstAssociations != null && _myROFST.ROFstAssociationCount > 0); } + } - public bool RoTreeNeedsReloaded - { + public bool RoTreeNeedsReloaded + { get { return (MyROFST != null && _currRofstID != null && MyROFST.ROFstID != (int)_currRofstID) || - (MyDvi != null && _currDocVersionID != null && MyDvi.VersionID != (int)_currDocVersionID) || - // B2022-142 check if we went from a RO Table or RO Figure step type to a regular step type - // or if we went from a regular step type to a RO Table or RO Figure step type + (MyDvi != null && _currDocVersionID != null && MyDvi.VersionID != (int)_currDocVersionID) || + // B2022-142 check if we went from a RO Table or RO Figure step type to a regular step type + // or if we went from a regular step type to a RO Table or RO Figure step type (_myRTB != null && (_myRTB.IsRoTable != lastRTBwasROTable || _myRTB.IsRoFigure != lastRTBwasROFigure)); } - } + } - //This flag will be set when the docversion gets updated to let it know that the full tree needs a refresh - private bool changedDocVersion = false; + //This flag will be set when the docversion gets updated to let it know that the full tree needs a refresh + private bool changedDocVersion = false; + + //B2026-057 PROMS Crash when Closing Tabs + // this flag will prevent multiple asking in a row if should updste ROs + private static bool askedAboutchangedDocVersion = false; public ROFstInfo MyROFST - { - get { return _myROFST; } - set - { - // Define the tree nodes based on this rofst/docversion - // Rofst is required, DocVersion can be null. If Rofst is null then make DocVersion null - if (_myROFST != value) - { - if (value == null) - { - _myROFST = null; - MyDvi = null; - } - else - { - _myROFST = value; + { + get { return _myROFST; } + set + { + // Define the tree nodes based on this rofst/docversion + // Rofst is required, DocVersion can be null. If Rofst is null then make DocVersion null + if (_myROFST != value) + { + if (value == null) + { + _myROFST = null; + MyDvi = null; + } + else + { + _myROFST = value; - if (MyDvi == null) - { - MyDvi = (IsRofstValid) ? _myROFST.ROFstAssociations[0].MyDocVersion : null; - } - } + if (MyDvi == null) + { + MyDvi = (IsRofstValid) ? _myROFST.ROFstAssociations[0].MyDocVersion : null; + } + } - // B2022-123: RO Tab Treeview not showing correct RO values when switching between procedures. - _currRofstID = (IsRofstValid) ? (int?)_myROFST.ROFstID : null; - } - } - } + // B2022-123: RO Tab Treeview not showing correct RO values when switching between procedures. + _currRofstID = (IsRofstValid) ? (int?)_myROFST.ROFstID : null; + } + } + } - public DocVersionInfo MyDvi - { - // B2022-135 Submitted for Admin Tools (Check RO Links tool) - get { return (_myRTB != null) ? _myRTB.MyDVI : _docVersionInfo; } - set - { - // B2022-135 Submitted for Admin Tools (Check RO Links tool) - if (_docVersionInfo == null || _docVersionInfo != value || _docVersionInfo.VersionID != value.VersionID) - { - //Set flag for modified the docversion - should check for new ROs + public DocVersionInfo MyDvi + { + // B2022-135 Submitted for Admin Tools (Check RO Links tool) + get { return (_myRTB != null) ? _myRTB.MyDVI : _docVersionInfo; } + set + { + // B2022-135 Submitted for Admin Tools (Check RO Links tool) + if (_docVersionInfo == null || _docVersionInfo != value || _docVersionInfo.VersionID != value.VersionID) + { + //Set flag for modified the docversion - should check for new ROs if (_docVersionInfo?.VersionID != value?.VersionID) { changedDocVersion = true; + askedAboutchangedDocVersion = false; } _docVersionInfo = value; - if (_myRTB != null && (_docVersionInfo == null || _docVersionInfo.VersionID != _myRTB.MyDVI.VersionID)) - { - _docVersionInfo = _myRTB.MyDVI; - } + if (_myRTB != null && (_docVersionInfo == null || _docVersionInfo.VersionID != _myRTB.MyDVI.VersionID)) + { + _docVersionInfo = _myRTB.MyDVI; + } } // B2022-123: RO Tab Treeview not showing correct RO values when switching between procedures. _currDocVersionID = (_docVersionInfo != null) ? (int?)_docVersionInfo.VersionID : null; - } - } + } + } - public ROFSTLookup MyROFSTLookup - { + public ROFSTLookup MyROFSTLookup + { get { return (_myROFST != null) ? new ROFSTLookup(_myROFST.ROFstID, _docVersionInfo) : null;} - } + } - public E_ROValueType ROTypeFilter - { - get { return _roTypeFilter; } + public E_ROValueType ROTypeFilter + { + get { return _roTypeFilter; } set {_roTypeFilter = value; } - } + } - public RoUsageInfo CurROLink - { - get { return _curROLink; } - set - { - // Volian.Base.Library.vlnStackTrace.ShowStack("value={0} MyRTB={1}", value, ((MyRTB != null) ? MyRTB.SelectedText : "" )); + public RoUsageInfo CurROLink + { + get { return _curROLink; } + set + { + // Volian.Base.Library.vlnStackTrace.ShowStack("value={0} MyRTB={1}", value, ((MyRTB != null) ? MyRTB.SelectedText : "" )); - // modify - set the controls to the current ro - if (value != null) - { - if (_curROLink != value) - { - _curROLink = value; - _savCurROLink = _curROLink; + // modify - set the controls to the current ro + if (value != null) + { + if (_curROLink != value) + { + _curROLink = value; + _savCurROLink = _curROLink; - // B2022-088: [JPR] Find Doc Ro button not working in Word Sections - // B2022-098: [JPR] ROs not being resolved in Word Sections - string roid = ROFSTLookup.FormatRoidKey(_curROLink.ROID, true); - ExpandNode(roid); - } - } - else // if (_curROLink != null) // insert - clear out controls - { - _curROLink = value; - tvROFST.SelectedNode = null; - ResetSearch(); + // B2022-088: [JPR] Find Doc Ro button not working in Word Sections + // B2022-098: [JPR] ROs not being resolved in Word Sections + string roid = ROFSTLookup.FormatRoidKey(_curROLink.ROID, true); + ExpandNode(roid); + } + } + else // if (_curROLink != null) // insert - clear out controls + { + _curROLink = value; + tvROFST.SelectedNode = null; + ResetSearch(); - } - } - } + } + } + } - // B2022-142 added this local variables to keep flag if the last step type was a RO Table or a RO Figure - // this is used to determin if we need to re-load the RO tree - private bool lastRTBwasROTable = false; - private bool lastRTBwasROFigure = false; - public StepRTB MyRTB - { - get { return _myRTB; } - set - { - if (value == null) - { - _myRTB = value; - MyROFST = null; + // B2022-142 added this local variables to keep flag if the last step type was a RO Table or a RO Figure + // this is used to determin if we need to re-load the RO tree + private bool lastRTBwasROTable = false; + private bool lastRTBwasROFigure = false; + public StepRTB MyRTB + { + get { return _myRTB; } + set + { + if (value == null) + { + _myRTB = value; + MyROFST = null; - // B2022-088: [JPR] Find Doc Ro button not working in Word Sections - // B2022-098: [JPR] ROs not being resolved in Word Sections - CurROLink = null; - _savCurROLink = null; + // B2022-088: [JPR] Find Doc Ro button not working in Word Sections + // B2022-098: [JPR] ROs not being resolved in Word Sections + CurROLink = null; + _savCurROLink = null; //Clear flag for modified the docversion (if should check for new ROs) - //clearing this flag here prevents it from checking twice + //clearing this flag here prevents it from checking twice changedDocVersion = false; } else if(_myRTB != value) - { - if (_myRTB != null) - { - lastRTBwasROTable = _myRTB.IsRoTable; // B2022-141 save whether last RTB was a RO Table - lastRTBwasROFigure = _myRTB.IsRoFigure; // B2022-141 save whether last RTB was a RO Figure - } - _myRTB = value; + { + if (_myRTB != null) + { + lastRTBwasROTable = _myRTB.IsRoTable; // B2022-141 save whether last RTB was a RO Table + lastRTBwasROFigure = _myRTB.IsRoFigure; // B2022-141 save whether last RTB was a RO Figure + } + _myRTB = value; - MyRTB.LinkChanged -= new StepRTBLinkEvent(MyRTB_LinkChanged); - MyRTB.LinkChanged += new StepRTBLinkEvent(MyRTB_LinkChanged); - MyRTB.SelectionChanged -= new EventHandler(MyRTB_SelectionChanged); - MyRTB.SelectionChanged += new EventHandler(MyRTB_SelectionChanged); + MyRTB.LinkChanged -= new StepRTBLinkEvent(MyRTB_LinkChanged); + MyRTB.LinkChanged += new StepRTBLinkEvent(MyRTB_LinkChanged); + MyRTB.SelectionChanged -= new EventHandler(MyRTB_SelectionChanged); + MyRTB.SelectionChanged += new EventHandler(MyRTB_SelectionChanged); - if (string.IsNullOrEmpty(MyRTB.MyLinkText)) - { - CurROLink = null; - _savCurROLink = null; - } + if (string.IsNullOrEmpty(MyRTB.MyLinkText)) + { + CurROLink = null; + _savCurROLink = null; + } // B2023-004 assign the doc version info associated with the current RTB (rich text box) // this fixes an issue where unit designators could not be linked in the step edit (BNPP data) MyDvi = _myRTB.MyItemInfo.MyDocVersion; - MyROFST = (_myRTB.MyItemInfo.MyDocVersion.DocVersionAssociationCount > 0) ? _myRTB.MyItemInfo.MyDocVersion.DocVersionAssociations[0].MyROFst : null; - } - } - } + MyROFST = (_myRTB.MyItemInfo.MyDocVersion.DocVersionAssociationCount > 0) ? _myRTB.MyItemInfo.MyDocVersion.DocVersionAssociations[0].MyROFst : null; + } + } + } - public bool IsEnhancedStep - { - get { return (MyRTB != null && MyRTB.MyItemInfo != null && MyRTB.MyItemInfo.IsEnhancedStep); } - } + public bool IsEnhancedStep + { + get { return (MyRTB != null && MyRTB.MyItemInfo != null && MyRTB.MyItemInfo.IsEnhancedStep); } + } - public bool IsNotStep - { - get { return (MyRTB != null && MyRTB.MyItemInfo != null && (MyRTB.MyItemInfo.IsProcedure || MyRTB.MyItemInfo.IsSection)); } - } + public bool IsNotStep + { + get { return (MyRTB != null && MyRTB.MyItemInfo != null && (MyRTB.MyItemInfo.IsProcedure || MyRTB.MyItemInfo.IsSection)); } + } - public bool IsInWordDoc - { - get { return (TabControl != null && TabControl.SelectedDisplayTabItem != null && TabControl.SelectedDisplayTabItem.MyDSOTabPanel != null); } - } + public bool IsInWordDoc + { + get { return (TabControl != null && TabControl.SelectedDisplayTabItem != null && TabControl.SelectedDisplayTabItem.MyDSOTabPanel != null); } + } - public static UserInfo MyUserInfo - { - get { return _myUserInfo; } - set { _myUserInfo = value; } - } + public static UserInfo MyUserInfo + { + get { return _myUserInfo; } + set { _myUserInfo = value; } + } public SessionInfo MySessionInfo { get; set; } @@ -271,28 +275,28 @@ namespace Volian.Controls.Library #region Constructors public DisplayRO() - { - InitializeComponent(); + { + InitializeComponent(); - panelRoValue.BackColor = Color.Cornsilk; - panelValue.BackColor = Color.Cornsilk; + panelRoValue.BackColor = Color.Cornsilk; + panelValue.BackColor = Color.Cornsilk; - _currRofstID = null; - _currDocVersionID = null; + _currRofstID = null; + _currDocVersionID = null; - if (_searchTimer == null) - { - _searchTimer = new Timer(); - _searchTimer.Interval = 1000; - _searchTimer.Tick += new EventHandler(SelectionTimer_Tick); - _searchTimer.Stop(); - } + if (_searchTimer == null) + { + _searchTimer = new Timer(); + _searchTimer.Interval = 1000; + _searchTimer.Tick += new EventHandler(SelectionTimer_Tick); + _searchTimer.Stop(); + } - // Initialize the DisplayTags object - displayTags = new DisplayTags(); + // Initialize the DisplayTags object + displayTags = new DisplayTags(); - } + } #endregion #region Event Handlers @@ -348,251 +352,251 @@ namespace Volian.Controls.Library } public void MyRTB_LinkChanged(object sender, StepPanelLinkEventArgs args) - { - CurROLink = null; - if (MyRTB.MyLinkText != null) CurROLink = args.MyLinkText.MyRoUsageInfo; - } + { + CurROLink = null; + if (MyRTB.MyLinkText != null) CurROLink = args.MyLinkText.MyRoUsageInfo; + } - public void MyRTB_SelectionChanged(object sender, EventArgs e) - { - _timeActivity.Open(); + public void MyRTB_SelectionChanged(object sender, EventArgs e) + { + _timeActivity.Open(); - // B2022-088: [JPR] Find Doc Ro button not working in Word Sections - // B2022-098: [JPR] ROs not being resolved in Word Sections - // Need to call Stop then Start just in case the uses has changed their selection - // before the timer.Tick event fires. Calling Stop/Start is the same as Reset for the timer - _searchTimer.Stop(); - _searchTimer.Start(); + // B2022-088: [JPR] Find Doc Ro button not working in Word Sections + // B2022-098: [JPR] ROs not being resolved in Word Sections + // Need to call Stop then Start just in case the uses has changed their selection + // before the timer.Tick event fires. Calling Stop/Start is the same as Reset for the timer + _searchTimer.Stop(); + _searchTimer.Start(); - _timeActivity.Close(); - } + _timeActivity.Close(); + } - private void SelectionTimer_Tick(object sender, EventArgs e) - { - // Stop the timer - _searchTimer.Stop(); + private void SelectionTimer_Tick(object sender, EventArgs e) + { + // Stop the timer + _searchTimer.Stop(); - // Process RO Value Search - if (MyRTB != null && !MyRTB.IsDisposed) - { - ProcessSearch(MyRTB.SelectedText, (int)ROFSTLookup.SearchTypes.StartsWith); - } - } + // Process RO Value Search + if (MyRTB != null && !MyRTB.IsDisposed) + { + ProcessSearch(MyRTB.SelectedText, (int)ROFSTLookup.SearchTypes.StartsWith); + } + } - #endregion + #endregion - #region (Tree Node) + #region (Tree Node) - private void tvROFST_DoubleClick(object sender, EventArgs e) - { - // B2016-132: don't process a double click on an RO if on an enhanced step: - if (!IsEnhancedStep) - { - SaveRO(); - } - } + private void tvROFST_DoubleClick(object sender, EventArgs e) + { + // B2016-132: don't process a double click on an RO if on an enhanced step: + if (!IsEnhancedStep) + { + SaveRO(); + } + } - private void tvROFST_BeforeExpand(object sender, TreeViewCancelEventArgs e) - { - LoadChildren(e.Node); - } + private void tvROFST_BeforeExpand(object sender, TreeViewCancelEventArgs e) + { + LoadChildren(e.Node); + } - private void tvROFST_AfterSelect(object sender, TreeViewEventArgs e) - { - // B2022-088: [JPR] Find Doc Ro button not working in Word Sections - // B2022-098: [JPR] ROs not being resolved in Word Sections - if (e.Node.Tag is ROFSTLookup.rochild) - { - ROFSTLookup.rochild chld = (ROFSTLookup.rochild)e.Node.Tag; - selectedChld = chld; + private void tvROFST_AfterSelect(object sender, TreeViewEventArgs e) + { + // B2022-088: [JPR] Find Doc Ro button not working in Word Sections + // B2022-098: [JPR] ROs not being resolved in Word Sections + if (e.Node.Tag is ROFSTLookup.rochild) + { + ROFSTLookup.rochild chld = (ROFSTLookup.rochild)e.Node.Tag; + selectedChld = chld; - if (chld.value != null) - { - chld.value = Regex.Replace(chld.value, @"\\u([0-9]{1,4})\?", m => int.TryParse(m?.Groups[1]?.Value, out int result) ? Convert.ToChar(result).ToString() : ""); - RoUsageInfo SavROLink = null; - if (_savCurROLink != null) SavROLink = _savCurROLink; + if (chld.value != null) + { + chld.value = Regex.Replace(chld.value, @"\\u([0-9]{1,4})\?", m => int.TryParse(m?.Groups[1]?.Value, out int result) ? Convert.ToChar(result).ToString() : ""); + RoUsageInfo SavROLink = null; + if (_savCurROLink != null) SavROLink = _savCurROLink; - // Set the Display Text to the AccPageID - lbROId.Text = chld.appid; + // Set the Display Text to the AccPageID + lbROId.Text = chld.appid; - //B2017-245 Disable SaveRO button for Procedures and Sections - //B2020-049: Save button not enabled on Word docs, only if a procedure was opened first and immediately after the word document - // section is opened (added 'IsInWorDoc') - btnSaveRO.Enabled = (IsInWordDoc || (!IsNotStep && !IsEnhancedStep)) && UserInfo.CanEdit(MyUserInfo, MyDvi) && ((SavROLink == null) || !(chld.roid.Equals(SavROLink.ROID.ToUpper()))); //added security check (UserInfo.CanEdit) - btnCancelRO.Enabled = (_savCurROLink != null && (SavROLink != null && chld.roid != SavROLink.ROID.ToUpper())); - btnGoToRO.Enabled = UserInfo.CanEditROs(MyUserInfo, MyDvi); // Writers and Reviewers cannot edit ROs (run the RO Editor) + //B2017-245 Disable SaveRO button for Procedures and Sections + //B2020-049: Save button not enabled on Word docs, only if a procedure was opened first and immediately after the word document + // section is opened (added 'IsInWorDoc') + btnSaveRO.Enabled = (IsInWordDoc || (!IsNotStep && !IsEnhancedStep)) && UserInfo.CanEdit(MyUserInfo, MyDvi) && ((SavROLink == null) || !(chld.roid.Equals(SavROLink.ROID.ToUpper()))); //added security check (UserInfo.CanEdit) + btnCancelRO.Enabled = (_savCurROLink != null && (SavROLink != null && chld.roid != SavROLink.ROID.ToUpper())); + btnGoToRO.Enabled = UserInfo.CanEditROs(MyUserInfo, MyDvi); // Writers and Reviewers cannot edit ROs (run the RO Editor) - switch (chld.type) - { - case 1: // standard (regular) text RO type - tbROValue.Text = chld.value; - btnPreviewRO.Enabled = false; - if (chld.roid.StartsWith("FFFF")) btnGoToRO.Enabled = false; - break; + switch (chld.type) + { + case 1: // standard (regular) text RO type + tbROValue.Text = chld.value; + btnPreviewRO.Enabled = false; + if (chld.roid.StartsWith("FFFF")) btnGoToRO.Enabled = false; + break; - case 2: // Table RO type - case 3: // This is type 3 when part of a multiple return value - tbROValue.Text = "(Table)"; - btnPreviewRO.Enabled = true; - break; + case 2: // Table RO type + case 3: // This is type 3 when part of a multiple return value + tbROValue.Text = "(Table)"; + btnPreviewRO.Enabled = true; + break; - case 4: // X/Y Plot RO type - tbROValue.Text = "(Graph)"; - btnPreviewRO.Enabled = true; - break; + case 4: // X/Y Plot RO type + tbROValue.Text = "(Graph)"; + btnPreviewRO.Enabled = true; + break; - case 8: // Integrated Graphics RO type - tbROValue.Text = "(Image)"; - btnPreviewRO.Enabled = true; - break; - } - } - } - else - { - // B2022-088: [JPR] Find Doc Ro button not working in Word Sections - // B2022-098: [JPR] ROs not being resolved in Word Sections - ResetSearch(); - } - } + case 8: // Integrated Graphics RO type + tbROValue.Text = "(Image)"; + btnPreviewRO.Enabled = true; + break; + } + } + } + else + { + // B2022-088: [JPR] Find Doc Ro button not working in Word Sections + // B2022-098: [JPR] ROs not being resolved in Word Sections + ResetSearch(); + } + } - #endregion + #endregion - #region (Buttons) + #region (Buttons) - private void btnSaveRO_Click(object sender, EventArgs e) - { - SaveRO(); - } + private void btnSaveRO_Click(object sender, EventArgs e) + { + SaveRO(); + } - private void btnCancelRO_Click(object sender, EventArgs e) - { - _curROLink = _savCurROLink; - btnCancelRO.Enabled = false; + private void btnCancelRO_Click(object sender, EventArgs e) + { + _curROLink = _savCurROLink; + btnCancelRO.Enabled = false; - ExpandNode(_curROLink.ROID); - } + ExpandNode(_curROLink.ROID); + } - private void btnPreviewRO_Click(object sender, EventArgs e) - { - if (selectedChld.type == 8) // integrated graphic - { - string fname = selectedChld.value.Substring(0, selectedChld.value.IndexOf('\n')); - int thedot = fname.LastIndexOf('.'); - ROImageInfo tmp = null; + private void btnPreviewRO_Click(object sender, EventArgs e) + { + if (selectedChld.type == 8) // integrated graphic + { + string fname = selectedChld.value.Substring(0, selectedChld.value.IndexOf('\n')); + int thedot = fname.LastIndexOf('.'); + ROImageInfo tmp = null; - if (thedot == -1 || (thedot != (fname.Length - 4))) - { - tmp = ROImageInfo.GetByROFstID_FileName(MyROFST.ROFstID, fname); - fname += string.Format(".{0}", MyROFST.MyRODb.RODbConfig.GetDefaultGraphicExtension()); - } + if (thedot == -1 || (thedot != (fname.Length - 4))) + { + tmp = ROImageInfo.GetByROFstID_FileName(MyROFST.ROFstID, fname); + fname += string.Format(".{0}", MyROFST.MyRODb.RODbConfig.GetDefaultGraphicExtension()); + } - if (tmp == null) tmp = ROImageInfo.GetByROFstID_FileName(MyROFST.ROFstID, fname); - if (tmp == null) tmp = MyROFST.GetROImageByFilename(fname, null); + if (tmp == null) tmp = ROImageInfo.GetByROFstID_FileName(MyROFST.ROFstID, fname); + if (tmp == null) tmp = MyROFST.GetROImageByFilename(fname, null); - if (tmp != null) - { - ROImageConfig rc = new ROImageConfig(tmp); - int size = Convert.ToInt32(rc.Image_Size); - PreviewROImage pvROImg = new PreviewROImage(ROImageInfo.Decompress(tmp.Content, size), selectedChld.title); - pvROImg.ShowDialog(); - } - else - { - FlexibleMessageBox.Show(string.Format("Cannot Find Image Data: {0}, {1}", MyROFST.ROFstID, fname)); - } - } - else if (selectedChld.type == 2) // table - { - PreviewMultiLineRO pmlROTable = new PreviewMultiLineRO(selectedChld.value, selectedChld.title); - pmlROTable.ShowDialog(); - } - else if (selectedChld.type == 4) // x/y plot - { - frmXYPlot plot = new frmXYPlot(selectedChld.appid + " - " + selectedChld.title, selectedChld.value); - plot.Show(); - } - } + if (tmp != null) + { + ROImageConfig rc = new ROImageConfig(tmp); + int size = Convert.ToInt32(rc.Image_Size); + PreviewROImage pvROImg = new PreviewROImage(ROImageInfo.Decompress(tmp.Content, size), selectedChld.title); + pvROImg.ShowDialog(); + } + else + { + FlexibleMessageBox.Show(string.Format("Cannot Find Image Data: {0}, {1}", MyROFST.ROFstID, fname)); + } + } + else if (selectedChld.type == 2) // table + { + PreviewMultiLineRO pmlROTable = new PreviewMultiLineRO(selectedChld.value, selectedChld.title); + pmlROTable.ShowDialog(); + } + else if (selectedChld.type == 4) // x/y plot + { + frmXYPlot plot = new frmXYPlot(selectedChld.appid + " - " + selectedChld.title, selectedChld.value); + plot.Show(); + } + } - private void btnGoToRO_Click(object sender, EventArgs e) - { - if (tvROFST.SelectedNode == null) return; - RunRoEditor(); - } + private void btnGoToRO_Click(object sender, EventArgs e) + { + if (tvROFST.SelectedNode == null) return; + RunRoEditor(); + } - private void btnFindDocRO_Click(object sender, EventArgs e) - { - // C2016-044: support click of the 'Find Doc RO' button: - DisplayTabItem dti = (_tabControl == null) ? null : _tabControl.SelectedDisplayTabItem; + private void btnFindDocRO_Click(object sender, EventArgs e) + { + // C2016-044: support click of the 'Find Doc RO' button: + DisplayTabItem dti = (_tabControl == null) ? null : _tabControl.SelectedDisplayTabItem; - if (dti != null && dti.MyDSOTabPanel != null) - { - // the currently selected tab control is a word document - see if it has an - // active selection. If not, tell the user that text needs to be selected before the ro can be found. - string mytext = dti.MyDSOTabPanel.GetSelectedString(); + if (dti != null && dti.MyDSOTabPanel != null) + { + // the currently selected tab control is a word document - see if it has an + // active selection. If not, tell the user that text needs to be selected before the ro can be found. + string mytext = dti.MyDSOTabPanel.GetSelectedString(); - if (string.IsNullOrEmpty(mytext)) - { - FlexibleMessageBox.Show(this, "Text must be selected in the document in order for an RO find to be performed.", "Select Text", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return; - } + if (string.IsNullOrEmpty(mytext)) + { + FlexibleMessageBox.Show(this, "Text must be selected in the document in order for an RO find to be performed.", "Select Text", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } - ProcessSearch(mytext, (int)ROFSTLookup.SearchTypes.StartsWith); - } - } + ProcessSearch(mytext, (int)ROFSTLookup.SearchTypes.StartsWith); + } + } - #endregion + #endregion - #region (Labels) + #region (Labels) - private void lbROId_DoubleClick(object sender, EventArgs e) - { - if (tvROFST.SelectedNode == null) - return; + private void lbROId_DoubleClick(object sender, EventArgs e) + { + if (tvROFST.SelectedNode == null) + return; - // do not allow writers and reviews to run the RO Editor - if (!UserInfo.CanEditROs(MyUserInfo, MyDvi)) - return; + // do not allow writers and reviews to run the RO Editor + if (!UserInfo.CanEditROs(MyUserInfo, MyDvi)) + return; - if (VlnSettings.ReleaseMode.Equals("DEMO")) - { - FlexibleMessageBox.Show("Referenced Object Editor not available in the Demo version.", "PROMS Demo Version"); - return; - } + if (VlnSettings.ReleaseMode.Equals("DEMO")) + { + FlexibleMessageBox.Show("Referenced Object Editor not available in the Demo version.", "PROMS Demo Version"); + return; + } - string roapp = Volian.Base.Library.ExeInfo.GetROEditorPath(); // get the path to the RO Editor Executable - object obj = tvROFST.SelectedNode.Tag; + string roapp = Volian.Base.Library.ExeInfo.GetROEditorPath(); // get the path to the RO Editor Executable + object obj = tvROFST.SelectedNode.Tag; - if (obj is ROFSTLookup.rochild) - { - ROFSTLookup.rochild roch = (ROFSTLookup.rochild)obj; + if (obj is ROFSTLookup.rochild) + { + ROFSTLookup.rochild roch = (ROFSTLookup.rochild)obj; - _selectedRoidBeforeRoEditor = roch.roid; + _selectedRoidBeforeRoEditor = roch.roid; string args = "\"" + MyROFST.MyRODb.FolderPath + "\" " + roch.roid.Substring(0,12).ToLower(); - // C2017-003: ro data in sql server, check for sql connection string - if (MyROFST.MyRODb.DBConnectionString != "cstring") args = args + " \"" + MyROFST.MyRODb.DBConnectionString + "\""; + // C2017-003: ro data in sql server, check for sql connection string + if (MyROFST.MyRODb.DBConnectionString != "cstring") args = args + " \"" + MyROFST.MyRODb.DBConnectionString + "\""; - // C2021-026 pass in Parent/Child information (list of the children) - // B2022-019 look at all DocVersions to find ParentChild information - // to ensure we pass in Parent/Child even when not coming from a Parent/Child procedure set - // B2022-073 Break out of the foreach when we find a set with parent/child information + // C2021-026 pass in Parent/Child information (list of the children) + // B2022-019 look at all DocVersions to find ParentChild information + // to ensure we pass in Parent/Child even when not coming from a Parent/Child procedure set + // B2022-073 Break out of the foreach when we find a set with parent/child information - DocVersionInfoList dvil = DocVersionInfoList.Get(); + DocVersionInfoList dvil = DocVersionInfoList.Get(); - foreach (DocVersionInfo dvi in dvil) - { - DocVersionConfig dvc = dvi.DocVersionConfig; - if (dvc != null && dvc.Unit_Name != "" && dvc.Unit_Count > 1) // B2021-089 only pass in applicability info if defined for more than one unit - { - args += " \"PC=" + dvc.Unit_Name + "\""; - break; - } - } + foreach (DocVersionInfo dvi in dvil) + { + DocVersionConfig dvc = dvi.DocVersionConfig; + if (dvc != null && dvc.Unit_Name != "" && dvc.Unit_Count > 1) // B2021-089 only pass in applicability info if defined for more than one unit + { + args += " \"PC=" + dvc.Unit_Name + "\""; + break; + } + } - System.Diagnostics.Process.Start(roapp, args); - } - } + System.Diagnostics.Process.Start(roapp, args); + } + } private void lbFound_SelectedValueChanged(object sender, EventArgs e) { @@ -619,52 +623,64 @@ namespace Volian.Controls.Library //C2026-008 Re-Architect RO.FST to include RO Modification date/time // changed to return true if the RO FST got updated public bool LoadTree(bool forceReload = false) - { - bool updatedROs = false; + { + bool updatedROs = false; - if (MyROFST == null) - { - tvROFST.Nodes.Clear(); - lbFound.Visible = false; - return updatedROs; - } + if (MyROFST == null) + { + tvROFST.Nodes.Clear(); + lbFound.Visible = false; + return updatedROs; + } - if (changedDocVersion || forceReload || RoTreeNeedsReloaded || tvROFST.Nodes == null || tvROFST.Nodes.Count <= 0) - { + if (changedDocVersion || forceReload || RoTreeNeedsReloaded || tvROFST.Nodes == null || tvROFST.Nodes.Count <= 0) + { //C2026-008 Re-Architect RO.FST to include RO Modification date/time - //check if newer data - if there is, check if user wants to update data + //check if newer data - if there is, check if user wants to update data int fstid = MyROFSTLookup.GetNewerFSTID(); - int origfstid = MyROFSTLookup.RofstID; + int origfstid = MyROFSTLookup.RofstID; if (_docVersionInfo != null && fstid != -1 && fstid != MyROFSTLookup.RofstID) - { + { string message = string.Empty; if (_progressBar?.Text != "Cannot check-out Working Draft" && !MySessionInfo.CanCheckOutItem(_docVersionInfo.VersionID, CheckOutType.DocVersion, ref message)) { FlexibleMessageBox.Show(this, message, "Working Draft Has Items Already Checked Out", MessageBoxButtons.OK, MessageBoxIcon.Warning); FinalProgressBarMessage = "Cannot check-out Working Draft"; } - else if (!MySessionInfo.CanCheckOutItem(_docVersionInfo.VersionID, CheckOutType.DocVersion, ref message)) - { - //do nothing - is still checked out - } - else if (changedDocVersion && MessageBox.Show($"There exists a newer ROFST for this RO database that was loaded for other sets.\r\n\r\nDo you want to update this set's ROs to be consistent/use the latest loaded ROFST?", "Load ROs", MessageBoxButtons.YesNo) == DialogResult.Yes) - { + else if (!MySessionInfo.CanCheckOutItem(_docVersionInfo.VersionID, CheckOutType.DocVersion, ref message)) + { + //do nothing - is still checked out + } + else if (changedDocVersion && !askedAboutchangedDocVersion) + { + Task.Run(() => + { + if (MessageBox.Show($"There exists a newer ROFST for this RO database that was loaded for other sets.\r\n\r\nDo you want to update this set's ROs to be consistent/use the latest loaded ROFST?", "Load ROs", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + InitialProgressBarMessage = "Updating ROs"; - InitialProgressBarMessage = "Updating ROs"; + ROFstInfo roFstInfo = ROFstInfo.Get(fstid); + roFstInfo.ROTableUpdate += new ROFstInfoROTableUpdateEvent(roFstInfo_ROTableUpdate); + ROFstInfo.RefreshROFstAtItemLevel(_docVersionInfo, DoProgressBarRefresh, null, roFstInfo, origfstid, fstid); + roFstInfo.ROTableUpdate -= new ROFstInfoROTableUpdateEvent(roFstInfo_ROTableUpdate); - ROFstInfo roFstInfo = ROFstInfo.Get(fstid); - roFstInfo.ROTableUpdate += new ROFstInfoROTableUpdateEvent(roFstInfo_ROTableUpdate); - ROFstInfo.RefreshROFstAtItemLevel(_docVersionInfo, DoProgressBarRefresh, null, roFstInfo, origfstid, fstid); - roFstInfo.ROTableUpdate -= new ROFstInfoROTableUpdateEvent(roFstInfo_ROTableUpdate); + Application.DoEvents(); - Application.DoEvents(); + FinalProgressBarMessage = "ROs values updated"; + MyROFST = roFstInfo; - FinalProgressBarMessage = "ROs values updated"; - MyROFST = roFstInfo; + updatedROs = true; - updatedROs = true; - } + askedAboutchangedDocVersion = false; + } + else + { + askedAboutchangedDocVersion = true; + } + }); + + } } //B2025-008 @@ -674,15 +690,15 @@ namespace Volian.Controls.Library //so can go to it after the refresh string tmpROID = CurROLink?.ROID; - ROFSTLookup.rodbi[] dbs = MyROFSTLookup?.GetRODatabaseList(true); + ROFSTLookup.rodbi[] dbs = MyROFSTLookup?.GetRODatabaseList(true); - // B2022-123: RO Tab Treeview not showing correct RO values when switching between procedures. - // Added optional parameter "forceReload" and cleared out any existing nodes before reloading the tree - // the clear nodes code below has to be after the GetRODatabaseList database call because of races conditions in the code - tvROFST.Nodes.Clear(); - ResetSearch(); //B2023-050 need to reset the SaveRO, and any RO info that was selected last time the tree was loaded - if (dbs != null) - { + // B2022-123: RO Tab Treeview not showing correct RO values when switching between procedures. + // Added optional parameter "forceReload" and cleared out any existing nodes before reloading the tree + // the clear nodes code below has to be after the GetRODatabaseList database call because of races conditions in the code + tvROFST.Nodes.Clear(); + ResetSearch(); //B2023-050 need to reset the SaveRO, and any RO info that was selected last time the tree was loaded + if (dbs != null) + { for (int i = 0; i < dbs.Length; i++) { ROFSTLookup.rodbi db = dbs[i]; @@ -695,580 +711,580 @@ namespace Volian.Controls.Library } } - _currRofstID = (IsRofstValid) ? (int?)_myROFST.ROFstID : null; - _currDocVersionID = null; + _currRofstID = (IsRofstValid) ? (int?)_myROFST.ROFstID : null; + _currDocVersionID = null; if(_docVersionInfo != null) _currDocVersionID = (int?)_docVersionInfo.VersionID; - if (tmpROID != null) ExpandNode(ROFSTLookup.FormatRoidKey(tmpROID, true)); + if (tmpROID != null) ExpandNode(ROFSTLookup.FormatRoidKey(tmpROID, true)); - //doc version would have updated (if needed) so reset flag - if (_progressBar?.Text != "Cannot check-out Working Draft") + //doc version would have updated (if needed) so reset flag + if (_progressBar?.Text != "Cannot check-out Working Draft") { changedDocVersion = false; } } - var unitInfoNode = tvROFST.Nodes.Cast().Where(x => x.Text == "Unit Information").FirstOrDefault(); + var unitInfoNode = tvROFST.Nodes.Cast().Where(x => x.Text == "Unit Information").FirstOrDefault(); - if ((ROTypeFilter == E_ROValueType.Text || ROTypeFilter == E_ROValueType.All) && this.MyDvi != null && this.MyDvi.MultiUnitCount > 1) - { - // Add Unit Information Database if it doesn't exist - if (unitInfoNode == null && MyROFSTLookup != null) - { - TreeNode tnn = tvROFST.Nodes.Add("Unit Information"); - TreeNode cn = null; - - ROFSTLookup.rochild roc = MyROFSTLookup.GetRoChild("FFFF00000001"); - cn = tnn.Nodes.Add(roc.title); - cn.Tag = roc; + if ((ROTypeFilter == E_ROValueType.Text || ROTypeFilter == E_ROValueType.All) && this.MyDvi != null && this.MyDvi.MultiUnitCount > 1) + { + // Add Unit Information Database if it doesn't exist + if (unitInfoNode == null && MyROFSTLookup != null) + { + TreeNode tnn = tvROFST.Nodes.Add("Unit Information"); + TreeNode cn = null; - roc = MyROFSTLookup.GetRoChild("FFFF00000002"); - cn = tnn.Nodes.Add(roc.title); - cn.Tag = roc; + ROFSTLookup.rochild roc = MyROFSTLookup.GetRoChild("FFFF00000001"); + cn = tnn.Nodes.Add(roc.title); + cn.Tag = roc; - roc = MyROFSTLookup.GetRoChild("FFFF00000003"); - cn = tnn.Nodes.Add(roc.title); - cn.Tag = roc; + roc = MyROFSTLookup.GetRoChild("FFFF00000002"); + cn = tnn.Nodes.Add(roc.title); + cn.Tag = roc; - roc = MyROFSTLookup.GetRoChild("FFFF00000004"); - cn = tnn.Nodes.Add(roc.title); - cn.Tag = roc; + roc = MyROFSTLookup.GetRoChild("FFFF00000003"); + cn = tnn.Nodes.Add(roc.title); + cn.Tag = roc; - roc = MyROFSTLookup.GetRoChild("FFFF00000005"); - cn = tnn.Nodes.Add(roc.title); - cn.Tag = roc; + roc = MyROFSTLookup.GetRoChild("FFFF00000004"); + cn = tnn.Nodes.Add(roc.title); + cn.Tag = roc; - roc = MyROFSTLookup.GetRoChild("FFFF00000006"); - cn = tnn.Nodes.Add(roc.title); - cn.Tag = roc; + roc = MyROFSTLookup.GetRoChild("FFFF00000005"); + cn = tnn.Nodes.Add(roc.title); + cn.Tag = roc; - roc = MyROFSTLookup.GetRoChild("FFFF00000007"); - cn = tnn.Nodes.Add(roc.title); - cn.Tag = roc; + roc = MyROFSTLookup.GetRoChild("FFFF00000006"); + cn = tnn.Nodes.Add(roc.title); + cn.Tag = roc; - roc = MyROFSTLookup.GetRoChild("FFFF00000008"); - cn = tnn.Nodes.Add(roc.title); - cn.Tag = roc; - } - } - else if (unitInfoNode != null) // Add Unit Information Database if it doesn't exist [Not Multi-Unit DocVersion] - { - tvROFST.Nodes.Remove(unitInfoNode); - } + roc = MyROFSTLookup.GetRoChild("FFFF00000007"); + cn = tnn.Nodes.Add(roc.title); + cn.Tag = roc; - _curROTypeFilter = _roTypeFilter; + roc = MyROFSTLookup.GetRoChild("FFFF00000008"); + cn = tnn.Nodes.Add(roc.title); + cn.Tag = roc; + } + } + else if (unitInfoNode != null) // Add Unit Information Database if it doesn't exist [Not Multi-Unit DocVersion] + { + tvROFST.Nodes.Remove(unitInfoNode); + } + + _curROTypeFilter = _roTypeFilter; return updatedROs; } - public void SetFindDocROButton(bool enabled) - { - this.btnFindDocRO.Enabled = enabled; - } - - public static bool GreaterValue(string value1, string value2) - { - Match match1 = _regExGetNumber.Match(value1); - Match match2 = _regExGetNumber.Match(value2); - - if (match1.Success && !match1.Value.Contains("/") && match2.Success && !match2.Value.Contains("/")) // Compare the numeric value? - { - double dbl1; - double dbl2; - - //B2017-232 changed from Parse to TryParse. AEP had figure title that had a number containing two periods which caused Parse to error? - if (double.TryParse(match1.ToString(), out dbl1) && double.TryParse(match2.ToString(), out dbl2)) - { - if (dbl1 != dbl2) //B2021-144 if the numerical is identical default to the string comparison? - return dbl1 > dbl2; - } - } - - return string.Compare(value1, value2, true) > 0; - } - - #endregion - - #region Private Methods - - private void LoadChildren(TreeNode tn) - { - //Check if node has already been loaded - if (tn.FirstNode != null && tn.FirstNode.Text != DummyNodeText) return; - if (tn.FirstNode != null && tn.FirstNode.Text == DummyNodeText) tn.FirstNode.Remove(); - - //object tag = tn.Tag; - ROFSTLookup.rochild[] children = null; - - if (tn.Tag is ROFSTLookup.rodbi) - { - ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag; - MyROFSTLookup.LoadChildren(ref db); - children = db.children; - } - else if (tn.Tag is ROFSTLookup.rochild) - { - ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag; - MyROFSTLookup.LoadChildren(ref ch); - children = ch.children; - } - - - // if children, add dummy node - if (children != null && children.Length > 0) - { - for (int i = 0; i < children.Length; i++) - { - TreeNode tmp = null; - ROFSTLookup.rochild roc = children[i]; - - // if this is a group, i.e. type 0, add a dummy node - if (roc.type == 0 && !MyROFSTLookup.HasChildren(ref roc)) - { - continue; // Ignore: Junk Scenario - } - else if (ROTypeFilter != E_ROValueType.All && (roc.type & (uint)ROTypeFilter) == 0) - { - continue; // Ignore: Filter Doesn't Match - } - else if (!string.IsNullOrEmpty(roc.appid)) - { - MyROFSTLookup.LoadChildren(ref roc); - - if (roc.children.Length == 1 && roc.children.First().roid.Length == 16) - { - roc.appid = roc.children.First().appid; - roc.roid = roc.children.First().roid; - roc.value = roc.children.First().value; - - roc.children = new List().ToArray(); - } - } - - if (roc.value == null) - { - tmp = new TreeNode(roc.title); - tmp.Tag = roc; - - int index = FindIndex(tn.Nodes, tmp.Text); - tn.Nodes.Insert(index, tmp); - - TreeNode sub = new TreeNode(DummyNodeText); - tmp.Nodes.Add(sub); - } - else - { - - tmp = new TreeNode(roc.title); - tmp.Tag = roc; - - if (tmp.Text.IndexOf("\\u") > -1) // RO Editor add symbols C2022 - 003 - { - tmp.Text = Regex.Replace(tmp.Text, @"\\u([0-9]{1,4})\?", m => Convert.ToChar(int.Parse(m.Groups[1].Value)).ToString()); - } - - if (roc.roid.Length == 16) - { - tn.Nodes.Add(tmp); - } - else - { - int index = FindIndex(tn.Nodes, tmp.Text); - tn.Nodes.Insert(index, tmp); - } - } - } - } - } - - private void AddDummyGroup(ROFSTLookup.rodbi rodbi, TreeNode tn) - { - if (IsRofstValid && MyROFSTLookup.HasChildren(ref rodbi)) - { - TreeNode tmp = new TreeNode(DummyNodeText); - tn.Nodes.Add(tmp); - } - } - - private void ExpandNode(string roid) - { - // Clean-up Roid if necessary - roid = ROFSTLookup.FormatRoidKey(roid); - - bool multValSel = (roid.Length == 16) ? true : false; - string db = roid.Substring(0, 4); - int dbiID = MyROFSTLookup.GetRODatabaseTitleIndex(roid); - - ROFSTLookup.rochild rochld = MyROFSTLookup.GetRoChild(roid.Substring(0, 12).ToUpper()); - - // use this to walk up tree until database - this is used to expand tree. - List path = new List(); - int myid = rochld.ID; - - while (myid >= 0) - { - path.Insert(0, myid); - myid = rochld.ParentID; - string pROID = string.Format("{0:X04}{1:X08}", db, myid); - rochld = MyROFSTLookup.GetRoChild(pROID); - - if (rochld.ID == -1) myid = -1; - } - - TreeNode tnExpand = null; - - - //Find Database Node First - TreeNode dbNode = null; - - if (roid.StartsWith("FFFF")) - dbNode = tvROFST.Nodes.Cast().Where(x => (x.Tag.Equals(null)) && (x.Text.Equals("Unit Information"))).FirstOrDefault(); - else - dbNode = tvROFST.Nodes.Cast().Where(x => (x.Tag is ROFSTLookup.rodbi) && ((ROFSTLookup.rodbi)x.Tag).dbiID == dbiID).FirstOrDefault(); - - if (dbNode != null) - { - LoadChildren(dbNode); - tnExpand = dbNode; - } - - if (tnExpand != null) - { - // use the path id list to load/find the treeview's nodes. - foreach (int citm in path) - { - LoadChildren(tnExpand); - tnExpand.Expand(); - - TreeNode chldNode = tnExpand.Nodes.Cast().Where(x => (x.Tag is ROFSTLookup.rochild) && ((ROFSTLookup.rochild)x.Tag).ID == citm).FirstOrDefault(); - if (chldNode != null) - { - tnExpand = chldNode; - } - } - } - - if (tnExpand != null) - { - // If a multiple return value, try to select the proper node - if (multValSel) - { - LoadChildren(tnExpand); - tnExpand.Expand(); - - TreeNode chldNode = tnExpand.Nodes.Cast().Where(x => ((ROFSTLookup.rochild)x.Tag).roid.ToUpper() == roid.ToUpper()).FirstOrDefault(); - if (chldNode != null) - { - tnExpand = chldNode; - } - } - } - - tvROFST.SelectedNode = tnExpand; - } - - private int FindIndex(TreeNodeCollection nodes, string value) - { - int index = 0; - - foreach (TreeNode node in nodes) - { - if (GreaterValue(node.Text, value)) return index; - index++; - } - - return index; - } - - private void SaveRO() - { - //Check if an RO Node is selected from the TreeView - if (string.IsNullOrEmpty(tbROValue.Text)) - { - FlexibleMessageBox.Show("Must select an RO Value from the tree."); - return; - } - - - Object obj = tvROFST.SelectedNode.Tag; - - if (obj is ROFSTLookup.rochild) - { - ROFSTLookup.rochild roc = (ROFSTLookup.rochild)obj; - DisplayTabItem dti = TabControl.SelectedDisplayTabItem; //.OpenItem(_ItemInfo); // open the corresponding procedure text - - if (dti.MyDSOTabPanel != null) // A Word Document tab is the active tab - { - string accPageID = string.Format("<{0}>", roc.appid.ToUpper()); - - // Insert the RO text at the current cursor position in the word document - // NOTE: assuming any type of RO can be put in an Accessory (MSWord) Document - if (dti.MyDSOTabPanel != null) - { - dti.MyDSOTabPanel.InsertText(accPageID); - } - } - else if (MyRTB != null) // a Procedure Steps section tab is active - { - if (CheckROSelection(roc)) // check for RO type is valid for this type of step/substep - { - // Pad to 16 to store in the RoUsage table. - string padroid = ROFSTLookup.FormatRoidKey(roc.roid, true); - string linktxt = string.Format(@"#Link:ReferencedObject: {0} {1}", padroid, MyROFST.RODbID); - - // Resolve symbols and scientific notation in the RO return value - string valtxt = MyROFSTLookup.GetTranslatedRoValue(padroid, MyRTB.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta, MyRTB.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.UseTildaPoundCharsForSuperSubScriptInROValues, false, MyRTB.MyItemInfo); - - MyRTB.OnRoInsert(this, new StepRTBRoEventArgs(valtxt, selectedChld.value, linktxt, padroid, MyROFST.RODbID)); - - } - } - - btnGoToRO.Enabled = false; - btnSaveRO.Enabled = false; - btnCancelRO.Enabled = false; - btnPreviewRO.Enabled = false; - - CurROLink = null; - _savCurROLink = null; - } - } - - private bool CheckROSelection(ROFSTLookup.rochild selectedRO) - { - bool goodToGo = true; - bool replacingRO = (_savCurROLink != null); - - string insrpl = (replacingRO) ? "Cannot Replace" : "Cannot Insert"; - string errormsg = string.Empty; - - switch (selectedRO.type) - { - case 1: // regular text RO - if (MyRTB.MyItemInfo.IsFigure) - { - errormsg = (replacingRO) ? "a Figure with a non-figure." : "a text RO in a Figure type."; - goodToGo = false; - } - break; - - case 2: // table RO - if (MyRTB.MyItemInfo.IsFigure) - { - errormsg = (replacingRO) ? "a Figure with a non-figure." : "a table into a Figure type."; - goodToGo = false; - } - else if (!MyRTB.MyItemInfo.IsTable) - { - errormsg = (replacingRO) ? "a non-table RO with a Table RO." : "a table into a non-table type."; - //TODO: Prompt user to insert a new Table substep type and place this RO into it - goodToGo = false; - } - break; - - case 4: // X/Y Plot RO type - if (!MyRTB.MyItemInfo.IsAccPages) - { - errormsg = (replacingRO) ? "a non-X/Y Plot RO with an X/Y Plot RO." : "an X/Y Plot RO in an non-Accessory Page type."; - //TODO: Prompt user to insert a new substep type that handles x/y Plots and place this RO into it - goodToGo = false; - } - break; - - case 8: // figure (intergrated graphics) - if (!MyRTB.MyItemInfo.IsFigure && !MyRTB.MyItemInfo.IsAccPages) - { - errormsg = (replacingRO) ? "a graphics RO with a non-graphcis RO." : "a Graphics RO in an non-Figure or a non-Accessory Page type."; - //TODO: Prompt user to insert a new substep type that handles x/y Plots and place this RO into it - goodToGo = false; - - - - } - break; - } - - if (!goodToGo) - { - FlexibleMessageBox.Show(string.Format("{0} {1}", insrpl, errormsg), (replacingRO) ? "Invalid RO Replacement" : "Invalid RO Insert"); - } - - return goodToGo; - } - - private void RunRoEditor() - { - if (VlnSettings.ReleaseMode.Equals("DEMO")) - { - FlexibleMessageBox.Show("Referenced Object Editor not available in the Demo version.", "PROMS Demo Version"); - return; - } - - - string roapp = Volian.Base.Library.ExeInfo.GetROEditorPath(); // get the path to the RO Editor Executable - Object obj = tvROFST.SelectedNode.Tag; - - if (obj is ROFSTLookup.rochild) - { - ROFSTLookup.rochild roc = (ROFSTLookup.rochild)obj; - _selectedRoidBeforeRoEditor = roc.roid; - - string args = "\"" + _myROFST.MyRODb.FolderPath + "\" " + roc.roid.ToLower(); - - if (!Directory.Exists(_myROFST.MyRODb.FolderPath)) - { - FlexibleMessageBox.Show(string.Format("RO Database directory does not exist: {0}", _myROFST.MyRODb.FolderPath)); - return; - } - - // C2017-003: ro data in sql server, check for sql connection string - if (_myROFST.MyRODb.DBConnectionString != "cstring") args = args + " \"" + _myROFST.MyRODb.DBConnectionString + "\""; - - // C2021-026 pass in Parent/Child information (list of the children) - // B2022-019 look at all DocVersions to find ParentChild information - // to ensure we pass in Parent/Child even when not coming from a Parent/Child procedure set - // B2022-073 Break out of the foreach when we find a set with parent/child information - DocVersionInfoList dvil = DocVersionInfoList.Get(); - - foreach (DocVersionInfo dvi in dvil) - { - DocVersionConfig jdvc = dvi.DocVersionConfig; - - if (jdvc != null && jdvc.Unit_Name != "" && jdvc.Unit_Count > 1) // B2021-089 only pass in applicability info if defined for more than one unit - { - args += " \"PC=" + jdvc.Unit_Name + "\""; - break; - } - } - - System.Diagnostics.Process.Start(roapp, args); - } - } - - private void ProcessSearch(string searchValue, int searchTypeID) - { - // Jake [2022.05.11]: Added try catch to prevent unhandled exception when the timer ticks and - // tries to process a search while the main tab/procedure is closing - try - { - // B2022-124: [JPR] Blank RO Values (All Spaces) printing as "?" - if (!string.IsNullOrEmpty(searchValue)) - { - searchValue = searchValue.Replace('\u2011', '-'); - searchValue = searchValue.Replace(@"\u9586?", @"\\"); - - if (searchValue.Replace(" ", string.Empty).Length > 0) - searchValue = searchValue.Trim(); - } - - if (this.Enabled && !string.IsNullOrEmpty(searchValue) && searchValue.Length >= 2 && !searchValue.Contains("#Link:Transition")) - { - Dictionary dicRoVals = new Dictionary(); - - // B2022-088: [JPR] Find Doc Ro button not working in Word Sections - // B2022-098: [JPR] ROs not being resolved in Word Sections - if (searchValue.StartsWith("<") && searchValue.EndsWith(">")) // RO Link (accPageID) - { - ROFSTLookup.rochild roc = MyROFSTLookup.GetROChildByAccPageID(searchValue); - - // If RO is valid then select node in tree view - if (roc.ID >= 0 && !string.IsNullOrEmpty(roc.value)) - { - ExpandNode(roc.roid); - } - - lbFound.DataSource = null; - lbFound.Visible = false; - - _lastSearchValue = searchValue; - } - else if (searchValue.Contains("#Link:ReferencedObject")) // RO Link (roid) - { - // we where only removing the END if the searchValue ended in "1[END>" - // but sometimes it ended in "2[END>" and cause a null reference error - // - was seen only running via Visual Studio debugger - // I cleaned up the code to remove in ether case so that we get the expected roid value - jsj 11-18-2024 - string substr = searchValue.Substring(searchValue.LastIndexOf(" ")); - if (substr.Contains("[END>")) - searchValue = searchValue.Substring(0, searchValue.Length - substr.Length); - string roid = ROFSTLookup.FormatRoidKey(searchValue.Substring(searchValue.LastIndexOf(" ")), true); - - if (roid != selectedChld.roid) - { - ROFSTLookup.rochild roc = MyROFSTLookup.GetRoChild(roid); - ExpandNode(roc.roid); - } - - lbFound.DataSource = null; - lbFound.Visible = false; - - _lastSearchValue = searchValue; - } - else // if (searchValue != _lastSearchValue) - { - dicRoVals = MyROFSTLookup.Search(searchValue, searchTypeID, false, MaxNumSearchRecords); - - if (dicRoVals.Count > 0) - { - lbFound.SelectedValueChanged -= new EventHandler(lbFound_SelectedValueChanged); - - lbFound.DataSource = new BindingSource(dicRoVals, null); - lbFound.ValueMember = "Key"; // roid - lbFound.DisplayMember = "Value"; // default value - - lbFound.SelectionMode = SelectionMode.One; - lbFound.SelectedIndex = -1; - lbFound.Visible = true; - - lbFound.SelectedValueChanged += new EventHandler(lbFound_SelectedValueChanged); - - if (lbFound.Items != null && lbFound.Items.Count == 1) - lbFound.SelectedIndex = 0; - } - else - { - lbFound.DataSource = null; - lbFound.Visible = false; - } - - _lastSearchValue = searchValue; - } - } - else - { - _lastSearchValue = string.Empty; - lbFound.DataSource = null; - lbFound.Visible = false; - } - - } - catch { } - } - - private void ResetSearch() - { - // Clear the Display/Info for Prev Selected RO Child - tbROValue.Text = null; - lbROId.Text = string.Empty; - - // Disable all buttons by default - btnSaveRO.Enabled = false; - btnCancelRO.Enabled = false; - btnPreviewRO.Enabled = false; + public void SetFindDocROButton(bool enabled) + { + this.btnFindDocRO.Enabled = enabled; + } + + public static bool GreaterValue(string value1, string value2) + { + Match match1 = _regExGetNumber.Match(value1); + Match match2 = _regExGetNumber.Match(value2); + + if (match1.Success && !match1.Value.Contains("/") && match2.Success && !match2.Value.Contains("/")) // Compare the numeric value? + { + double dbl1; + double dbl2; + + //B2017-232 changed from Parse to TryParse. AEP had figure title that had a number containing two periods which caused Parse to error? + if (double.TryParse(match1.ToString(), out dbl1) && double.TryParse(match2.ToString(), out dbl2)) + { + if (dbl1 != dbl2) //B2021-144 if the numerical is identical default to the string comparison? + return dbl1 > dbl2; + } + } + + return string.Compare(value1, value2, true) > 0; + } + + #endregion + + #region Private Methods + + private void LoadChildren(TreeNode tn) + { + //Check if node has already been loaded + if (tn.FirstNode != null && tn.FirstNode.Text != DummyNodeText) return; + if (tn.FirstNode != null && tn.FirstNode.Text == DummyNodeText) tn.FirstNode.Remove(); + + //object tag = tn.Tag; + ROFSTLookup.rochild[] children = null; + + if (tn.Tag is ROFSTLookup.rodbi) + { + ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag; + MyROFSTLookup.LoadChildren(ref db); + children = db.children; + } + else if (tn.Tag is ROFSTLookup.rochild) + { + ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag; + MyROFSTLookup.LoadChildren(ref ch); + children = ch.children; + } + + + // if children, add dummy node + if (children != null && children.Length > 0) + { + for (int i = 0; i < children.Length; i++) + { + TreeNode tmp = null; + ROFSTLookup.rochild roc = children[i]; + + // if this is a group, i.e. type 0, add a dummy node + if (roc.type == 0 && !MyROFSTLookup.HasChildren(ref roc)) + { + continue; // Ignore: Junk Scenario + } + else if (ROTypeFilter != E_ROValueType.All && (roc.type & (uint)ROTypeFilter) == 0) + { + continue; // Ignore: Filter Doesn't Match + } + else if (!string.IsNullOrEmpty(roc.appid)) + { + MyROFSTLookup.LoadChildren(ref roc); + + if (roc.children.Length == 1 && roc.children.First().roid.Length == 16) + { + roc.appid = roc.children.First().appid; + roc.roid = roc.children.First().roid; + roc.value = roc.children.First().value; + + roc.children = new List().ToArray(); + } + } + + if (roc.value == null) + { + tmp = new TreeNode(roc.title); + tmp.Tag = roc; + + int index = FindIndex(tn.Nodes, tmp.Text); + tn.Nodes.Insert(index, tmp); + + TreeNode sub = new TreeNode(DummyNodeText); + tmp.Nodes.Add(sub); + } + else + { + + tmp = new TreeNode(roc.title); + tmp.Tag = roc; + + if (tmp.Text.IndexOf("\\u") > -1) // RO Editor add symbols C2022 - 003 + { + tmp.Text = Regex.Replace(tmp.Text, @"\\u([0-9]{1,4})\?", m => Convert.ToChar(int.Parse(m.Groups[1].Value)).ToString()); + } + + if (roc.roid.Length == 16) + { + tn.Nodes.Add(tmp); + } + else + { + int index = FindIndex(tn.Nodes, tmp.Text); + tn.Nodes.Insert(index, tmp); + } + } + } + } + } + + private void AddDummyGroup(ROFSTLookup.rodbi rodbi, TreeNode tn) + { + if (IsRofstValid && MyROFSTLookup.HasChildren(ref rodbi)) + { + TreeNode tmp = new TreeNode(DummyNodeText); + tn.Nodes.Add(tmp); + } + } + + private void ExpandNode(string roid) + { + // Clean-up Roid if necessary + roid = ROFSTLookup.FormatRoidKey(roid); + + bool multValSel = (roid.Length == 16) ? true : false; + string db = roid.Substring(0, 4); + int dbiID = MyROFSTLookup.GetRODatabaseTitleIndex(roid); + + ROFSTLookup.rochild rochld = MyROFSTLookup.GetRoChild(roid.Substring(0, 12).ToUpper()); + + // use this to walk up tree until database - this is used to expand tree. + List path = new List(); + int myid = rochld.ID; + + while (myid >= 0) + { + path.Insert(0, myid); + myid = rochld.ParentID; + string pROID = string.Format("{0:X04}{1:X08}", db, myid); + rochld = MyROFSTLookup.GetRoChild(pROID); + + if (rochld.ID == -1) myid = -1; + } + + TreeNode tnExpand = null; + + + //Find Database Node First + TreeNode dbNode = null; + + if (roid.StartsWith("FFFF")) + dbNode = tvROFST.Nodes.Cast().Where(x => (x.Tag.Equals(null)) && (x.Text.Equals("Unit Information"))).FirstOrDefault(); + else + dbNode = tvROFST.Nodes.Cast().Where(x => (x.Tag is ROFSTLookup.rodbi) && ((ROFSTLookup.rodbi)x.Tag).dbiID == dbiID).FirstOrDefault(); + + if (dbNode != null) + { + LoadChildren(dbNode); + tnExpand = dbNode; + } + + if (tnExpand != null) + { + // use the path id list to load/find the treeview's nodes. + foreach (int citm in path) + { + LoadChildren(tnExpand); + tnExpand.Expand(); + + TreeNode chldNode = tnExpand.Nodes.Cast().Where(x => (x.Tag is ROFSTLookup.rochild) && ((ROFSTLookup.rochild)x.Tag).ID == citm).FirstOrDefault(); + if (chldNode != null) + { + tnExpand = chldNode; + } + } + } + + if (tnExpand != null) + { + // If a multiple return value, try to select the proper node + if (multValSel) + { + LoadChildren(tnExpand); + tnExpand.Expand(); + + TreeNode chldNode = tnExpand.Nodes.Cast().Where(x => ((ROFSTLookup.rochild)x.Tag).roid.ToUpper() == roid.ToUpper()).FirstOrDefault(); + if (chldNode != null) + { + tnExpand = chldNode; + } + } + } + + tvROFST.SelectedNode = tnExpand; + } + + private int FindIndex(TreeNodeCollection nodes, string value) + { + int index = 0; + + foreach (TreeNode node in nodes) + { + if (GreaterValue(node.Text, value)) return index; + index++; + } + + return index; + } + + private void SaveRO() + { + //Check if an RO Node is selected from the TreeView + if (string.IsNullOrEmpty(tbROValue.Text)) + { + FlexibleMessageBox.Show("Must select an RO Value from the tree."); + return; + } + + + Object obj = tvROFST.SelectedNode.Tag; + + if (obj is ROFSTLookup.rochild) + { + ROFSTLookup.rochild roc = (ROFSTLookup.rochild)obj; + DisplayTabItem dti = TabControl.SelectedDisplayTabItem; //.OpenItem(_ItemInfo); // open the corresponding procedure text + + if (dti.MyDSOTabPanel != null) // A Word Document tab is the active tab + { + string accPageID = string.Format("<{0}>", roc.appid.ToUpper()); + + // Insert the RO text at the current cursor position in the word document + // NOTE: assuming any type of RO can be put in an Accessory (MSWord) Document + if (dti.MyDSOTabPanel != null) + { + dti.MyDSOTabPanel.InsertText(accPageID); + } + } + else if (MyRTB != null) // a Procedure Steps section tab is active + { + if (CheckROSelection(roc)) // check for RO type is valid for this type of step/substep + { + // Pad to 16 to store in the RoUsage table. + string padroid = ROFSTLookup.FormatRoidKey(roc.roid, true); + string linktxt = string.Format(@"#Link:ReferencedObject: {0} {1}", padroid, MyROFST.RODbID); + + // Resolve symbols and scientific notation in the RO return value + string valtxt = MyROFSTLookup.GetTranslatedRoValue(padroid, MyRTB.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta, MyRTB.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.UseTildaPoundCharsForSuperSubScriptInROValues, false, MyRTB.MyItemInfo); + + MyRTB.OnRoInsert(this, new StepRTBRoEventArgs(valtxt, selectedChld.value, linktxt, padroid, MyROFST.RODbID)); + + } + } + + btnGoToRO.Enabled = false; + btnSaveRO.Enabled = false; + btnCancelRO.Enabled = false; + btnPreviewRO.Enabled = false; + + CurROLink = null; + _savCurROLink = null; + } + } + + private bool CheckROSelection(ROFSTLookup.rochild selectedRO) + { + bool goodToGo = true; + bool replacingRO = (_savCurROLink != null); + + string insrpl = (replacingRO) ? "Cannot Replace" : "Cannot Insert"; + string errormsg = string.Empty; + + switch (selectedRO.type) + { + case 1: // regular text RO + if (MyRTB.MyItemInfo.IsFigure) + { + errormsg = (replacingRO) ? "a Figure with a non-figure." : "a text RO in a Figure type."; + goodToGo = false; + } + break; + + case 2: // table RO + if (MyRTB.MyItemInfo.IsFigure) + { + errormsg = (replacingRO) ? "a Figure with a non-figure." : "a table into a Figure type."; + goodToGo = false; + } + else if (!MyRTB.MyItemInfo.IsTable) + { + errormsg = (replacingRO) ? "a non-table RO with a Table RO." : "a table into a non-table type."; + //TODO: Prompt user to insert a new Table substep type and place this RO into it + goodToGo = false; + } + break; + + case 4: // X/Y Plot RO type + if (!MyRTB.MyItemInfo.IsAccPages) + { + errormsg = (replacingRO) ? "a non-X/Y Plot RO with an X/Y Plot RO." : "an X/Y Plot RO in an non-Accessory Page type."; + //TODO: Prompt user to insert a new substep type that handles x/y Plots and place this RO into it + goodToGo = false; + } + break; + + case 8: // figure (intergrated graphics) + if (!MyRTB.MyItemInfo.IsFigure && !MyRTB.MyItemInfo.IsAccPages) + { + errormsg = (replacingRO) ? "a graphics RO with a non-graphcis RO." : "a Graphics RO in an non-Figure or a non-Accessory Page type."; + //TODO: Prompt user to insert a new substep type that handles x/y Plots and place this RO into it + goodToGo = false; + + + + } + break; + } + + if (!goodToGo) + { + FlexibleMessageBox.Show(string.Format("{0} {1}", insrpl, errormsg), (replacingRO) ? "Invalid RO Replacement" : "Invalid RO Insert"); + } + + return goodToGo; + } + + private void RunRoEditor() + { + if (VlnSettings.ReleaseMode.Equals("DEMO")) + { + FlexibleMessageBox.Show("Referenced Object Editor not available in the Demo version.", "PROMS Demo Version"); + return; + } + + + string roapp = Volian.Base.Library.ExeInfo.GetROEditorPath(); // get the path to the RO Editor Executable + Object obj = tvROFST.SelectedNode.Tag; + + if (obj is ROFSTLookup.rochild) + { + ROFSTLookup.rochild roc = (ROFSTLookup.rochild)obj; + _selectedRoidBeforeRoEditor = roc.roid; + + string args = "\"" + _myROFST.MyRODb.FolderPath + "\" " + roc.roid.ToLower(); + + if (!Directory.Exists(_myROFST.MyRODb.FolderPath)) + { + FlexibleMessageBox.Show(string.Format("RO Database directory does not exist: {0}", _myROFST.MyRODb.FolderPath)); + return; + } + + // C2017-003: ro data in sql server, check for sql connection string + if (_myROFST.MyRODb.DBConnectionString != "cstring") args = args + " \"" + _myROFST.MyRODb.DBConnectionString + "\""; + + // C2021-026 pass in Parent/Child information (list of the children) + // B2022-019 look at all DocVersions to find ParentChild information + // to ensure we pass in Parent/Child even when not coming from a Parent/Child procedure set + // B2022-073 Break out of the foreach when we find a set with parent/child information + DocVersionInfoList dvil = DocVersionInfoList.Get(); + + foreach (DocVersionInfo dvi in dvil) + { + DocVersionConfig jdvc = dvi.DocVersionConfig; + + if (jdvc != null && jdvc.Unit_Name != "" && jdvc.Unit_Count > 1) // B2021-089 only pass in applicability info if defined for more than one unit + { + args += " \"PC=" + jdvc.Unit_Name + "\""; + break; + } + } + + System.Diagnostics.Process.Start(roapp, args); + } + } + + private void ProcessSearch(string searchValue, int searchTypeID) + { + // Jake [2022.05.11]: Added try catch to prevent unhandled exception when the timer ticks and + // tries to process a search while the main tab/procedure is closing + try + { + // B2022-124: [JPR] Blank RO Values (All Spaces) printing as "?" + if (!string.IsNullOrEmpty(searchValue)) + { + searchValue = searchValue.Replace('\u2011', '-'); + searchValue = searchValue.Replace(@"\u9586?", @"\\"); + + if (searchValue.Replace(" ", string.Empty).Length > 0) + searchValue = searchValue.Trim(); + } + + if (this.Enabled && !string.IsNullOrEmpty(searchValue) && searchValue.Length >= 2 && !searchValue.Contains("#Link:Transition")) + { + Dictionary dicRoVals = new Dictionary(); + + // B2022-088: [JPR] Find Doc Ro button not working in Word Sections + // B2022-098: [JPR] ROs not being resolved in Word Sections + if (searchValue.StartsWith("<") && searchValue.EndsWith(">")) // RO Link (accPageID) + { + ROFSTLookup.rochild roc = MyROFSTLookup.GetROChildByAccPageID(searchValue); + + // If RO is valid then select node in tree view + if (roc.ID >= 0 && !string.IsNullOrEmpty(roc.value)) + { + ExpandNode(roc.roid); + } + + lbFound.DataSource = null; + lbFound.Visible = false; + + _lastSearchValue = searchValue; + } + else if (searchValue.Contains("#Link:ReferencedObject")) // RO Link (roid) + { + // we where only removing the END if the searchValue ended in "1[END>" + // but sometimes it ended in "2[END>" and cause a null reference error + // - was seen only running via Visual Studio debugger + // I cleaned up the code to remove in ether case so that we get the expected roid value - jsj 11-18-2024 + string substr = searchValue.Substring(searchValue.LastIndexOf(" ")); + if (substr.Contains("[END>")) + searchValue = searchValue.Substring(0, searchValue.Length - substr.Length); + string roid = ROFSTLookup.FormatRoidKey(searchValue.Substring(searchValue.LastIndexOf(" ")), true); + + if (roid != selectedChld.roid) + { + ROFSTLookup.rochild roc = MyROFSTLookup.GetRoChild(roid); + ExpandNode(roc.roid); + } + + lbFound.DataSource = null; + lbFound.Visible = false; + + _lastSearchValue = searchValue; + } + else // if (searchValue != _lastSearchValue) + { + dicRoVals = MyROFSTLookup.Search(searchValue, searchTypeID, false, MaxNumSearchRecords); + + if (dicRoVals.Count > 0) + { + lbFound.SelectedValueChanged -= new EventHandler(lbFound_SelectedValueChanged); + + lbFound.DataSource = new BindingSource(dicRoVals, null); + lbFound.ValueMember = "Key"; // roid + lbFound.DisplayMember = "Value"; // default value + + lbFound.SelectionMode = SelectionMode.One; + lbFound.SelectedIndex = -1; + lbFound.Visible = true; + + lbFound.SelectedValueChanged += new EventHandler(lbFound_SelectedValueChanged); + + if (lbFound.Items != null && lbFound.Items.Count == 1) + lbFound.SelectedIndex = 0; + } + else + { + lbFound.DataSource = null; + lbFound.Visible = false; + } + + _lastSearchValue = searchValue; + } + } + else + { + _lastSearchValue = string.Empty; + lbFound.DataSource = null; + lbFound.Visible = false; + } + + } + catch { } + } + + private void ResetSearch() + { + // Clear the Display/Info for Prev Selected RO Child + tbROValue.Text = null; + lbROId.Text = string.Empty; + + // Disable all buttons by default + btnSaveRO.Enabled = false; + btnCancelRO.Enabled = false; + btnPreviewRO.Enabled = false; //B2026-030 GoTo sometimes requires being pressed twice if (MyUserInfo != null && MyDvi != null && selectedChld.value != null) { btnGoToRO.Enabled = UserInfo.CanEditROs(MyUserInfo, MyDvi); // Writers and Reviewers cannot edit ROs (run the RO Editor) } - else - { + else + { btnGoToRO.Enabled = false; } } - #endregion - } + #endregion + } } From b173c61575ff23d6925a112af988b00db327c613 Mon Sep 17 00:00:00 2001 From: mschill Date: Tue, 30 Jun 2026 09:11:43 -0400 Subject: [PATCH 03/11] B2026-063 - Issue Deleting Steps with Grids --- PROMS/SQL/PROMStoCM.sql | 2 +- PROMS/VEPROMS User Interface/PROMSFixes.Sql | 32 +++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/PROMS/SQL/PROMStoCM.sql b/PROMS/SQL/PROMStoCM.sql index 3191b940..9c1f62d2 100644 --- a/PROMS/SQL/PROMStoCM.sql +++ b/PROMS/SQL/PROMStoCM.sql @@ -1817,7 +1817,7 @@ ALTER trigger [dbo].[tr_Contents_Delete] on [dbo].[Contents] instead of delete a select ii.ContentID,ii.Number,ii.Text,ii.Type,ii.FormatID,ii.Config,ii.DTS,ii.UserID,ii.DeleteStatus,ii.ActionDTS from tblContents ii inner join deleted dd on dd.ContentID = ii.ContentID where ii.DeleteStatus > 0 - update ga set ga.contentauditid = (select max(auditid) from contentaudits where contentid = ga.contentid and deletestatus = ga.deletestatus) + update ga set ga.contentauditid = (select ISNULL(max(auditid),0) from contentaudits where contentid = ga.contentid and deletestatus = ga.deletestatus) from gridaudits ga join deleted dd on ga.contentid = dd.contentid where ga.contentauditid = 0 end go diff --git a/PROMS/VEPROMS User Interface/PROMSFixes.Sql b/PROMS/VEPROMS User Interface/PROMSFixes.Sql index ec6c56c2..e48c92d3 100644 --- a/PROMS/VEPROMS User Interface/PROMSFixes.Sql +++ b/PROMS/VEPROMS User Interface/PROMSFixes.Sql @@ -24990,6 +24990,34 @@ IF (@@Error = 0) PRINT 'Procedure Creation: getRevisionByItemIDandRevisionNumber ELSE PRINT 'Procedure Creation: getRevisionByItemIDandRevisionNumber Error on Creation' GO +/* +========================================================================================================== + Author: Matthew Schill + Create Date: 06/29/2026 + Description: Added an ISNULL check when setting GridAudits.contentauditid. + Was Causing Deletion of some Grids to fail. +========================================================================================================== +*/ +/****** Object: Trigger [tr_Contents_Delete] ******/ +ALTER trigger [dbo].[tr_Contents_Delete] on [dbo].[Contents] instead of delete as + begin + update ii set DeleteStatus = (select max(DeleteID) from DeleteLog where SPID = @@spid), ActionDTS = getdate(), + UserID = (select top 1 UserID from DeleteLog where SPID = @@spid order by deleteid desc) + from tblContents ii inner join deleted dd on dd.ContentID = ii.ContentID + insert into ContentAudits(ContentID,Number,Text,Type,FormatID,Config,DTS,UserID,DeleteStatus,ActionDTS) + select ii.ContentID,ii.Number,ii.Text,ii.Type,ii.FormatID,ii.Config,ii.DTS,ii.UserID,ii.DeleteStatus,ii.ActionDTS + from tblContents ii inner join deleted dd on dd.ContentID = ii.ContentID + where ii.DeleteStatus > 0 + update ga set ga.contentauditid = (select ISNULL(max(auditid),0) from contentaudits where contentid = ga.contentid and deletestatus = ga.deletestatus) + from gridaudits ga join deleted dd on ga.contentid = dd.contentid where ga.contentauditid = 0 + end +go + +-- Display the status of Trigger alter +IF (@@Error = 0) PRINT 'Trigger Alteration: tr_Contents_Delete Succeeded' +ELSE PRINT 'Trigger Alteration: tr_Contents_Delete Error on Creation' +GO + /* --------------------------------------------------------------------------- | ADD New Code Before this Block | @@ -25023,8 +25051,8 @@ BEGIN TRY -- Try Block DECLARE @RevDate varchar(255) DECLARE @RevDescription varchar(255) - set @RevDate = '05/26/2026 7:00 AM' - set @RevDescription = 'Get Most Recent Revision when Duplicates' + set @RevDate = '06/29/2026 7:00 AM' + set @RevDescription = Update to Grid Deletion Audits' Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription From cf19f764c7f02c6438a63a8f62d28771922710da Mon Sep 17 00:00:00 2001 From: mschill Date: Tue, 30 Jun 2026 13:49:37 -0400 Subject: [PATCH 04/11] Copy / Paste Error when updating Revision Comment --- PROMS/VEPROMS User Interface/PROMSFixes.Sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PROMS/VEPROMS User Interface/PROMSFixes.Sql b/PROMS/VEPROMS User Interface/PROMSFixes.Sql index e48c92d3..5209a3a7 100644 --- a/PROMS/VEPROMS User Interface/PROMSFixes.Sql +++ b/PROMS/VEPROMS User Interface/PROMSFixes.Sql @@ -25052,7 +25052,7 @@ BEGIN TRY -- Try Block DECLARE @RevDescription varchar(255) set @RevDate = '06/29/2026 7:00 AM' - set @RevDescription = Update to Grid Deletion Audits' + set @RevDescription = 'Update to Grid Deletion Audits' Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription From 0ebd12526634fd8fb2a7ee2d99ff60f1d004783c Mon Sep 17 00:00:00 2001 From: John Jenko Date: Tue, 30 Jun 2026 14:35:28 -0400 Subject: [PATCH 05/11] =?UTF-8?q?F2026-014=20South=20Texas=20EOP=20format?= =?UTF-8?q?=20=E2=80=93=20adjusted=20the=20Caution=20and=20Note=20box=20wi?= =?UTF-8?q?dth.=20Also=20remove=20the=20extra=20space=20between=20bullets?= =?UTF-8?q?=20and=20multiple=20Caution/Note=20text?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROMS/Formats/fmtall/HLPall.xml | Bin 85960 -> 85946 bytes PROMS/Formats/fmtall/OHLPall.xml | Bin 73066 -> 73052 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/PROMS/Formats/fmtall/HLPall.xml b/PROMS/Formats/fmtall/HLPall.xml index d4fa391981be60d7c1ec49538b69846f3f269bbe..18d478a29af37fb203327d7ef895dfd50f091c0e 100644 GIT binary patch delta 32 ocmX>xpLN%K)(tiMo4fcMq8Lp#b7z?|GMY~2&Pv|AEL-Ub0M3~VEdT%j delta 42 tcmdlrpY_Ci)(tiMoC*w3xVfCaHHy(_^WRK!Mn0Oe&&XDK0stLF4we7_ diff --git a/PROMS/Formats/fmtall/OHLPall.xml b/PROMS/Formats/fmtall/OHLPall.xml index acb7e54e301657f932e24ea2ae08bc4d12311d82..d22ef95face3a55c88fd0cb77da6b8ef975cdf5c 100644 GIT binary patch delta 28 jcmaF0i{;KPmJJt}H{WBfo5g6lId)z>Bapf~zqb|u$mI=1 delta 38 ncmcb!i{;fWmJJt}ITaY7aPw*A=2?tJoBik2GXkme^LuLn26_#? From 09a397bed2cba7e04ecf0cd4fd3b02c8766d8211 Mon Sep 17 00:00:00 2001 From: mschill Date: Wed, 1 Jul 2026 07:21:25 -0400 Subject: [PATCH 06/11] B2026-054 - When performing a Transition search, the Formats dropdown list is repeating several times. --- .../Volian.Controls.Library/DisplaySearch.cs | 292 +++++++++--------- 1 file changed, 145 insertions(+), 147 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index b0dd922e..61bbb2ea 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -15,24 +15,24 @@ using System.Linq; namespace Volian.Controls.Library { - public partial class DisplaySearch : UserControl - { - #region Public Events/Handlers + public partial class DisplaySearch : UserControl + { + #region Public Events/Handlers - public event DisplaySearchEvent PrintRequest; + public event DisplaySearchEvent PrintRequest; public event DisplaySearchEvent SearchComplete; private void OnPrintRequest(DisplaySearchEventArgs args) { if (PrintRequest != null) PrintRequest(this, args); - } + } private void OnSearchComplete(DisplaySearchEventArgs args) { if (SearchComplete != null) SearchComplete(this, args); - } + } #endregion @@ -43,9 +43,9 @@ namespace Volian.Controls.Library // B2023-076: Adding option to select all procedure sets private const string SelectAllProcedureSetsText = "Select All Procedure Sets"; - // B2019-161 When tracking timing time this action - private static VolianTimer _TimeActivity = new VolianTimer("DisplaySearch _TmrRefresh_Tick", 399); - private Timer _TmrRefresh = null; + // B2019-161 When tracking timing time this action + private static VolianTimer _TimeActivity = new VolianTimer("DisplaySearch _TmrRefresh_Tick", 399); + private Timer _TmrRefresh = null; public FormatVersionList myFormatVersionList; private ItemInfo _SearchIncTransII = null; @@ -220,7 +220,7 @@ namespace Volian.Controls.Library { _TmrRefresh = new Timer(); _TmrRefresh.Interval = 1000; - _TmrRefresh.Tick += _TmrRefresh_Tick; + _TmrRefresh.Tick += _TmrRefresh_Tick; } return _TmrRefresh; } @@ -325,7 +325,7 @@ namespace Volian.Controls.Library if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[2]) { // RO Search ROFSTLookup.rochild[] chld = null; - ROFSTLookup.rochild ch; + ROFSTLookup.rochild ch; if (cmboTreeROs.SelectedNode != null) { if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) @@ -337,22 +337,22 @@ namespace Volian.Controls.Library else { if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rodbi) - { + { ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)cmboTreeROs.SelectedNode.Tag; - return _MyRODbID.ToString() + ":" + string.Format("{0}", db.dbiID.ToString("X4")); - } + return _MyRODbID.ToString() + ":" + string.Format("{0}", db.dbiID.ToString("X4")); + } else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild) - { + { ch = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag; chld = ch.children; - // build a list of ROs to search - // B2022-118: remove the ending comma otherwise query will fail - string strRtnStr = _MyRODbID.ToString() + ":" + GetROsToSearch(chld); - if (strRtnStr.EndsWith(",")) - strRtnStr = strRtnStr.Substring(0, strRtnStr.Length - 1); - return strRtnStr; - } - } + // build a list of ROs to search + // B2022-118: remove the ending comma otherwise query will fail + string strRtnStr = _MyRODbID.ToString() + ":" + GetROsToSearch(chld); + if (strRtnStr.EndsWith(",")) + strRtnStr = strRtnStr.Substring(0, strRtnStr.Length - 1); + return strRtnStr; + } + } } } return string.Empty; @@ -468,15 +468,18 @@ namespace Volian.Controls.Library this.Refresh(); myFormatVersionList = FormatVersionList.GetFormatVersions(); cbxTranVersion.DisplayMember = "Title"; - int lastLastFormatID = 0; - foreach (FormatVersion fv in myFormatVersionList) + + List fvlst = myFormatVersionList.GroupBy(x => x.FormatID).Select(group => new + FormatVersion(title: group.Max(x => x.Title), + formatID: group.Key, + versionID: group.Max(x => x.VersionID) + )).OrderBy(y => y.Title).ToList(); + + foreach (FormatVersion fv in fvlst) { - if (fv.FormatID != lastLastFormatID) - { - cbxTranVersion.Items.Add(fv); - lastLastFormatID = fv.FormatID; - } + cbxTranVersion.Items.Add(fv); } + cbxTranVersion.SelectedIndexChanged -= new EventHandler(cbxTranVersion_SelectedIndexChanged); cbxTranVersion.SelectedIndexChanged += new EventHandler(cbxTranVersion_SelectedIndexChanged); cbxTranFormat.SelectedIndexChanged -= new EventHandler(cbxTranFormat_SelectedIndexChanged); @@ -556,14 +559,9 @@ namespace Volian.Controls.Library string versionList = string.Empty; string sep = string.Empty; FormatVersion sfv = cbxTranVersion.SelectedItem as FormatVersion; - foreach (FormatVersion fv in myFormatVersionList) - { - if (fv.FormatID == sfv.FormatID) - { - versionList += sep + fv.VersionID; - sep = ","; - } - } + + versionList = string.Join(",", myFormatVersionList.Where(x => x.FormatID == sfv?.FormatID).Select(y => y.VersionID)); + cbxTranVersion.Tag = versionList; cbxTranFormatFillIn(versionList); if (dicExpandedFolderNodes.Count > 0) @@ -616,7 +614,7 @@ namespace Volian.Controls.Library dicSelectedFolderNodes.Clear(); } } - this.Cursor = Cursors.Default; + this.Cursor = Cursors.Default; } // C2020-033: Update the search panel for Incoming transitions. This gets called from the tree view & the ribbon @@ -828,10 +826,10 @@ namespace Volian.Controls.Library { DevComponents.AdvTree.Node pnode = sender as DevComponents.AdvTree.Node; if (pnode != null && pnode.HasChildNodes) - { - CheckTreeNodeChildren(pnode.Nodes); - } - } + { + CheckTreeNodeChildren(pnode.Nodes); + } + } public void advTreeProcSetsFillIn(bool blSeachTabClicked) { @@ -846,15 +844,15 @@ namespace Volian.Controls.Library topnode.Text = "Available Procedure Sets"; topnode.Tag = fi; topnode.DataKey = fi.FolderID; - advTreeProcSets.Nodes.Add(topnode); + advTreeProcSets.Nodes.Add(topnode); //advTreeProcSets.AfterNodeInsert += new TreeNodeCollectionEventHandler(advTreeProcSets_AfterNodeInsert); - //B2023-076: Adding option to select all procedure sets + //B2023-076: Adding option to select all procedure sets DevComponents.AdvTree.Node selectAllNode = new Node(); selectAllNode.Text = SelectAllProcedureSetsText; selectAllNode.Tag = SelectAllProcedureSetsText; selectAllNode.CheckBoxVisible = true; - selectAllNode.NodeClick += new EventHandler(AllProcedureSets_clicked); + selectAllNode.NodeClick += new EventHandler(AllProcedureSets_clicked); topnode.Nodes.Add(selectAllNode); if (fi.SortedChildFolders != null) @@ -865,7 +863,7 @@ namespace Volian.Controls.Library newnode.Text = fic.ToString(); newnode.Tag = fic; newnode.DataKey = fi.FolderID; - AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. + AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. cntnd++; if (fic.ChildFolderCount > 0 || fic.FolderDocVersionCount > 0) // allow for '+' for tree expansion { @@ -873,7 +871,7 @@ namespace Volian.Controls.Library { DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node(); tnt.Text = DummyNodeText; - newnode.Nodes.Add(tnt); + newnode.Nodes.Add(tnt); } topnode.Nodes.Add(newnode); } @@ -885,7 +883,7 @@ namespace Volian.Controls.Library newnode.Text = fi.ToString(); newnode.Tag = fi; newnode.DataKey = fi.FolderID; - AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. + AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. topnode.Nodes.Add(newnode); lstCheckedDocVersions.Add(Mydocversion); buildSetToSearchPanelTitle(); @@ -897,7 +895,7 @@ namespace Volian.Controls.Library fi = Mydocversion.MyFolder; topnode = new DevComponents.AdvTree.Node(); topnode.Text = fi.ToString(); - advTreeProcSets.Nodes.Add(topnode); + advTreeProcSets.Nodes.Add(topnode); topnode.Tag = fi; topnode.DataKey = fi.FolderID; } @@ -935,31 +933,31 @@ namespace Volian.Controls.Library newnode.Text = fic.ToString(); newnode.Tag = fic; newnode.DataKey = fic.FolderID; - par.Nodes.Add(newnode); + par.Nodes.Add(newnode); AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. newnode.Enabled = true; - if (fic.ChildFolderCount > 0) // B2017-176: Only expand if folder has folders (not working draft nodes) + if (fic.ChildFolderCount > 0) // B2017-176: Only expand if folder has folders (not working draft nodes) { DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node(); tnt.Text = DummyNodeText; - newnode.Nodes.Add(tnt); - // B2017-176: Only expand if folder has folders (not working draft nodes): the following was moved from the code - // that would check if this should be enabled if seraching for transition types. The transition controls - // had a list of associated docversions, so needed to get the docversion in the folder: + newnode.Nodes.Add(tnt); + // B2017-176: Only expand if folder has folders (not working draft nodes): the following was moved from the code + // that would check if this should be enabled if seraching for transition types. The transition controls + // had a list of associated docversions, so needed to get the docversion in the folder: if (tabSearchTypes.SelectedTab == tabTranSearch) - { + { if (!dicSelectedFolderNodes.ContainsKey(newnode)) dicSelectedFolderNodes.Add(newnode, false); // get the docversion for this folder, if it has one and determine whether it is enabled for transitions: string svid = null; if (fic.FolderDocVersionCount > 0) svid = fic.FolderDocVersions[0].VersionID.ToString(); newnode.Enabled = svid != null && cbxTranVersion.Tag != null ? cbxTranVersion.Tag.ToString().Contains(svid) : false; - } - } - } + } + } } } } + } public void AdvTree_AfterExpandorCollapse(object sender, AdvTreeNodeEventArgs e) { @@ -979,9 +977,9 @@ namespace Volian.Controls.Library if (topNode != null) { topNode.EnsureVisible(); - } } } + } #endregion @@ -1061,12 +1059,12 @@ namespace Volian.Controls.Library DevComponents.DotNetBar.ButtonItem btnCM = new DevComponents.DotNetBar.ButtonItem(); btnCM.Text = string.Format("{0}", (char)sym.Unicode); - // to name button use unicode rather than desc, desc may have spaces or odd chars + // to name button use unicode rather than desc, desc may have spaces or odd chars btnCM.Name = "btnCM" + sym.Unicode.ToString(); btnCM.Tooltip = sym.Desc; btnCM.Tag = string.Format(@"{0}", sym.Unicode); btnCM.FontBold = true; - btnCM.Click += new System.EventHandler(btnSym_Click); + btnCM.Click += new System.EventHandler(btnSym_Click); galSymbols.SubItems.Add(btnCM); } } @@ -1117,7 +1115,7 @@ namespace Volian.Controls.Library newnode = new DevComponents.AdvTree.Node(); newnode.Text = nodetext; newnode.Selectable = selectable; - AddCheckBox(chxbxvisable, newnode);//C2016-045 Allow Folders to be selected. + AddCheckBox(chxbxvisable, newnode);//C2016-045 Allow Folders to be selected. return newnode; } @@ -1164,7 +1162,7 @@ namespace Volian.Controls.Library bool allowNonAdmin = IncTranCvtPerm(); List itmsEditable = new List(); // return this list int listCount = 0; - if (all) // Check all in list + if (all) // Check all in list { listCount = _SearchResults.Count; foreach (ItemInfo ii in _SearchResults) @@ -1214,9 +1212,9 @@ namespace Volian.Controls.Library // C2020-033: convert selected transitions to text private void btnTranCvtSelToTxt_Click(object sender, EventArgs e) { - // First see if all selected can be converted, i.e. user has permission to edit + // First see if all selected can be converted, i.e. user has permission to edit List lbis = lbSrchResultsIncTrans.CheckedItems; - List itmsEditable = TranCvtCheckPermission(false); + List itmsEditable = TranCvtCheckPermission(false); if (itmsEditable == null || itmsEditable.Count == 0) return; TranCvtToTxt(itmsEditable); fromTranCvtBtn = true; @@ -1450,7 +1448,7 @@ namespace Volian.Controls.Library DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node(db.dbiTitle); tn.Tag = db; - cmboTreeROs.Nodes.Add(tn); + cmboTreeROs.Nodes.Add(tn); AddDummyGroup(db, tn); } @@ -1505,26 +1503,26 @@ namespace Volian.Controls.Library ROFSTLookup.rochild[] chld = null; if (tn.Tag is ROFSTLookup.rodbi) - { + { ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag; - MyROFSTLookup.LoadChildren(ref db); - chld = db.children; - } + MyROFSTLookup.LoadChildren(ref db); + chld = db.children; + } else if (tn.Tag is ROFSTLookup.rochild) - { + { ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag; - MyROFSTLookup.LoadChildren(ref ch); - chld = ch.children; - } - else - { - Console.WriteLine("error - no type"); - return; - } + MyROFSTLookup.LoadChildren(ref ch); + chld = ch.children; + } + else + { + Console.WriteLine("error - no type"); + return; + } - // if children, add dummy node - // B2022-026 RO Memory Reduction code - need to check length - if (chld != null && chld.Length > 0) + // if children, add dummy node + // B2022-026 RO Memory Reduction code - need to check length + if (chld != null && chld.Length > 0) { ProgressBar_Initialize(chld.Length, tn.Text); @@ -1533,11 +1531,11 @@ namespace Volian.Controls.Library ProgressBar_SetValue(i); DevComponents.AdvTree.Node tmp = null; - ROFSTLookup.rochild roc = chld[i]; + ROFSTLookup.rochild roc = chld[i]; - // if this is a group, i.e. type 0, add a dummy node - // B2022-026 RO Memory Reduction code - check children length - if (roc.type == 0 && !MyROFSTLookup.HasChildren(ref roc)) + // if this is a group, i.e. type 0, add a dummy node + // B2022-026 RO Memory Reduction code - check children length + if (roc.type == 0 && !MyROFSTLookup.HasChildren(ref roc)) { continue; // Ignore: Junk Scenario } @@ -1556,33 +1554,33 @@ namespace Volian.Controls.Library } - if (roc.value == null) - { + if (roc.value == null) + { tmp = new DevComponents.AdvTree.Node(roc.title); tmp.Tag = roc; - int index = FindIndex(tn.Nodes, tmp.Text); - tn.Nodes.Insert(index, tmp); + int index = FindIndex(tn.Nodes, tmp.Text); + tn.Nodes.Insert(index, tmp); - DevComponents.AdvTree.Node sub = new DevComponents.AdvTree.Node(DummyNodeText); - tmp.Nodes.Add(sub); - } - else - { + DevComponents.AdvTree.Node sub = new DevComponents.AdvTree.Node(DummyNodeText); + tmp.Nodes.Add(sub); + } + else + { tmp = new DevComponents.AdvTree.Node(roc.title); tmp.Tag = roc; - if (roc.roid.Length == 16) - { - tn.Nodes.Add(tmp); - } - else - { - int index = FindIndex(tn.Nodes, tmp.Text); - tn.Nodes.Insert(index, tmp); - } - } - } + if (roc.roid.Length == 16) + { + tn.Nodes.Add(tmp); + } + else + { + int index = FindIndex(tn.Nodes, tmp.Text); + tn.Nodes.Insert(index, tmp); + } + } + } } ProgressBar_Clear(); @@ -1611,18 +1609,18 @@ namespace Volian.Controls.Library cbxFndUnLnkROVals.Enabled = false; } else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild) - { + { ROFSTLookup.rochild ro = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag; - // B2022-026 RO Memory Reduction code - check children length - cbxFndUnLnkROVals.Enabled = (ro.children == null || ro.children.Length <= 0); - } + // B2022-026 RO Memory Reduction code - check children length + cbxFndUnLnkROVals.Enabled = (ro.children == null || ro.children.Length <= 0); + } - if (!cbxFndUnLnkROVals.Enabled) + if (!cbxFndUnLnkROVals.Enabled) cbxFndUnLnkROVals.Checked = false; } - private void gpFindROs_EnabledChanged(object sender, EventArgs e) - { + private void gpFindROs_EnabledChanged(object sender, EventArgs e) + { if (gpFindROs.Enabled) gpFindROs.Style.BackColor = Color.Yellow; else @@ -1826,24 +1824,24 @@ namespace Volian.Controls.Library { ListBoxItem lbi = sender as ListBoxItem; if (lbi != null) - { - ItemBindingData ibd = lbi.Tag as ItemBindingData; + { + ItemBindingData ibd = lbi.Tag as ItemBindingData; ItemInfo ii = ibd.DataItem as ItemInfo; - bool allowNonAdmin = IncTranCvtPerm(); + bool allowNonAdmin = IncTranCvtPerm(); if (lbi.CheckState == CheckState.Checked && ii != null) - { - if (!allowNonAdmin && !UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion)) - { - FlexibleMessageBox.Show("You do not have permission to edit the procedure, section, or step.", - "Convert Transition to Text", MessageBoxButtons.OK, MessageBoxIcon.Information); - lbi.CheckState = CheckState.Unchecked; - } - } - // B2021-018: use the CheckedItems.Count on the list box for the search results for - // incoming transitions to determine whether to enable the convert selected to text: - btnTranCvtSelToTxt.Enabled = (lbSrchResultsIncTrans.CheckedItems.Count > 0); - } - } + { + if (!allowNonAdmin && !UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion)) + { + FlexibleMessageBox.Show("You do not have permission to edit the procedure, section, or step.", + "Convert Transition to Text", MessageBoxButtons.OK, MessageBoxIcon.Information); + lbi.CheckState = CheckState.Unchecked; + } + } + // B2021-018: use the CheckedItems.Count on the list box for the search results for + // incoming transitions to determine whether to enable the convert selected to text: + btnTranCvtSelToTxt.Enabled = (lbSrchResultsIncTrans.CheckedItems.Count > 0); + } + } private void GrpPanSearchResults_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { @@ -2186,8 +2184,8 @@ namespace Volian.Controls.Library { docVersionList += sep + dvi.VersionID.ToString(); sep = ","; - } - } + } + } // B2018-134 to search specifically for Outside Transitions, set docVeronList to empty string so that all procedure sets are considered if (cbxTranCategory.SelectedItem.ToString() == "Outside") docVersionList = string.Empty; @@ -2449,8 +2447,8 @@ namespace Volian.Controls.Library } } - // if the selected folder has a docversion, handle it: - if (n.Tag != SelectAllProcedureSetsText) + // if the selected folder has a docversion, handle it: + if (n.Tag != SelectAllProcedureSetsText) { FolderInfo fi = (FolderInfo)n.Tag; RefreshLstCheckedDocVersions(); @@ -2569,7 +2567,7 @@ namespace Volian.Controls.Library { Node newnode = new DevComponents.AdvTree.Node(); newnode.Text = str; - advTreeStepTypes.Nodes.Add(newnode); + advTreeStepTypes.Nodes.Add(newnode); } buildStepTypePannelTitle(); } @@ -2658,16 +2656,16 @@ namespace Volian.Controls.Library { vid = vid.IndexOf(",") < 0 ? vid : vid.Substring(0, cbxTranVersion.Tag.ToString().IndexOf(",")); - DocVersionInfo dvi = DocVersionInfo.Get(int.Parse(vid)); - TransTypeList ttl = dvi.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList; + DocVersionInfo dvi = DocVersionInfo.Get(int.Parse(vid)); + TransTypeList ttl = dvi.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList; cbxTranFormat.Items.Clear(); cbxTranFormat.Items.Add("All"); - for (int i = 0; i < ttl.MaxIndex; i++) - { - cbxTranFormat.Items.Add(new TransItem(ttl[i].TransMenu.Replace("?.", string.Empty), ttl[i].TransFormat.Replace("?.", string.Empty))); - } + for (int i = 0; i < ttl.MaxIndex; i++) + { + cbxTranFormat.Items.Add(new TransItem(ttl[i].TransMenu.Replace("?.", string.Empty), ttl[i].TransFormat.Replace("?.", string.Empty))); + } cbxTranFormat.SelectedIndex = 0; cbxTranCategory.Items.Clear(); @@ -3299,7 +3297,7 @@ namespace Volian.Controls.Library } } catch (Exception ex) - { + { FlexibleMessageBox.Show("An error occurred while reading the xml file.\r\n\r\nThis can happen when the file selected for the Load is not saved\r\n" + "from a PROMS Search or if some of the steps no longer exist.", "Search Load Failed", MessageBoxButtons.OK); } @@ -3476,9 +3474,9 @@ namespace Volian.Controls.Library break; } } - } + } - private void btnCopySearchResults_Click(object sender, EventArgs e) + private void btnCopySearchResults_Click(object sender, EventArgs e) { ICollection myList = lbSrchResults.DataSource as ICollection; if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4]) myList = lbSrchResultsIncTrans.DataSource as ICollection; @@ -3660,7 +3658,7 @@ namespace Volian.Controls.Library } } - #endregion + #endregion - public delegate void DisplaySearchEvent(object sender, DisplaySearchEventArgs args); + public delegate void DisplaySearchEvent(object sender, DisplaySearchEventArgs args); } From 25bbc46925325b0421e7c276577ae8b9d9572028 Mon Sep 17 00:00:00 2001 From: John Jenko Date: Wed, 1 Jul 2026 09:17:23 -0400 Subject: [PATCH 07/11] F2026_015 Moved the change bar position to the right one space to accommodate the wider Caution and Note boxes --- PROMS/Formats/fmtall/HLPall.xml | Bin 85946 -> 85946 bytes PROMS/Formats/fmtall/OHLPall.xml | Bin 73052 -> 73052 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/PROMS/Formats/fmtall/HLPall.xml b/PROMS/Formats/fmtall/HLPall.xml index 18d478a29af37fb203327d7ef895dfd50f091c0e..591f5bdedff57e7ecf8caac4f1f400a062cb9e99 100644 GIT binary patch delta 19 bcmdlrpLN%K)&+cwmd%WO+Zp*7cRB(9MCt|j delta 19 bcmdlrpLN%K)&+cw7R`)&+Zp*7cRB(9MBoMY diff --git a/PROMS/Formats/fmtall/OHLPall.xml b/PROMS/Formats/fmtall/OHLPall.xml index d22ef95face3a55c88fd0cb77da6b8ef975cdf5c..16f8f7d77528ba108ee9f6c020ab1a7c20d53856 100644 GIT binary patch delta 20 bcmcb!i{;KPmJLBnjF!#8OxuH*7&)Z@S6c>r delta 20 bcmcb!i{;KPmJLBnj26woOxuH*7&)Z@S5XFg From ad33097d5e73ad660106119c584dd61ad71024c9 Mon Sep 17 00:00:00 2001 From: mschill Date: Tue, 7 Jul 2026 10:59:51 -0400 Subject: [PATCH 08/11] =?UTF-8?q?B2026-064=20=E2=80=93=20Updating=20ROs=20?= =?UTF-8?q?from=20Display=20ROs=20should=20not=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROMS/Volian.Controls.Library/DisplayRO.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplayRO.cs b/PROMS/Volian.Controls.Library/DisplayRO.cs index 2252e704..7c271a05 100644 --- a/PROMS/Volian.Controls.Library/DisplayRO.cs +++ b/PROMS/Volian.Controls.Library/DisplayRO.cs @@ -654,8 +654,6 @@ namespace Volian.Controls.Library } else if (changedDocVersion && !askedAboutchangedDocVersion) { - Task.Run(() => - { if (MessageBox.Show($"There exists a newer ROFST for this RO database that was loaded for other sets.\r\n\r\nDo you want to update this set's ROs to be consistent/use the latest loaded ROFST?", "Load ROs", MessageBoxButtons.YesNo) == DialogResult.Yes) { InitialProgressBarMessage = "Updating ROs"; @@ -678,7 +676,6 @@ namespace Volian.Controls.Library { askedAboutchangedDocVersion = true; } - }); } } From c005f03af8dcaf6b20af86faac16ca13088ea3d7 Mon Sep 17 00:00:00 2001 From: John Jenko Date: Thu, 9 Jul 2026 10:41:46 -0400 Subject: [PATCH 09/11] B2026-065 Adjusted the Callaway Two Column format for the position of RNO tables. --- PROMS/Formats/fmtall/CAL2all.xml | Bin 80958 -> 80972 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/PROMS/Formats/fmtall/CAL2all.xml b/PROMS/Formats/fmtall/CAL2all.xml index 87f3ee82a36acb61ec86c24b08391a08cd07473a..08b15d5e8c40a839658648abb5188fb260cfafb6 100644 GIT binary patch delta 38 wcmV+>0NMY(_yo-O1h7gnlNe_blkQ3glUyRO9i#1cj2H_z0V|mft^fc4 From 2e6836283682f8931237c23c496ad40f91d20646 Mon Sep 17 00:00:00 2001 From: John Jenko Date: Fri, 10 Jul 2026 09:56:58 -0400 Subject: [PATCH 10/11] F2026-016 Robinson- created a new sub-format for a Foldout section that uses a smaller font size. --- PROMS/Formats/Formats.csproj | 1 + PROMS/Formats/fmtall/CPL_03all.xml | Bin 20866 -> 20866 bytes PROMS/Formats/fmtall/CPL_04all.xml | Bin 0 -> 21124 bytes 3 files changed, 1 insertion(+) create mode 100644 PROMS/Formats/fmtall/CPL_04all.xml diff --git a/PROMS/Formats/Formats.csproj b/PROMS/Formats/Formats.csproj index ffd92dcb..c73a80c5 100644 --- a/PROMS/Formats/Formats.csproj +++ b/PROMS/Formats/Formats.csproj @@ -179,6 +179,7 @@ + diff --git a/PROMS/Formats/fmtall/CPL_03all.xml b/PROMS/Formats/fmtall/CPL_03all.xml index ed9f766003ed0f4f22bc70305dd809736f777f63..568fe5f566981c0132bee2ed7c79761bf44c571d 100644 GIT binary patch delta 18 ZcmZo#%-FP;af3$yvnhkYX72!VMgTk$1%m(p delta 18 ZcmZo#%-FP;af3$yvoV9&X72!VMgTk~1&06t diff --git a/PROMS/Formats/fmtall/CPL_04all.xml b/PROMS/Formats/fmtall/CPL_04all.xml new file mode 100644 index 0000000000000000000000000000000000000000..10e780a388065ada643bf0ae8dc61afe688bf33d GIT binary patch literal 21124 zcmds<+io1k5r+HL0rC!O0|w$Cj?9B?31DKZNGf6=kpx9qzQ_%&QxuaFwM$!K2t8xo zD9QhIZK=DbXJ=>EOWGy`k;9ql?&>;M_2Ga2-3Z@=ci|))he7x$JP)HV4zI%Na2oy+ zJ_#$~&*2OG9_Y(yc&hi$^z}5nj9-5Y=ix>8Tu@&L=9}=>@cZz)un|7iyU)YE`g$GC z^z)TkpNAtoU8tuWwSS>6BaM2b_cq!maNOgH?@S5Z?;oSZ$8f z%OGs)=Xu21#u@8*9R8#)jPg|255iFJ%nm%P&vE<*#jblBJJbR?k|2=tsC%(B=^kE!& zs^Vrt|wS&*+;sWzo6ZSa<;IOZ;chu_LL{@G~5|EXP`1jXp!(W@~nRzFv zYElNMy8&rBkJyhzi&MRMJ$Z8y``gvq5(98}px(b1u5cJhc&DG>yD7Y%O9Fn-d#HaL zWsj%l@lC>r(f_W|$7=aXl4;m)iaWca$F}$ggw64Gd^U*H`21FFo~fl#>Gnih7~7@I z^vJX*r~gO6_=t8KtB-+jOY-x0LQ8miCJ1_YAPW3V6yFR(J%d#~aGz296m!mWv9Cw+rcNE9~V zrMPidPoqq4?uqj6^!`}^g*7{tWSyuL{JS0PFdL6+K6C=2A(x$;`TJBuTl6sgT-=PeBg!ozGL+SZ`UT0vM)b?&o%uw zjz5VO=aFm^mJhqXEeJH9mg{Qyg*@Pj`nVl`ujn26UAM#jpBdyB@CsxQ$3-}$q$!$ z*bYm)O>4_w?n}eS3CI}Cn(;)$N;GN~hc`sk;K;Ml9b3p>j|BOBj2*#?H$y?5NBpc` zXoAIgt^Tl)XlXf%C;B#$Z9t=UgkKv3_T6I4e`v&G^#Pn z&vMw45(ay7X>l0t$84mZTsZX2rN@)G=;6>emmWjer>&m4Vz4)t7JHL?y|j76zD@fH z zVnm&S3<1w!S(arohgnt0Yia|*3RONN@CuE=Z#5xRASzQGDvc$`TM^$bA&vm zw3x6t{&X68UXy58MtEJ6%&A>QVbjO+TqKR>G3l~L@~k0^w4*GOJd^4HwWV%3$?@tt zJF7h8(l!*wpLNP(litm!9-SiA_NqrIY2>f=4@tDSJ`_B8-9Xh8d)kS8SY0`J&vI7e z@m4LEHChgrV>_MeUq%Wze#HHI$^g1Je%(}YKYD#MVGW7wD#>S=hjmeB5zYI$8qc%5 zWshW4>3n7>hg|kpw$77}MI8+*OZNGro>}SW8g&spr^Zg7`MATlcG7RAB~&SM)3s=2 zveJ={x*h9vuVf#vY|Q(CWZ2;ZR%f!x(K+A?O-&5t*f`+oUsooi&MF zarPvxg>_q!61)Diu5Ecu>nEzhQe8P!J+o`>b<3PfR7}odHN<0+WYgXHTlE}iPU{)0 z2iqF^_o>rLvJSxuIe7d$Qh2jUVd;fYp*57m|rhiG4ZPpW3TjHy7Jd1sP8Qki)%j5TM ziaFG>X;nvNK2kT89BSG4)bX0}iD+>o31NknF{g2F@tAnE#b0kp5?^Rk)~>E97H5|r zGs<4rn3t>M8JGiI-A zm(!;WpR(dMjb`}MjIaUQKcQaFHY+% zF^1*oE*D*L;I$55`j1$zb$UPDmeir@dQMu=CF4Ai6m#wZog7M*ZT~Dd<|k8pe>jzy zbdH773~oWKj?3OUxWrkBdY(ibUfXe7;C7<4A{L+YSs7$DjAm74(?V)*shZP{$Fi%n zZFL~_`|=MA$_nl*=w|iDsRfq?aUZew+k|XF)O1b!FS*&xxAql%U&T$-%*RXIZdNVU zTOx$C=HWYm4#h{#3LQjC%Skh4Kh4sl_BF@5FsW+-si!6;cZJchWbN&hU}D*m+Y&hG z>w?sk+xG2t(PQ!2zI5b zvB+xKwzCiQu78igdQ0r%n8I1p|GpKncIeslS2W+w4DLKmSPfRQs zJEGy#K7AkRD|>=Q@vFxZLs9IlM!it>^;qL`igFb9_Om07e#)vi+_bZOjB}(FY^8@Xh%*rQNMmI<1l@wXa!_XFm)7Qsy)k z?-HNtG5ckbm+I$vJYR)YlyO%1tr;u%Ou(TVvWBQnBPZP~DFU~DISa7dxQ%m*P}w!k z>3)805y0n8VWhxdWVuPlyi>~`7NU7WUJk> zx3%g|&W#oiWiB9Y8-eDnFF zmS6i{ZaUf2tk_Qq2XdO(ycYAq9_ycHm9OOMXUE~lms7MaojFT5l$=A;m6%hQ92r$s zC+i1^Dl3y)HQK4d-YTN+-!4ULKOa8fGD_LE6;0MB6i75#7v-#?a#N{tDf!rw?(8ae zdf0;^c0W+tO*%J6ciL}iLT=`x6*^`s5be@)Q!LG0Nziw)sqbYSavO8IvN2ZCYNy6; z!@^*R-Mc1V?l!so>-a--w;_8>yqa46yeMGaxWGoA9u+jPD`SE?F~;Ivvp%s0vQS3} z^q9^sP*r#-YLI)|?JH&NXh$)oM~pzFnk>=SxjeM(Hy+4(k-?|i!0d)4i$&Yuhy@;L zo#`UmHC)G?>^9LQQpyr*5{|B?-PW}J@ literal 0 HcmV?d00001 From 352af1598444be8beaa9f78ee4e798232c9d7ca4 Mon Sep 17 00:00:00 2001 From: mschill Date: Wed, 15 Jul 2026 12:43:38 -0400 Subject: [PATCH 11/11] =?UTF-8?q?B2026-055=20=E2=80=93=20Transition=20Sear?= =?UTF-8?q?ch=20Improvements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Volian.Controls.Library/DisplaySearch.cs | 450 ++++++++---------- 1 file changed, 211 insertions(+), 239 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index 61bbb2ea..f30c8bb2 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -15,6 +15,8 @@ using System.Linq; namespace Volian.Controls.Library { +#pragma warning disable IDE1006 // Naming Styles +#pragma warning disable IDE0044 // Add readonly modifier public partial class DisplaySearch : UserControl { #region Public Events/Handlers @@ -24,14 +26,12 @@ namespace Volian.Controls.Library private void OnPrintRequest(DisplaySearchEventArgs args) { - if (PrintRequest != null) - PrintRequest(this, args); + PrintRequest?.Invoke(this, args); } private void OnSearchComplete(DisplaySearchEventArgs args) { - if (SearchComplete != null) - SearchComplete(this, args); + SearchComplete?.Invoke(this, args); } #endregion @@ -218,8 +218,10 @@ namespace Volian.Controls.Library { if (_TmrRefresh == null) { - _TmrRefresh = new Timer(); - _TmrRefresh.Interval = 1000; + _TmrRefresh = new Timer + { + Interval = 1000 + }; _TmrRefresh.Tick += _TmrRefresh_Tick; } return _TmrRefresh; @@ -324,7 +326,6 @@ namespace Volian.Controls.Library { if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[2]) { // RO Search - ROFSTLookup.rochild[] chld = null; ROFSTLookup.rochild ch; if (cmboTreeROs.SelectedNode != null) { @@ -336,18 +337,16 @@ namespace Volian.Controls.Library } else { - if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rodbi) + if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rodbi db) { - ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)cmboTreeROs.SelectedNode.Tag; - return _MyRODbID.ToString() + ":" + string.Format("{0}", db.dbiID.ToString("X4")); + return $"{_MyRODbID.ToString()}:{string.Format("{0}", db.dbiID.ToString("X4"))}"; } - else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild) + else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild roch) { - ch = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag; - chld = ch.children; + ROFSTLookup.rochild[] chld = roch.children; // build a list of ROs to search // B2022-118: remove the ending comma otherwise query will fail - string strRtnStr = _MyRODbID.ToString() + ":" + GetROsToSearch(chld); + string strRtnStr = $"{_MyRODbID.ToString()}:{GetROsToSearch(chld)}"; if (strRtnStr.EndsWith(",")) strRtnStr = strRtnStr.Substring(0, strRtnStr.Length - 1); return strRtnStr; @@ -391,7 +390,6 @@ namespace Volian.Controls.Library cmbResultsStyle.Enabled = false; tabSearchTypes.SelectedTabChanged += new TabStrip.SelectedTabChangedEventHandler(tabSearchTypes_SelectedTabChanged); // Don't do this here. If you do then the /DB parameter has not yet been set, which will cause the database menu to be displayed - //SetupContextMenu(); // so that the symbol list is available without selecting a procedure set or procedure } #endregion @@ -447,20 +445,6 @@ namespace Volian.Controls.Library } btnSearch.Enabled = (cbxTranCategory.Items.Count > 0); // B2017-038 disable search button if no format selected //enable-disable doc version nodes based on version type if selected - if (cbxTranVersion.SelectedIndex > -1) - { - if (dicExpandedFolderNodes.Count > 0) - { - foreach (DevComponents.AdvTree.Node n in dicExpandedFolderNodes.Keys) - { - DocVersionInfo dvi = (DocVersionInfo)n.Tag; - if (cbxTranVersion.Tag.ToString().Contains(dvi.VersionID.ToString())) - n.Enabled = true; - else - n.Enabled = false; - } - } - } //setup transition format versions this.Cursor = Cursors.WaitCursor; if (myFormatVersionList == null) @@ -475,6 +459,10 @@ namespace Volian.Controls.Library versionID: group.Max(x => x.VersionID) )).OrderBy(y => y.Title).ToList(); + //B2026-055 – Transition Search Improvements + //Added an All option to allow resetting of the enabling/disabling tree options + cbxTranVersion.Items.Add(new FormatVersion("All", -1, -1)); + foreach (FormatVersion fv in fvlst) { cbxTranVersion.Items.Add(fv); @@ -504,32 +492,6 @@ namespace Volian.Controls.Library public void cbxTranFormat_SelectedIndexChanged(object sender, EventArgs e) { - #region 1st cut - //if (cbxTranFormat.SelectedItem.ToString() == "All") - //{ - // cbxTranCategory.Items.Clear(); - // cbxTranCategory.Items.Add("All"); - // cbxTranCategory.Items.Add("Internal"); - // cbxTranCategory.Items.Add("External"); - // cbxTranCategory.Items.Add("Outside"); - // cbxTranCategory.SelectedIndex = 0; - //} - //else if (cbxTranFormat.SelectedItem.ToString().Contains("{Proc")) - //{ - // cbxTranCategory.Items.Clear(); - // cbxTranCategory.Items.Add("All"); - // cbxTranCategory.Items.Add("External"); - // cbxTranCategory.Items.Add("Outside"); - // cbxTranCategory.SelectedIndex = 0; - //} - //else - //{ - // cbxTranCategory.Items.Clear(); - // cbxTranCategory.Items.Add("Internal"); - // cbxTranCategory.SelectedIndex = 0; - //} - #endregion - #region 2nd cut if (cbxTranFormat.SelectedItem.ToString().Contains("{Proc")) { @@ -564,31 +526,16 @@ namespace Volian.Controls.Library cbxTranVersion.Tag = versionList; cbxTranFormatFillIn(versionList); - if (dicExpandedFolderNodes.Count > 0) - { - foreach (DevComponents.AdvTree.Node n in dicExpandedFolderNodes.Keys) - { - FolderInfo fi = (FolderInfo)n.Tag; - // if this folder has a docversion, use its id: - string svid = null; - if (fi.FolderDocVersionCount > 0) - svid = fi.FolderDocVersions[0].VersionID.ToString(); - if (cbxTranVersion.Tag.ToString().Contains(svid)) - n.Enabled = true; - else - n.Enabled = false; - } - } - List uncheckNodes = new List(); + List uncheckNodes = new List(); foreach (DevComponents.AdvTree.Node n in dicSelectedFolderNodes.Keys) { - FolderInfo fi = (FolderInfo)n.Tag; // this was crashing in old version of code + FolderInfo fi = n.Tag as FolderInfo; // this was crashing in old version of code // if this folder has a docversion, use its id: string svid = null; - if (fi.FolderDocVersionCount > 0) + if (fi?.FolderDocVersionCount > 0) svid = fi.FolderDocVersions[0].VersionID.ToString(); - if (svid != null && !versionList.Contains(svid)) + if (svid != null && !string.IsNullOrEmpty(versionList) && !versionList.Split(',').Contains(svid)) uncheckNodes.Add(n); else n.Enabled = true; @@ -614,13 +561,17 @@ namespace Volian.Controls.Library dicSelectedFolderNodes.Clear(); } } + + //B2026-055 – Transition Search Improvements + //Update Enabling/Disabling of Tree Elements + TraverseTree(advTreeProcSets.Nodes[0], cbxTranVersion.Tag?.ToString().Split(',')); + this.Cursor = Cursors.Default; } // C2020-033: Update the search panel for Incoming transitions. This gets called from the tree view & the ribbon public void UpdateSearchIncTransResults() { - //IncTransSelectedCount = 0; tabSearchTypes.SelectedTab = tabSearchTypes.Tabs[4]; lbSrchResultsIncTrans.DataSource = null; @@ -697,13 +648,6 @@ namespace Volian.Controls.Library DevComponents.AdvTree.Node newnode; advTreeStepTypes.Nodes.Clear(); // Add a dummy node for searching Word Sections (MS Word sections) - //newnode = new DevComponents.AdvTree.Node(); - //newnode.Text = "Word Sections"; - //newnode.Selectable = true; - //newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter; - //newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox; - //newnode.CheckBoxThreeState = false; - //newnode.CheckBoxVisible = true; newnode = NewAdvTreeNode("WORD Sections", true, true); // C2020-010: Change Accessory Sections to Word Sections wordSectionTreeNode = newnode; // C2021-028: RNO Only search, disable Word section tree node @@ -721,16 +665,6 @@ namespace Volian.Controls.Library StepData sd = sdl[sdr.Index]; // get the step type record string parentName = sd.ParentType; // this gets the parent of the this step/substep type - //Console.WriteLine("{0} {1} - {2}", parentName,sd.Type,sdr.Name); - //newnode = new DevComponents.AdvTree.Node(); - //newnode.Text = sdr.Name; - //newnode.Name = sd.Type; // this needed for the FindNodeByName() function - //newnode.Tag = sd; - //newnode.Selectable = true; - //newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter; - //newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox; - //newnode.CheckBoxThreeState = false; - //newnode.CheckBoxVisible = true; if (parentName.Equals("Base")) { newnode = NewAdvTreeNode(sdr.Name, true, true); @@ -824,8 +758,7 @@ namespace Volian.Controls.Library //C2023-010: Select all child nodes when a subtype is selected private void pnode_selected(object sender, EventArgs e) { - DevComponents.AdvTree.Node pnode = sender as DevComponents.AdvTree.Node; - if (pnode != null && pnode.HasChildNodes) + if (sender is DevComponents.AdvTree.Node pnode && pnode.HasChildNodes) { CheckTreeNodeChildren(pnode.Nodes); } @@ -840,18 +773,21 @@ namespace Volian.Controls.Library int fiCount = fi.ChildFolderCount; advTreeProcSets.Nodes.Clear(); lstCheckedDocVersions.Clear(); - topnode = new DevComponents.AdvTree.Node(); - topnode.Text = "Available Procedure Sets"; - topnode.Tag = fi; - topnode.DataKey = fi.FolderID; + topnode = new DevComponents.AdvTree.Node + { + Text = "Available Procedure Sets", + Tag = fi, + DataKey = fi.FolderID + }; advTreeProcSets.Nodes.Add(topnode); - //advTreeProcSets.AfterNodeInsert += new TreeNodeCollectionEventHandler(advTreeProcSets_AfterNodeInsert); //B2023-076: Adding option to select all procedure sets - DevComponents.AdvTree.Node selectAllNode = new Node(); - selectAllNode.Text = SelectAllProcedureSetsText; - selectAllNode.Tag = SelectAllProcedureSetsText; - selectAllNode.CheckBoxVisible = true; + DevComponents.AdvTree.Node selectAllNode = new Node + { + Text = SelectAllProcedureSetsText, + Tag = SelectAllProcedureSetsText, + CheckBoxVisible = true + }; selectAllNode.NodeClick += new EventHandler(AllProcedureSets_clicked); topnode.Nodes.Add(selectAllNode); @@ -859,18 +795,22 @@ namespace Volian.Controls.Library { foreach (FolderInfo fic in fi.SortedChildFolders) { - DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node(); - newnode.Text = fic.ToString(); - newnode.Tag = fic; - newnode.DataKey = fi.FolderID; + DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node + { + Text = fic.ToString(), + Tag = fic, + DataKey = fi.FolderID + }; AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. cntnd++; if (fic.ChildFolderCount > 0 || fic.FolderDocVersionCount > 0) // allow for '+' for tree expansion { if (fic.ChildFolderCount > 0) // B2017-176: Do not display the Working Draft node (don't create dummy for expander) { - DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node(); - tnt.Text = DummyNodeText; + DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node + { + Text = DummyNodeText + }; newnode.Nodes.Add(tnt); } topnode.Nodes.Add(newnode); @@ -879,10 +819,12 @@ namespace Volian.Controls.Library } else { - DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node(); - newnode.Text = fi.ToString(); - newnode.Tag = fi; - newnode.DataKey = fi.FolderID; + DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node + { + Text = fi.ToString(), + Tag = fi, + DataKey = fi.FolderID + }; AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. topnode.Nodes.Add(newnode); lstCheckedDocVersions.Add(Mydocversion); @@ -893,8 +835,10 @@ namespace Volian.Controls.Library { cntnd++; fi = Mydocversion.MyFolder; - topnode = new DevComponents.AdvTree.Node(); - topnode.Text = fi.ToString(); + topnode = new DevComponents.AdvTree.Node + { + Text = fi.ToString() + }; advTreeProcSets.Nodes.Add(topnode); topnode.Tag = fi; topnode.DataKey = fi.FolderID; @@ -929,43 +873,48 @@ namespace Volian.Controls.Library { foreach (FolderInfo fic in fi.SortedChildFolders) { - DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node(); - newnode.Text = fic.ToString(); - newnode.Tag = fic; - newnode.DataKey = fic.FolderID; + DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node + { + Text = fic.ToString(), + Tag = fic, + DataKey = fic.FolderID + }; par.Nodes.Add(newnode); AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. newnode.Enabled = true; + if (fic.ChildFolderCount > 0) // B2017-176: Only expand if folder has folders (not working draft nodes) { - DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node(); - tnt.Text = DummyNodeText; + DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node + { + Text = DummyNodeText + }; newnode.Nodes.Add(tnt); // B2017-176: Only expand if folder has folders (not working draft nodes): the following was moved from the code // that would check if this should be enabled if seraching for transition types. The transition controls // had a list of associated docversions, so needed to get the docversion in the folder: - if (tabSearchTypes.SelectedTab == tabTranSearch) + if (tabSearchTypes.SelectedTab == tabTranSearch && !dicSelectedFolderNodes.ContainsKey(newnode)) + dicSelectedFolderNodes.Add(newnode, false); + } + + if (tabSearchTypes.SelectedTab == tabTranSearch) { - if (!dicSelectedFolderNodes.ContainsKey(newnode)) dicSelectedFolderNodes.Add(newnode, false); - // get the docversion for this folder, if it has one and determine whether it is enabled for transitions: - string svid = null; - if (fic.FolderDocVersionCount > 0) - svid = fic.FolderDocVersions[0].VersionID.ToString(); - newnode.Enabled = svid != null && cbxTranVersion.Tag != null ? cbxTranVersion.Tag.ToString().Contains(svid) : false; + //B2026-055 – Transition Search Improvements + //Update Enabling/Disabling of Tree Elements + TraverseTree(advTreeProcSets.Nodes[0], cbxTranVersion.Tag?.ToString().Split(',')); } } } } } - } public void AdvTree_AfterExpandorCollapse(object sender, AdvTreeNodeEventArgs e) { Node bottomNode = BottomTreeNode(cmboTreeROs.AdvTree.Nodes); - Node lastNode = cmboTreeROs.AdvTree.Nodes[cmboTreeROs.AdvTree.Nodes.Count - 1]; + _ = cmboTreeROs.AdvTree.Nodes[cmboTreeROs.AdvTree.Nodes.Count - 1]; //LastNode int top = cmboTreeROs.AdvTree.Nodes[0].Bounds.Top; - int bottom = bottomNode.Bounds.Bottom + 5; + int bottom; int hScrollBarHeight = cmboTreeROs.AdvTree.HScrollBar != null ? cmboTreeROs.AdvTree.HScrollBar.Height : 0; bottom = bottomNode.Bounds.Bottom + 5; cmboTreeROs.AdvTree.Size = new Size(cmboTreeROs.AdvTree.Size.Width, Math.Min(525, bottom - top + hScrollBarHeight)); @@ -974,12 +923,9 @@ namespace Volian.Controls.Library { int yLookFor = (bottom - cmboTreeROs.AdvTree.Size.Height) + 2 * hScrollBarHeight; Node topNode = FindTreeNodeAt(cmboTreeROs.AdvTree.Nodes, yLookFor); - if (topNode != null) - { - topNode.EnsureVisible(); + topNode?.EnsureVisible(); } } - } #endregion @@ -988,8 +934,10 @@ namespace Volian.Controls.Library public void SetupAnnotationSearch(AnnotationDetails annotationDetails, DisplayTabControl tc) { _AnnotationDetails = annotationDetails; - List annoTypes = new List(); - annoTypes.Add(new AnnotationTypeSearch("All Annotations", string.Empty)); + List annoTypes = new List + { + new AnnotationTypeSearch("All Annotations", string.Empty) + }; AnnotationTypeInfoList annoList = AnnotationTypeInfoList.Get(); foreach (AnnotationTypeInfo ati in annoList) annoTypes.Add(new AnnotationTypeSearch(ati.Name, ati.TypeID.ToString())); @@ -1056,14 +1004,15 @@ namespace Volian.Controls.Library foreach (Symbol sym in sl) { - DevComponents.DotNetBar.ButtonItem btnCM = new DevComponents.DotNetBar.ButtonItem(); - - btnCM.Text = string.Format("{0}", (char)sym.Unicode); + DevComponents.DotNetBar.ButtonItem btnCM = new DevComponents.DotNetBar.ButtonItem + { + Text = string.Format("{0}", (char)sym.Unicode), // to name button use unicode rather than desc, desc may have spaces or odd chars - btnCM.Name = "btnCM" + sym.Unicode.ToString(); - btnCM.Tooltip = sym.Desc; - btnCM.Tag = string.Format(@"{0}", sym.Unicode); - btnCM.FontBold = true; + Name = $"btnCM{sym.Unicode.ToString()}", + Tooltip = sym.Desc, + Tag = string.Format(@"{0}", sym.Unicode), + FontBold = true + }; btnCM.Click += new System.EventHandler(btnSym_Click); galSymbols.SubItems.Add(btnCM); } @@ -1112,9 +1061,11 @@ namespace Volian.Controls.Library private DevComponents.AdvTree.Node NewAdvTreeNode(string nodetext, bool selectable, bool chxbxvisable) { DevComponents.AdvTree.Node newnode; - newnode = new DevComponents.AdvTree.Node(); - newnode.Text = nodetext; - newnode.Selectable = selectable; + newnode = new DevComponents.AdvTree.Node + { + Text = nodetext, + Selectable = selectable + }; AddCheckBox(chxbxvisable, newnode);//C2016-045 Allow Folders to be selected. return newnode; } @@ -1161,7 +1112,7 @@ namespace Volian.Controls.Library // folder properties dialog bool allowNonAdmin = IncTranCvtPerm(); List itmsEditable = new List(); // return this list - int listCount = 0; + int listCount; if (all) // Check all in list { listCount = _SearchResults.Count; @@ -1185,14 +1136,13 @@ namespace Volian.Controls.Library // not all can be converted to text. If count of itmsEditable & lbis are different some cannot be edited. if (itmsEditable.Count == 0) { - FlexibleMessageBox.Show("You do not have permission to edit any of the procedures, sections, and/or steps" + (all ? "." : " that are selected."), + FlexibleMessageBox.Show($"You do not have permission to edit any of the procedures, sections, and/or steps{(all ? "." : " that are selected.")}", "Convert Transition to Text", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; } else if (itmsEditable.Count != listCount) { - DialogResult ans = FlexibleMessageBox.Show("You only have permission to edit some of the procedures, sections, and/or steps that are selected.procedures, sections, and/or steps" + (all ? "." : " that are selected.") + - "\r\n\r\n Should the conversion of the transitions to text continue?", + DialogResult ans = FlexibleMessageBox.Show($"You only have permission to edit some of the procedures, sections, and/or steps that are selected.procedures, sections, and/or steps{(all ? "." : " that are selected.")}\r\n\r\n Should the conversion of the transitions to text continue?", "Convert Transition to Text", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (ans == DialogResult.No) return null; } @@ -1213,7 +1163,7 @@ namespace Volian.Controls.Library private void btnTranCvtSelToTxt_Click(object sender, EventArgs e) { // First see if all selected can be converted, i.e. user has permission to edit - List lbis = lbSrchResultsIncTrans.CheckedItems; + _ = lbSrchResultsIncTrans.CheckedItems; List itmsEditable = TranCvtCheckPermission(false); if (itmsEditable == null || itmsEditable.Count == 0) return; TranCvtToTxt(itmsEditable); @@ -1446,8 +1396,10 @@ namespace Volian.Controls.Library { ROFSTLookup.rodbi db = dbs[i]; - DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node(db.dbiTitle); - tn.Tag = db; + DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node(db.dbiTitle) + { + Tag = db + }; cmboTreeROs.Nodes.Add(tn); AddDummyGroup(db, tn); @@ -1500,17 +1452,14 @@ namespace Volian.Controls.Library if (tn.HasChildNodes && tn.Nodes[0].Text != DummyNodeText) return; // already loaded. if (tn.HasChildNodes && tn.Nodes[0].Text == DummyNodeText) tn.Nodes[0].Remove(); - ROFSTLookup.rochild[] chld = null; - - if (tn.Tag is ROFSTLookup.rodbi) + ROFSTLookup.rochild[] chld; + if (tn.Tag is ROFSTLookup.rodbi db) { - ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag; MyROFSTLookup.LoadChildren(ref db); chld = db.children; } - else if (tn.Tag is ROFSTLookup.rochild) + else if (tn.Tag is ROFSTLookup.rochild ch) { - ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag; MyROFSTLookup.LoadChildren(ref ch); chld = ch.children; } @@ -1529,8 +1478,6 @@ namespace Volian.Controls.Library for (int i = 0; i < chld.Length; i++) { ProgressBar_SetValue(i); - DevComponents.AdvTree.Node tmp = null; - ROFSTLookup.rochild roc = chld[i]; // if this is a group, i.e. type 0, add a dummy node @@ -1554,10 +1501,13 @@ namespace Volian.Controls.Library } + Node tmp; if (roc.value == null) { - tmp = new DevComponents.AdvTree.Node(roc.title); - tmp.Tag = roc; + tmp = new DevComponents.AdvTree.Node(roc.title) + { + Tag = roc + }; int index = FindIndex(tn.Nodes, tmp.Text); tn.Nodes.Insert(index, tmp); @@ -1567,8 +1517,10 @@ namespace Volian.Controls.Library } else { - tmp = new DevComponents.AdvTree.Node(roc.title); - tmp.Tag = roc; + tmp = new DevComponents.AdvTree.Node(roc.title) + { + Tag = roc + }; if (roc.roid.Length == 16) { @@ -1608,9 +1560,8 @@ namespace Volian.Controls.Library { cbxFndUnLnkROVals.Enabled = false; } - else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild) + else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild ro) { - ROFSTLookup.rochild ro = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag; // B2022-026 RO Memory Reduction code - check children length cbxFndUnLnkROVals.Enabled = (ro.children == null || ro.children.Length <= 0); } @@ -1632,12 +1583,7 @@ namespace Volian.Controls.Library bool keeplooking = true; //build a stack (bread crumb trail) of where is procedure set came from within the tree. Stack crumbs = new Stack(); - //crumbs.Push(Mydocversion.Name); // ex: "working draft" - //crumbs.Push(Mydocversion.MyFolder.Name); // ex: "Emergency Procedures" - //crumbs.Push(Mydocversion.MyFolder.MyParent.Name); // ex: "STPNOC-South Texas" - //crumbs.Push(advTreeProcSets.Nodes[0].Text); //top node of my tree - //crumbs.Push(Mydocversion.Name); // ex: "working draft" crumbs.Push(Mydocversion.MyFolder.Name); // ex: "Emergency Procedures" FolderInfo fi = Mydocversion.MyFolder.MyParent; while (fi != null) @@ -1822,13 +1768,11 @@ namespace Volian.Controls.Library // item to be clicked and to turn on/off the btnTranCvtSelToTxt button for converting selected to test. private void lbSrchResultsIncTrans_ItemClicked(object sender, EventArgs e) { - ListBoxItem lbi = sender as ListBoxItem; - if (lbi != null) + if (sender is ListBoxItem lbi) { ItemBindingData ibd = lbi.Tag as ItemBindingData; - ItemInfo ii = ibd.DataItem as ItemInfo; bool allowNonAdmin = IncTranCvtPerm(); - if (lbi.CheckState == CheckState.Checked && ii != null) + if (lbi.CheckState == CheckState.Checked && ibd.DataItem is ItemInfo ii) { if (!allowNonAdmin && !UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion)) { @@ -2039,11 +1983,8 @@ namespace Volian.Controls.Library bool includeSpecialChars = (TextSearchString != @"\?"); // true; // Build list of selected types that were searched string typstr = null; - foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : typstr + ", " + s; - TypesSelected = "Filtered By: " + ((typstr != null) ? typstr : "All Step Types"); - //TypesSelected = "Step Types Searched: " + ((typstr != null) ? typstr : "all step types"); - //TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "all step types"); - //TypesSelected = (typstr != null) ? "Searched Step Types: " + typstr : "Searched All Step Types"; + foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : $"{typstr}, {s}"; + TypesSelected = $"Filtered By: {typstr ?? "All Step Types"}"; string unitPrefix = string.Empty; if (Mydocversion != null) unitPrefix = Mydocversion.DocVersionConfig.Unit_ProcedureNumber; @@ -2063,11 +2004,8 @@ namespace Volian.Controls.Library } else { - //string typstr = null; - //foreach (string s in lstCheckedStepTypesStr) typstr = typstr==null?s:typstr + ", " + s; - //ReportTitle = "Search for Selected Types"; //"Proms - Search by Type: " + typstr; ReportTitle = "Step Element Report"; //"Proms - Search by Type: " + typstr; - TypesSelected = "Filtered By: " + typstr; + TypesSelected = $"Filtered By: {typstr}"; SearchString = null; // B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, string.Empty, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Value, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); @@ -2076,14 +2014,6 @@ namespace Volian.Controls.Library } else { - //if (textSearchString.Equals(string.Empty)) - //{ - // MessageBox.Show("Please enter some search text, then click the Search button", "No Search Text"); - // cbxTextSearchText.Focus(); - //} - //else - //{ - //ReportTitle = string.Format("Proms - {0} Search for '{1}'", cbxBooleanTxtSrch.Checked ? "Boolean" : "Text", TextSearchString); ReportTitle = string.Format("Search for '{0}'", TextSearchString); // C2020-009: Search - Allow search 'By Word'. @@ -2114,8 +2044,6 @@ namespace Volian.Controls.Library } } SearchString = TextSearchString; - //TypesSelected = (typstr != null) ? "Searched Step Types: " + typstr : "Searched All Step Types"; - //TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "All Step Types"); // B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, TextSearchString /*.Replace(@"\",@"\u9586?")*/, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, cbxIncROTextSrch.Checked ? ItemSearchIncludeLinks.Value : ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix); @@ -2129,7 +2057,6 @@ namespace Volian.Controls.Library { LastSearchWasAnnotations = true; // B2019-119 only refresh annotation search results if an annotation search was done SearchString = null; - //ReportTitle = string.Format("Proms - Annotation Search for '{0}'", cbxTextSearchAnnotation.Text); if (cbxTextSearchAnnotation.Text == null || cbxTextSearchAnnotation.Text == string.Empty) { ReportTitle = string.Format("Find {0}{1}", cbxAnnoTypes.Text, (cbxAnnoTypes.SelectedIndex > 0) ? " Annotations" : string.Empty); @@ -2138,14 +2065,8 @@ namespace Volian.Controls.Library { ReportTitle = string.Format("Search {0}{1} For '{2}'", cbxAnnoTypes.Text, (cbxAnnoTypes.SelectedIndex > 0) ? " Annotations" : string.Empty, cbxTextSearchAnnotation.Text); } - //ReportTitle = string.Format("Search Annotations for '{0}'", cbxTextSearchAnnotation.Text); - //string srchStr = ConvertSpecialChars(cbxTextSearchAnnotation.Text);//cbxTextSearchAnnotation.Text; - //TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "All Step Types"); - - //SearchResults = ItemInfoList.GetListFromAnnotationSearch(dviSearchList, typeSearchList, textSearchString, srchStr, cbxCaseSensitiveAnnoText.Checked); SearchResults = ItemInfoList.GetListFromAnnotationSearch(DVISearchList, TypeSearchList, AnnotationSearchType, cbxTextSearchAnnotation.Text, cbxCaseSensitiveAnnoText.Checked, unitPrefix); - //UpdateAnnotationSearchResults(); cmbResultsStyleIndex = 2; // display annotation text in results // C2019-001: Search in RNO steps only if (cbxRnoOnlyAnnot.Checked) GetInRNOResults(); @@ -2153,9 +2074,7 @@ namespace Volian.Controls.Library else if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[2]) // RO Search { SearchString = null; - //ReportTitle = "Proms - Referenced Object Search"; ReportTitle = string.Format("Search For Referenced Object:\n{0}", cmboTreeROs.Text); - //TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "All Step Types"); if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { @@ -2175,22 +2094,37 @@ namespace Volian.Controls.Library { ReportTitle = string.Format("Search For Transitions: Transition Type: {0}, Transition Category: {1}", cbxTranFormat.SelectedItem, cbxTranCategory.SelectedItem); string docVersionList = string.Empty; + bool bypassSearch = false; if (lstCheckedDocVersions.Count == 0) docVersionList = cbxTranVersion.Tag.ToString(); else { - string sep = string.Empty; - foreach (DocVersionInfo dvi in lstCheckedDocVersions) + //B2026-055 – Transition Search Improvements + //Changed matching to take Filtered Formats into account if both tree + //Items selected and Format dropdown filtered + if (string.IsNullOrEmpty(cbxTranVersion.Tag?.ToString())) { - docVersionList += sep + dvi.VersionID.ToString(); - sep = ","; + docVersionList = string.Join(",", lstCheckedDocVersions.Select(y => y.VersionID.ToString())); + } + else + { + var fromatversionslst = cbxTranVersion.Tag.ToString().Split(',').Select(int.Parse); + var selectedversionlst = lstCheckedDocVersions.Select(y => y.VersionID); + docVersionList = string.Join(",", fromatversionslst.Intersect(selectedversionlst)); + + if (string.IsNullOrEmpty(docVersionList)) + { + bypassSearch = true; + FlexibleMessageBox.Show("No Matches Found.", "Search"); } } + } // B2018-134 to search specifically for Outside Transitions, set docVeronList to empty string so that all procedure sets are considered - if (cbxTranCategory.SelectedItem.ToString() == "Outside") + if (cbxTranCategory.SelectedItem?.ToString() == "Outside") docVersionList = string.Empty; // added TypeSearchList for bug fix B2015-055 - SearchResults = ItemInfoList.GetListFromTransitionSearch(docVersionList, cbxTranFormat.SelectedIndex - 1, cbxTranCategory.SelectedItem.ToString() == "All" ? string.Empty : cbxTranCategory.SelectedItem.ToString(), TypeSearchList); + if (cbxTranFormat.SelectedIndex == -1) cbxTranFormatFillIn(docVersionList); + if (!bypassSearch) SearchResults = ItemInfoList.GetListFromTransitionSearch(docVersionList, cbxTranFormat.SelectedIndex - 1, cbxTranCategory.SelectedItem?.ToString() == "All" ? string.Empty : (cbxTranCategory.SelectedItem?.ToString() ?? string.Empty), TypeSearchList); cmbResultsStyleIndex = 3; // display step text in results // C2019-001: Search in RNO steps only if (cbxRnoOnlyTrans.Checked) GetInRNOResults(); @@ -2247,16 +2181,13 @@ namespace Volian.Controls.Library string tmpmsg = (cbxBooleanTxtSrch.Checked && ex.Message.Contains("Syntax error") && ex.Message.Contains("full-text search")) ? "Place \"\" around words that you are searching for, so that parser can better understand what you are trying to find" : ex.Message; - FlexibleMessageBox.Show(tmpmsg, "Search Error: " + ex.GetType().Name); + FlexibleMessageBox.Show(tmpmsg, $"Search Error: {ex.GetType().Name}"); } finally { Cursor = savcursor; } - //Console.WriteLine("{0} Milliseconds", TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalMilliseconds); OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); - //if (VlnSettings.DebugMode) - // MessageBox.Show(string.Format("{0} Milliseconds", TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalMilliseconds)); } private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) @@ -2317,7 +2248,7 @@ namespace Volian.Controls.Library if (ii.SearchAnnotationText == null) ii.SearchAnnotationText = AnnotationInfo.Get(ii.ItemAnnotations[0].AnnotationID).SearchText; } - if (ii.SearchAnnotationText == null) ii.SearchAnnotationText = "None - [" + ii.DisplayText + "]"; + if (ii.SearchAnnotationText == null) ii.SearchAnnotationText = $"None - [{ii.DisplayText}]"; else { hasAnnot = true; @@ -2467,7 +2398,7 @@ namespace Volian.Controls.Library //C2025-005 Find Step Elements //Need to refresh the Doc List and Available Step Types //if All Procedure Sets was selected - if (n.Tag == SelectAllProcedureSetsText) + if (n.Tag is string txt && txt == SelectAllProcedureSetsText) { if (n.Checked) { @@ -2518,7 +2449,6 @@ namespace Volian.Controls.Library { if (tn.Checked) { - //tn.Style = DevComponents.AdvTree.NodeStyles.Apple; // sets green background on selected folder(s) //B2023-112: Don't crash if on top 'All' node (did not have associated folder) FolderInfo fi = tn.Tag as FolderInfo; // if this folder has a docversion, use its id: @@ -2565,8 +2495,10 @@ namespace Volian.Controls.Library lstCheckedStepTypesStr.Clear(); foreach (string str in strs) { - Node newnode = new DevComponents.AdvTree.Node(); - newnode.Text = str; + Node newnode = new DevComponents.AdvTree.Node + { + Text = str + }; advTreeStepTypes.Nodes.Add(newnode); } buildStepTypePannelTitle(); @@ -2655,17 +2587,24 @@ namespace Volian.Controls.Library private void cbxTranFormatFillIn(string vid) { vid = vid.IndexOf(",") < 0 ? vid : vid.Substring(0, cbxTranVersion.Tag.ToString().IndexOf(",")); + //B2026-055 – Transition Search Improvements + //Change the order of items happening + //previous order was causing an error when clicked downdownlist to + //show all items and then didn't select an item in the list + cbxTranFormat.Items.Clear(); + cbxTranFormat.Items.Add("All"); + if (!string.IsNullOrEmpty(vid)) + { DocVersionInfo dvi = DocVersionInfo.Get(int.Parse(vid)); TransTypeList ttl = dvi.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList; - cbxTranFormat.Items.Clear(); - cbxTranFormat.Items.Add("All"); for (int i = 0; i < ttl.MaxIndex; i++) { cbxTranFormat.Items.Add(new TransItem(ttl[i].TransMenu.Replace("?.", string.Empty), ttl[i].TransFormat.Replace("?.", string.Empty))); } + } cbxTranFormat.SelectedIndex = 0; cbxTranCategory.Items.Clear(); @@ -2715,9 +2654,9 @@ namespace Volian.Controls.Library if (advTreeStepTypes.Nodes.Count == 1 && n.Checked) { - if (n.Tag is DocVersionInfo) // Only set MyDocVersion if it is a DocVersion + if (n.Tag is DocVersionInfo info) // Only set MyDocVersion if it is a DocVersion { - Mydocversion = (DocVersionInfo)n.Tag; + Mydocversion = info; StartAdvTreeStepTypesFillIn();// B2016-258 Hang after selecting a procedure if the Step Type panel is open on the search panel } } @@ -2742,8 +2681,6 @@ namespace Volian.Controls.Library if (n.Checked) { - //n.Style = DevComponents.AdvTree.NodeStyles.Apple; // B2023-112: coloring of proc set tree nodes was not working correctly - if (sd == null) { //C2023-010: Since the tag is null for Word Sections and HLS types, we need to determine which one has been selected. Word sections we need @@ -2872,7 +2809,7 @@ namespace Volian.Controls.Library xpStepTypes.TitleStyle.BackColor1.Color = saveXpStepTypeTitleColor; } - else //lstCheckedStepTypes.Count > 0 + else { // show how many selected whether panel is expanded or not xpStepTypes.TitleText = string.Format("{0} Step Element{1} Selected", lstCheckedStepTypes.Count, (lstCheckedStepTypes.Count > 1) ? "s" : string.Empty); // B2018-132 changed second {0} to {1} @@ -2944,7 +2881,6 @@ namespace Volian.Controls.Library private bool OnlyWordSectTypeSel() { // B2021-100: Enable/disable the RNO Only checkbox & WORD Sections tree node in Step Elements to Search. - // lstCheckedStepTypes[x] = 0 for Word sections: if (lstCheckedStepTypes != null && lstCheckedStepTypes.Count == 1 && lstCheckedStepTypes[0] == 0) return true; @@ -3143,11 +3079,6 @@ namespace Volian.Controls.Library lbSrchResults.DataSource = null; lbSrchResults.Items.Clear(); toolTip1.SetToolTip(lbSrchResults, null); - string unitPrefix = string.Empty; - if (Mydocversion != null) - unitPrefix = Mydocversion.DocVersionConfig.Unit_ProcedureNumber; - if (unitPrefix.EndsWith("#")) - unitPrefix = unitPrefix.Replace("#", string.Empty); Cursor = Cursors.WaitCursor; try // B2021-045: don't crash if xml file cannot be loaded. @@ -3177,7 +3108,7 @@ namespace Volian.Controls.Library Node tnode = advTreeProcSets.FindNodeByDataKey(folderID); if (tnode != null) tnode.Checked = true; } - Mydocversion = tmpdvi == null ? fromLoadFiledvi : tmpdvi; + Mydocversion = tmpdvi ?? fromLoadFiledvi; } AdvTreeStepTypesFillIn(); @@ -3200,10 +3131,10 @@ namespace Volian.Controls.Library } string typstr = null; - foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : typstr + ", " + s; - TypesSelected = "Filtered By: " + ((typstr != null) ? typstr : "All Step Types"); + foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : $"{typstr}, {s}"; + TypesSelected = $"Filtered By: {typstr ?? "All Step Types"}"; ReportTitle = "Step Element Report"; //"Proms - Search by Type: " + typstr; - TypesSelected = "Filtered By: " + typstr; + TypesSelected = $"Filtered By: {typstr}"; advTreeStepTypes.RefreshItems(); buildStepTypePannelTitle(); } @@ -3296,7 +3227,7 @@ namespace Volian.Controls.Library } } } - catch (Exception ex) + catch (Exception) { FlexibleMessageBox.Show("An error occurred while reading the xml file.\r\n\r\nThis can happen when the file selected for the Load is not saved\r\n" + "from a PROMS Search or if some of the steps no longer exist.", "Search Load Failed", MessageBoxButtons.OK); @@ -3476,6 +3407,46 @@ namespace Volian.Controls.Library } } + //B2026-055 – Transition Search Improvements + //Update Enabling/Disabling of Tree Elements + public bool TraverseTree(DevComponents.AdvTree.Node node, string[] versions) + { + bool result = true; + int numhiddenchildnodes = 0; + + // Recursively call this method for each child node + foreach (DevComponents.AdvTree.Node childNode in node.Nodes) + { + if (!TraverseTree(childNode, versions)) + { + numhiddenchildnodes++; + } + } + + // Process the current node (e.g., enable it if it is contained) + + //Select all always shows + //also Enable Dummy Nodes by default + if (versions == null || (versions.Length == 1 && string.IsNullOrEmpty(versions[0])) || node.Tag == null || (node.Tag is string txt && txt == SelectAllProcedureSetsText)) + { + node.Enabled = true; + return true; + } + //if all child nodes are hidden, hide the parent + else if (numhiddenchildnodes == node.Nodes.Count) + { + result = false; + } + + FolderInfo fi = (FolderInfo)node.Tag; + if (fi.FolderDocVersionCount > 0) + { + result = versions.Contains(fi.FolderDocVersions[0].VersionID.ToString()); + } + + node.Enabled = result; + return result; + } private void btnCopySearchResults_Click(object sender, EventArgs e) { ICollection myList = lbSrchResults.DataSource as ICollection; @@ -3541,7 +3512,6 @@ namespace Volian.Controls.Library private bool IncTransCvtAllToTextPerm() { if (_SearchResults == null) return false; - int cnt = 0; bool allowNonAdmin = IncTranCvtPerm(); foreach (ItemInfo ii in _SearchResults) { @@ -3657,6 +3627,8 @@ namespace Volian.Controls.Library } } } +#pragma warning restore IDE1006 // Naming Styles +#pragma warning restore IDE0044 // Add readonly modifier #endregion