From fd51c209a3e8e05759afdd5cd1a1c1d15d469da9 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 15 Jun 2026 15:18:03 -0400 Subject: [PATCH 01/49] Development --- .../VlnFlexGrid.Designer.cs | 6 +- PROMS/Volian.Controls.Library/VlnFlexGrid.cs | 58 ++++++++++++------- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs index 95fa1523..d6e48711 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs @@ -1,4 +1,5 @@ using System; +using System.Windows.Forms; namespace Volian.Controls.Library { @@ -78,7 +79,10 @@ namespace Volian.Controls.Library // VlnFlexGrid // this.Rows.DefaultSize = 19; - + this.AllowDrop = true; + this.DragEnter += new DragEventHandler(Control_DragEnter); + this.DragDrop += new DragEventHandler(Control_DragDrop); + ((System.ComponentModel.ISupportInitialize)(this)).EndInit(); this.ResumeLayout(false); diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs index f7f2310f..6f85943f 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs @@ -1,22 +1,23 @@ -using System; -using System.ComponentModel; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text; -using System.Windows.Forms; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Xml; -using System.IO; -using Volian.Controls.Library; -using VEPROMS.CSLA.Library; using C1.Win.C1FlexGrid; using C1.Win.C1SpellChecker; -using System.Text.RegularExpressions; -using System.Xml.Serialization; -using Volian.Base.Library; +using DevComponents.DotNetBar.Controls; using JR.Utils.GUI.Forms; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Serialization; +using VEPROMS.CSLA.Library; +using Volian.Base.Library; +using Volian.Controls.Library; namespace Volian.Controls.Library { @@ -4438,11 +4439,28 @@ namespace Volian.Controls.Library // } //} + private void Control_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.Text)) + { + e.Effect = DragDropEffects.Copy; // Allow copy + } + else + { + e.Effect = DragDropEffects.None; // Disallow + } + } + private void Control_DragDrop(object sender, DragEventArgs e) + { + string data = (string)e.Data.GetData(DataFormats.Text); + // Process the data (e.g., display it in a TextBox) + this.Text = data; + } #region Uneven Selections - /// - /// True if the top and bottom row of the selection is the same for every column - /// - public bool EvenSelection + /// + /// True if the top and bottom row of the selection is the same for every column + /// + public bool EvenSelection { get { From 7f75af7119cbe21fb08a854867400608994aaa39 Mon Sep 17 00:00:00 2001 From: mschill Date: Thu, 25 Jun 2026 15:46:25 -0400 Subject: [PATCH 02/49] 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 03/49] =?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 04/49] 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 05/49] 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 06/49] =?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 07/49] 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 08/49] 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 09/49] =?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 10/49] 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 11/49] 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 12/49] =?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 From 51f2897a33baaeeeebb77ffe7cf1c3d4f3736d53 Mon Sep 17 00:00:00 2001 From: mschill Date: Thu, 16 Jul 2026 08:26:07 -0400 Subject: [PATCH 13/49] =?UTF-8?q?C2026-044=20=E2=80=93=20ve=5FGetParentIte?= =?UTF-8?q?m=20Performance=20Improvement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROMS/VEPROMS User Interface/PROMSFixes.Sql | 33 ++++++++++++--------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/PROMS/VEPROMS User Interface/PROMSFixes.Sql b/PROMS/VEPROMS User Interface/PROMSFixes.Sql index 5209a3a7..035bf245 100644 --- a/PROMS/VEPROMS User Interface/PROMSFixes.Sql +++ b/PROMS/VEPROMS User Interface/PROMSFixes.Sql @@ -5547,6 +5547,12 @@ ELSE PRINT 'Function: ve_GetItemDerivedApplicability Error on Creation' GO ------- + +-- ============================================= +-- Author: Matthew Schill +-- Modify date: 07/14/2026 +-- Description: Reworked ve_GetParentItem for Performance improvement +-- ============================================= /****** Object: UserDefinedFunction [dbo].[vefn_GetParentItem] Script Date: 03/28/2012 17:58:48 ******/ IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[ve_GetParentItem]') AND OBJECTPROPERTY(id,N'IsScalarFunction') = 1) DROP FUNCTION [ve_GetParentItem]; @@ -5555,29 +5561,28 @@ GO Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE Copyright 2012 - Volian Enterprises, Inc. All rights reserved. *****************************************************************************/ -CREATE FUNCTION [dbo].[ve_GetParentItem] (@ItemID int) RETURNS int +CREATE OR ALTER FUNCTION [dbo].[ve_GetParentItem4] (@ItemID int) RETURNS int WITH EXECUTE AS OWNER AS BEGIN DECLARE @ParentID int; -WITH Itemz([ItemID],[IsFound]) as +WITH Itemz([ItemID]) as ( -select ii.itemid,0 from items ii where ii.itemid = @ItemID +select ii.itemid from items ii WITH (NOLOCK) where ii.itemid = @ItemID union all -select ii.previousid,0 from items ii +select ii.previousid from items ii WITH (NOLOCK) join itemz zz on ii.itemid = zz.itemid where ii.previousid is not null -and zz.isfound = 0 -union all -select ii.itemid,1 -from parts pp -join itemz zz on pp.itemid = zz.itemid -join items ii on ii.contentid = pp.contentid ) -select top 1 @ParentID = itemid from itemz -where isfound = 1 OPTION (MAXRECURSION 10000) +select top 1 @ParentID = ii.itemid +from itemz +inner join parts pp WITH (NOLOCK) on pp.itemid = itemz.itemid +inner join items ii WITH (NOLOCK) on ii.contentid = pp.contentid +OPTION (MAXRECURSION 10000) + RETURN @ParentID END + GO IF (@@Error = 0) PRINT 'ScalerFunction [vefn_GetParentItem] Succeeded' @@ -25051,8 +25056,8 @@ BEGIN TRY -- Try Block DECLARE @RevDate varchar(255) DECLARE @RevDescription varchar(255) - set @RevDate = '06/29/2026 7:00 AM' - set @RevDescription = 'Update to Grid Deletion Audits' + set @RevDate = '07/16/2026 8:30 AM' + set @RevDescription = 'Reworked ve_GetParentItem for Performance improvement' Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription From 48054f5bf14a0e6f27402c9cf514519e0d9eeb0e Mon Sep 17 00:00:00 2001 From: mschill Date: Thu, 16 Jul 2026 08:26:52 -0400 Subject: [PATCH 14/49] =?UTF-8?q?C2026-044=20=E2=80=93=20ve=5FGetParentIte?= =?UTF-8?q?m=20Performance=20Improvement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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 035bf245..40b8b28e 100644 --- a/PROMS/VEPROMS User Interface/PROMSFixes.Sql +++ b/PROMS/VEPROMS User Interface/PROMSFixes.Sql @@ -5561,7 +5561,7 @@ GO Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE Copyright 2012 - Volian Enterprises, Inc. All rights reserved. *****************************************************************************/ -CREATE OR ALTER FUNCTION [dbo].[ve_GetParentItem4] (@ItemID int) RETURNS int +CREATE OR ALTER FUNCTION [dbo].[ve_GetParentItem] (@ItemID int) RETURNS int WITH EXECUTE AS OWNER AS BEGIN From a13b03a13688dae5973c5ceeb89980939a1ea9e9 Mon Sep 17 00:00:00 2001 From: mschill Date: Thu, 16 Jul 2026 08:48:11 -0400 Subject: [PATCH 15/49] =?UTF-8?q?C2026-044=20=E2=80=93=20ve=5FGetParentIte?= =?UTF-8?q?m=20Performance=20Improvement=20Added=20Included=20columns=20to?= =?UTF-8?q?=20Index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROMS/VEPROMS User Interface/PROMSFixes.Sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/PROMS/VEPROMS User Interface/PROMSFixes.Sql b/PROMS/VEPROMS User Interface/PROMSFixes.Sql index 40b8b28e..ab6f422e 100644 --- a/PROMS/VEPROMS User Interface/PROMSFixes.Sql +++ b/PROMS/VEPROMS User Interface/PROMSFixes.Sql @@ -5589,6 +5589,18 @@ IF (@@Error = 0) PRINT 'ScalerFunction [vefn_GetParentItem] Succeeded' ELSE PRINT 'ScalerFunction [vefn_GetParentItem] Error on Creation' go +IF EXISTS (SELECT * FROM dbo.sysIndexes WHERE name like 'IX_PartsItemID') + DROP INDEX [IX_PartsItemID] ON [dbo].[tblParts]; +GO + +CREATE NONCLUSTERED INDEX IX_PartsItemID +ON [dbo].[tblParts] ([ItemID] ASC) +INCLUDE([ContentID],[DeleteStatus],[FromType]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +GO + +PRINT 'Added IX_PartsItemID Index. Speeds up Getting Parent Items' +GO + /****** Object: UserDefinedFunction [dbo].[vefn_CanTransitionBeCreated] Script Date: 10/14/2012 02:03:30 ******/ IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[vefn_CanTransitionBeCreated]') AND OBJECTPROPERTY(id,N'IsScalarFunction') = 1) DROP FUNCTION [vefn_CanTransitionBeCreated]; From d7c2300021f9af8c65c9b4a8d71b71dbc2d96d39 Mon Sep 17 00:00:00 2001 From: John Jenko Date: Fri, 17 Jul 2026 10:11:43 -0400 Subject: [PATCH 16/49] F2026-017 Blank line was sometimes missing after the Note and Caution text. This was a 64-bit build difference that affected the text width calculations. --- PROMS/Formats/fmtall/SUMSAMall.xml | Bin 129000 -> 129000 bytes PROMS/Formats/fmtall/SUMall.xml | Bin 128934 -> 128934 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/PROMS/Formats/fmtall/SUMSAMall.xml b/PROMS/Formats/fmtall/SUMSAMall.xml index 4b073fb5f1f19f68edcf8eab19314656fadd820c..0cdcb99296dc3525146150145ae0ab549c8d8138 100644 GIT binary patch delta 39 scmaFyp8dsp_6=MM84V}@Uo5{_YhfHCggIGjAy@OJMcX$mVl)c{0CxHj*8l(j delta 35 qcmaFyp8dsp_6=MMC;wZluvu$i93zM^S!*Fz^QJ}HH!Wf`3k3jC1QBxp diff --git a/PROMS/Formats/fmtall/SUMall.xml b/PROMS/Formats/fmtall/SUMall.xml index 3873bf8bb1e966484400c70b021bc43b0ec8cd52..0cfbc9024d2f330d94a599ac727400864dd1aa87 100644 GIT binary patch delta 31 pcmV+)0O0?o?+2#u2e87T0Wp(7q$#uPqErC^F@r&*w?U) Date: Tue, 21 Jul 2026 10:24:46 -0400 Subject: [PATCH 17/49] C2026-046 - Decrease check if need to update ROs. --- .../VEPROMS.CSLA.Library/Extension/ROFSTExt.cs | 4 +++- .../Session/ROWorkingDraftAsk.cs | 18 ++++++++++++++++++ .../VEPROMS.CSLA.Library.csproj | 1 + PROMS/Volian.Controls.Library/DisplayRO.cs | 5 ++++- 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 PROMS/VEPROMS.CSLA.Library/Session/ROWorkingDraftAsk.cs diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTExt.cs index 0098d346..f2e4ffc2 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTExt.cs @@ -326,7 +326,9 @@ namespace VEPROMS.CSLA.Library // all of the calls aways set the flags to not update the RO values public static ROFst UpdateRoFst(RODbInfo rdi, DocVersion docver, ROFstInfo origROFst, ROFstInfoProgressBarRefresh myProgressBarRefresh) { - if (myProgressBarRefresh != null) myProgressBarRefresh(0, 100, "Starting Update"); + ROWorkingDraftAsk.ClearWorkingDrafts(); + + if (myProgressBarRefresh != null) myProgressBarRefresh(0, 100, "Starting Update"); int origFSTid = origROFst.ROFstID; diff --git a/PROMS/VEPROMS.CSLA.Library/Session/ROWorkingDraftAsk.cs b/PROMS/VEPROMS.CSLA.Library/Session/ROWorkingDraftAsk.cs new file mode 100644 index 00000000..f78280ac --- /dev/null +++ b/PROMS/VEPROMS.CSLA.Library/Session/ROWorkingDraftAsk.cs @@ -0,0 +1,18 @@ + +using System.Collections.Generic; + +namespace VEPROMS.CSLA.Library +{ + public static class ROWorkingDraftAsk + { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0044:Add readonly modifier", Justification = "Keeping Collections Not ReadOnly")] + private static List WorkingDrafts = new List(); + + public static void AddWorkingDrafts(int wd) => WorkingDrafts.Add(wd); + + public static void ClearWorkingDrafts() => WorkingDrafts.Clear(); + + public static bool ContainsWorkingDraft(int wd) => WorkingDrafts.Contains(wd); + + } +} diff --git a/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj b/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj index 1b9a09b2..db431669 100644 --- a/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj +++ b/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj @@ -396,6 +396,7 @@ + diff --git a/PROMS/Volian.Controls.Library/DisplayRO.cs b/PROMS/Volian.Controls.Library/DisplayRO.cs index 7c271a05..86ff26cb 100644 --- a/PROMS/Volian.Controls.Library/DisplayRO.cs +++ b/PROMS/Volian.Controls.Library/DisplayRO.cs @@ -652,7 +652,7 @@ namespace Volian.Controls.Library { //do nothing - is still checked out } - else if (changedDocVersion && !askedAboutchangedDocVersion) + else if (changedDocVersion && !askedAboutchangedDocVersion && !ROWorkingDraftAsk.ContainsWorkingDraft(_docVersionInfo.VersionID)) { 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) { @@ -671,10 +671,13 @@ namespace Volian.Controls.Library updatedROs = true; askedAboutchangedDocVersion = false; + ROWorkingDraftAsk.ClearWorkingDrafts(); } else { askedAboutchangedDocVersion = true; + if (!ROWorkingDraftAsk.ContainsWorkingDraft(_docVersionInfo.VersionID)) + ROWorkingDraftAsk.AddWorkingDrafts(_docVersionInfo.VersionID); } } From ba5aee664027d6bc6105d83fd2b55b77e7a5892c Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Tue, 21 Jul 2026 11:33:58 -0400 Subject: [PATCH 18/49] Development --- .../VEPROMS.CSLA.Library/Extension/ItemExt.cs | 24 ++ .../DisplaySearch.Designer.cs | 253 +++++++++--------- 2 files changed, 148 insertions(+), 129 deletions(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs index b6f02379..fa3a36c5 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs @@ -7279,9 +7279,33 @@ namespace VEPROMS.CSLA.Library _ByWordSuffix = byWordSuffix; } } + private string checkPercentChar(string SearchString) + { + string ss = ""; + string pattern = "%"; // Pattern to match the percentage sign + Match match = Regex.Match(SearchString, pattern); + if (match.Success) + { + int sl = SearchString.Length; + int precentIdx = SearchString.IndexOf('%'); + int startIndex = 0; + if (sl == precentIdx + 1) // % the last char. + { + ss = SearchString.Substring(startIndex, sl - 1); + var isNumeric = int.TryParse(ss, out int n); + if (isNumeric == true) // other that a % are the rest of the characters numbers. + { + ss = ' ' + SearchString; //add a space prefix; + } + } + } + return ss; + } + private void DataPortal_Fetch(ItemListSearchCriteria criteria) { this.RaiseListChangedEvents = false; + //criteria.SearchString = checkPercentChar(criteria.SearchString); try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.Designer.cs b/PROMS/Volian.Controls.Library/DisplaySearch.Designer.cs index 5c2552de..80bbc53a 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.Designer.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.Designer.cs @@ -94,15 +94,6 @@ namespace Volian.Controls.Library this.label2 = new System.Windows.Forms.Label(); this.cbxAnnoTypes = new DevComponents.DotNetBar.Controls.ComboBoxEx(); this.tabAnnotationSearch = new DevComponents.DotNetBar.TabItem(this.components); - this.tabControlPanel1 = new DevComponents.DotNetBar.TabControlPanel(); - this.btnTranCvtSelToTxt = new System.Windows.Forms.Button(); - this.lblIncTran = new System.Windows.Forms.Label(); - this.btnTranCvtAllToTxt = new System.Windows.Forms.Button(); - this.lblSrchIncTran = new System.Windows.Forms.Label(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.rbFromEditor = new System.Windows.Forms.RadioButton(); - this.rbFromTree = new System.Windows.Forms.RadioButton(); - this.tabIncTrans = new DevComponents.DotNetBar.TabItem(this.components); this.contextMenuBar1 = new DevComponents.DotNetBar.ContextMenuBar(); this.btnCMIFindText = new DevComponents.DotNetBar.ButtonItem(); this.btnCMEdit = new DevComponents.DotNetBar.ButtonItem(); @@ -121,6 +112,15 @@ namespace Volian.Controls.Library this.btnAND = new DevComponents.DotNetBar.ButtonItem(); this.btnOR = new DevComponents.DotNetBar.ButtonItem(); this.btnNOT = new DevComponents.DotNetBar.ButtonItem(); + this.tabIncTrans = new DevComponents.DotNetBar.TabItem(this.components); + this.tabControlPanel1 = new DevComponents.DotNetBar.TabControlPanel(); + this.btnTranCvtSelToTxt = new System.Windows.Forms.Button(); + this.lblIncTran = new System.Windows.Forms.Label(); + this.btnTranCvtAllToTxt = new System.Windows.Forms.Button(); + this.lblSrchIncTran = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.rbFromEditor = new System.Windows.Forms.RadioButton(); + this.rbFromTree = new System.Windows.Forms.RadioButton(); this.advTreeProcSets = new DevComponents.AdvTree.AdvTree(); this.elementStyle1 = new DevComponents.DotNetBar.ElementStyle(); this.node1 = new DevComponents.AdvTree.Node(); @@ -168,9 +168,9 @@ namespace Volian.Controls.Library this.tabControlPanel3.SuspendLayout(); this.gpSrchAnnoText.SuspendLayout(); this.panel4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.contextMenuBar1)).BeginInit(); this.tabControlPanel1.SuspendLayout(); this.groupBox1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.contextMenuBar1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.advTreeProcSets)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.advTreeStepTypes)).BeginInit(); this.grpPanSearchResults.SuspendLayout(); @@ -974,118 +974,6 @@ namespace Volian.Controls.Library this.tabAnnotationSearch.Text = "Annotations"; this.tabAnnotationSearch.Click += new System.EventHandler(this.tabAnnotationSearch_Click); // - // tabControlPanel1 - // - this.tabControlPanel1.Controls.Add(this.btnTranCvtSelToTxt); - this.tabControlPanel1.Controls.Add(this.lblIncTran); - this.tabControlPanel1.Controls.Add(this.btnTranCvtAllToTxt); - this.tabControlPanel1.Controls.Add(this.lblSrchIncTran); - this.tabControlPanel1.Controls.Add(this.groupBox1); - this.tabControlPanel1.DisabledBackColor = System.Drawing.Color.Empty; - this.tabControlPanel1.Location = new System.Drawing.Point(0, 34); - this.tabControlPanel1.Name = "tabControlPanel1"; - this.tabControlPanel1.Padding = new System.Windows.Forms.Padding(1); - this.tabControlPanel1.Size = new System.Drawing.Size(277, 113); - this.tabControlPanel1.Style.BackColor1.Color = System.Drawing.Color.FromArgb(((int)(((byte)(253)))), ((int)(((byte)(253)))), ((int)(((byte)(254))))); - this.tabControlPanel1.Style.BackColor2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(157)))), ((int)(((byte)(188)))), ((int)(((byte)(227))))); - this.tabControlPanel1.Style.Border = DevComponents.DotNetBar.eBorderType.SingleLine; - this.tabControlPanel1.Style.BorderColor.Color = System.Drawing.Color.FromArgb(((int)(((byte)(146)))), ((int)(((byte)(165)))), ((int)(((byte)(199))))); - this.tabControlPanel1.Style.BorderSide = ((DevComponents.DotNetBar.eBorderSide)(((DevComponents.DotNetBar.eBorderSide.Left | DevComponents.DotNetBar.eBorderSide.Right) - | DevComponents.DotNetBar.eBorderSide.Bottom))); - this.tabControlPanel1.Style.GradientAngle = 90; - this.tabControlPanel1.TabIndex = 17; - this.tabControlPanel1.TabItem = this.tabIncTrans; - this.tabControlPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(( System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tabControlPanel1.RightToLeft = System.Windows.Forms.RightToLeft.No; - // - // btnTranCvtSelToTxt - // - this.btnTranCvtSelToTxt.Enabled = false; - this.btnTranCvtSelToTxt.Location = new System.Drawing.Point(121, 63); - this.btnTranCvtSelToTxt.Name = "btnTranCvtSelToTxt"; - this.btnTranCvtSelToTxt.Size = new System.Drawing.Size(145, 22); - this.superTooltip1.SetSuperTooltip(this.btnTranCvtSelToTxt, new DevComponents.DotNetBar.SuperTooltipInfo("Convert Selected Incoming Transitions To Text", "", "Converts selected transitions in the results list to text unless the user does no" + - "t have permission to change text.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 90))); - this.btnTranCvtSelToTxt.TabIndex = 3; - this.btnTranCvtSelToTxt.Text = "Convert Selected To Text"; - this.btnTranCvtSelToTxt.UseVisualStyleBackColor = true; - this.btnTranCvtSelToTxt.Click += new System.EventHandler(this.btnTranCvtSelToTxt_Click); - // - // lblIncTran - // - this.lblIncTran.AutoSize = true; - this.lblIncTran.Location = new System.Drawing.Point(4, 9); - this.lblIncTran.Name = "lblIncTran"; - this.lblIncTran.Size = new System.Drawing.Size(23, 13); - this.lblIncTran.TabIndex = 2; - this.lblIncTran.Text = "To:"; - // - // btnTranCvtAllToTxt - // - this.btnTranCvtAllToTxt.Enabled = false; - this.btnTranCvtAllToTxt.Location = new System.Drawing.Point(6, 63); - this.btnTranCvtAllToTxt.Name = "btnTranCvtAllToTxt"; - this.btnTranCvtAllToTxt.Size = new System.Drawing.Size(109, 22); - this.superTooltip1.SetSuperTooltip(this.btnTranCvtAllToTxt, new DevComponents.DotNetBar.SuperTooltipInfo("Convert All Incoming Transitions To Text", "", "Converts all of the transitions in the results list to text unless the user does " + - "not have permission to change text.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 90))); - this.btnTranCvtAllToTxt.TabIndex = 1; - this.btnTranCvtAllToTxt.Text = "Convert All To Text"; - this.btnTranCvtAllToTxt.UseVisualStyleBackColor = true; - this.btnTranCvtAllToTxt.Click += new System.EventHandler(this.btnTranCvtAllToTxt_Click); - // - // lblSrchIncTran - // - this.lblSrchIncTran.BackColor = System.Drawing.Color.Transparent; - this.lblSrchIncTran.Location = new System.Drawing.Point(34, 9); - this.lblSrchIncTran.Name = "lblSrchIncTran"; - this.lblSrchIncTran.Size = new System.Drawing.Size(239, 40); - this.superTooltip1.SetSuperTooltip(this.lblSrchIncTran, new DevComponents.DotNetBar.SuperTooltipInfo("Incoming Transitions", "", "This is the step, section, or procedure for which incoming transitions to it are " + - "shown in the list.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 80))); - this.lblSrchIncTran.TabIndex = 1; - // - // groupBox1 - // - this.groupBox1.BackColor = System.Drawing.Color.Transparent; - this.groupBox1.Controls.Add(this.rbFromEditor); - this.groupBox1.Controls.Add(this.rbFromTree); - this.groupBox1.Location = new System.Drawing.Point(147, 4); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(130, 57); - this.groupBox1.TabIndex = 0; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Search Selection"; - this.groupBox1.Visible = false; - // - // rbFromEditor - // - this.rbFromEditor.AutoSize = true; - this.rbFromEditor.Location = new System.Drawing.Point(22, 34); - this.rbFromEditor.Name = "rbFromEditor"; - this.rbFromEditor.Size = new System.Drawing.Size(78, 17); - this.rbFromEditor.TabIndex = 1; - this.rbFromEditor.TabStop = true; - this.rbFromEditor.Text = "From Editor"; - this.rbFromEditor.UseVisualStyleBackColor = true; - // - // rbFromTree - // - this.rbFromTree.AutoSize = true; - this.rbFromTree.Location = new System.Drawing.Point(22, 16); - this.rbFromTree.Name = "rbFromTree"; - this.rbFromTree.Size = new System.Drawing.Size(73, 17); - this.rbFromTree.TabIndex = 0; - this.rbFromTree.TabStop = true; - this.rbFromTree.Text = "From Tree"; - this.rbFromTree.UseVisualStyleBackColor = true; - // - // tabIncTrans - // - this.tabIncTrans.AttachedControl = this.tabControlPanel1; - this.tabIncTrans.Name = "tabIncTrans"; - this.superTooltip1.SetSuperTooltip(this.tabIncTrans, new DevComponents.DotNetBar.SuperTooltipInfo("Search for Incoming Transitions", "", "Finds the Incoming Transitions that point to the current item and convert the tra" + - "nsition(s) to text if desired and if have permissions.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 120))); - this.tabIncTrans.Text = "Incoming\nTransitions"; - // // contextMenuBar1 // this.contextMenuBar1.DockSide = DevComponents.DotNetBar.eDockSide.Top; @@ -1248,6 +1136,119 @@ namespace Volian.Controls.Library this.btnNOT.Text = "NOT"; this.btnNOT.Click += new System.EventHandler(this.btnNOT_Click); // + // tabIncTrans + // + this.tabIncTrans.AttachedControl = this.tabControlPanel1; + this.tabIncTrans.Name = "tabIncTrans"; + this.superTooltip1.SetSuperTooltip(this.tabIncTrans, new DevComponents.DotNetBar.SuperTooltipInfo("Search for Incoming Transitions", "", "Finds the Incoming Transitions that point to the current item and convert the tra" + + "nsition(s) to text if desired and if have permissions.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 120))); + this.tabIncTrans.Text = "Incoming\nTransitions"; + // + // tabControlPanel1 + // + this.tabControlPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabControlPanel1.Controls.Add(this.btnTranCvtSelToTxt); + this.tabControlPanel1.Controls.Add(this.lblIncTran); + this.tabControlPanel1.Controls.Add(this.btnTranCvtAllToTxt); + this.tabControlPanel1.Controls.Add(this.lblSrchIncTran); + this.tabControlPanel1.Controls.Add(this.groupBox1); + this.tabControlPanel1.DisabledBackColor = System.Drawing.Color.Empty; + this.tabControlPanel1.Location = new System.Drawing.Point(0, 34); + this.tabControlPanel1.Name = "tabControlPanel1"; + this.tabControlPanel1.Padding = new System.Windows.Forms.Padding(1); + this.tabControlPanel1.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.tabControlPanel1.Size = new System.Drawing.Size(277, 113); + this.tabControlPanel1.Style.BackColor1.Color = System.Drawing.Color.FromArgb(((int)(((byte)(253)))), ((int)(((byte)(253)))), ((int)(((byte)(254))))); + this.tabControlPanel1.Style.BackColor2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(157)))), ((int)(((byte)(188)))), ((int)(((byte)(227))))); + this.tabControlPanel1.Style.Border = DevComponents.DotNetBar.eBorderType.SingleLine; + this.tabControlPanel1.Style.BorderColor.Color = System.Drawing.Color.FromArgb(((int)(((byte)(146)))), ((int)(((byte)(165)))), ((int)(((byte)(199))))); + this.tabControlPanel1.Style.BorderSide = ((DevComponents.DotNetBar.eBorderSide)(((DevComponents.DotNetBar.eBorderSide.Left | DevComponents.DotNetBar.eBorderSide.Right) + | DevComponents.DotNetBar.eBorderSide.Bottom))); + this.tabControlPanel1.Style.GradientAngle = 90; + this.tabControlPanel1.TabIndex = 17; + this.tabControlPanel1.TabItem = this.tabIncTrans; + // + // btnTranCvtSelToTxt + // + this.btnTranCvtSelToTxt.Enabled = false; + this.btnTranCvtSelToTxt.Location = new System.Drawing.Point(121, 63); + this.btnTranCvtSelToTxt.Name = "btnTranCvtSelToTxt"; + this.btnTranCvtSelToTxt.Size = new System.Drawing.Size(145, 22); + this.superTooltip1.SetSuperTooltip(this.btnTranCvtSelToTxt, new DevComponents.DotNetBar.SuperTooltipInfo("Convert Selected Incoming Transitions To Text", "", "Converts selected transitions in the results list to text unless the user does no" + + "t have permission to change text.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 90))); + this.btnTranCvtSelToTxt.TabIndex = 3; + this.btnTranCvtSelToTxt.Text = "Convert Selected To Text"; + this.btnTranCvtSelToTxt.UseVisualStyleBackColor = true; + this.btnTranCvtSelToTxt.Click += new System.EventHandler(this.btnTranCvtSelToTxt_Click); + // + // lblIncTran + // + this.lblIncTran.AutoSize = true; + this.lblIncTran.Location = new System.Drawing.Point(4, 9); + this.lblIncTran.Name = "lblIncTran"; + this.lblIncTran.Size = new System.Drawing.Size(23, 13); + this.lblIncTran.TabIndex = 2; + this.lblIncTran.Text = "To:"; + // + // btnTranCvtAllToTxt + // + this.btnTranCvtAllToTxt.Enabled = false; + this.btnTranCvtAllToTxt.Location = new System.Drawing.Point(6, 63); + this.btnTranCvtAllToTxt.Name = "btnTranCvtAllToTxt"; + this.btnTranCvtAllToTxt.Size = new System.Drawing.Size(109, 22); + this.superTooltip1.SetSuperTooltip(this.btnTranCvtAllToTxt, new DevComponents.DotNetBar.SuperTooltipInfo("Convert All Incoming Transitions To Text", "", "Converts all of the transitions in the results list to text unless the user does " + + "not have permission to change text.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 90))); + this.btnTranCvtAllToTxt.TabIndex = 1; + this.btnTranCvtAllToTxt.Text = "Convert All To Text"; + this.btnTranCvtAllToTxt.UseVisualStyleBackColor = true; + this.btnTranCvtAllToTxt.Click += new System.EventHandler(this.btnTranCvtAllToTxt_Click); + // + // lblSrchIncTran + // + this.lblSrchIncTran.BackColor = System.Drawing.Color.Transparent; + this.lblSrchIncTran.Location = new System.Drawing.Point(34, 9); + this.lblSrchIncTran.Name = "lblSrchIncTran"; + this.lblSrchIncTran.Size = new System.Drawing.Size(239, 40); + this.superTooltip1.SetSuperTooltip(this.lblSrchIncTran, new DevComponents.DotNetBar.SuperTooltipInfo("Incoming Transitions", "", "This is the step, section, or procedure for which incoming transitions to it are " + + "shown in the list.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 80))); + this.lblSrchIncTran.TabIndex = 1; + // + // groupBox1 + // + this.groupBox1.BackColor = System.Drawing.Color.Transparent; + this.groupBox1.Controls.Add(this.rbFromEditor); + this.groupBox1.Controls.Add(this.rbFromTree); + this.groupBox1.Location = new System.Drawing.Point(147, 4); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(130, 57); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Search Selection"; + this.groupBox1.Visible = false; + // + // rbFromEditor + // + this.rbFromEditor.AutoSize = true; + this.rbFromEditor.Location = new System.Drawing.Point(22, 34); + this.rbFromEditor.Name = "rbFromEditor"; + this.rbFromEditor.Size = new System.Drawing.Size(78, 17); + this.rbFromEditor.TabIndex = 1; + this.rbFromEditor.TabStop = true; + this.rbFromEditor.Text = "From Editor"; + this.rbFromEditor.UseVisualStyleBackColor = true; + // + // rbFromTree + // + this.rbFromTree.AutoSize = true; + this.rbFromTree.Location = new System.Drawing.Point(22, 16); + this.rbFromTree.Name = "rbFromTree"; + this.rbFromTree.Size = new System.Drawing.Size(73, 17); + this.rbFromTree.TabIndex = 0; + this.rbFromTree.TabStop = true; + this.rbFromTree.Text = "From Tree"; + this.rbFromTree.UseVisualStyleBackColor = true; + // // advTreeProcSets // this.advTreeProcSets.AccessibleRole = System.Windows.Forms.AccessibleRole.Outline; @@ -1406,7 +1407,6 @@ namespace Volian.Controls.Library // this.lbSrchResultsIncTrans.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square; this.lbSrchResultsIncTrans.CheckBoxesVisible = true; - this.lbSrchResultsIncTrans.CheckStateMember = null; this.lbSrchResultsIncTrans.ContainerControlProcessDialogKey = true; this.lbSrchResultsIncTrans.Dock = System.Windows.Forms.DockStyle.Fill; this.lbSrchResultsIncTrans.DragDropSupport = true; @@ -1733,11 +1733,6 @@ namespace Volian.Controls.Library this.Controls.Add(this.xpSetToSearch); this.Controls.Add(this.tabSearchTypes); this.Controls.Add(this.tabControlPanel1); - //B2025-056 Click on Incoming Transitions - // This needs to be part of overall control - // since if it is part of tabSearchTypes, - // then when that is disabled, buttons on - // this will be also this.Margin = new System.Windows.Forms.Padding(2); this.Name = "DisplaySearch"; this.RightToLeft = System.Windows.Forms.RightToLeft.Yes; @@ -1760,11 +1755,11 @@ namespace Volian.Controls.Library this.gpSrchAnnoText.ResumeLayout(false); this.panel4.ResumeLayout(false); this.panel4.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.contextMenuBar1)).EndInit(); this.tabControlPanel1.ResumeLayout(false); this.tabControlPanel1.PerformLayout(); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.contextMenuBar1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.advTreeProcSets)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.advTreeStepTypes)).EndInit(); this.grpPanSearchResults.ResumeLayout(false); From 1aca7335f7683a335231384375cc8de09401f8c3 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Thu, 23 Jul 2026 08:15:18 -0400 Subject: [PATCH 19/49] Development --- .../VEPROMS.CSLA.Library/Extension/ItemExt.cs | 23 -------------- .../Volian.Controls.Library/DisplaySearch.cs | 31 ++++++++++++++++++- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs index fa3a36c5..0ca5cbfe 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs @@ -7279,33 +7279,10 @@ namespace VEPROMS.CSLA.Library _ByWordSuffix = byWordSuffix; } } - private string checkPercentChar(string SearchString) - { - string ss = ""; - string pattern = "%"; // Pattern to match the percentage sign - Match match = Regex.Match(SearchString, pattern); - if (match.Success) - { - int sl = SearchString.Length; - int precentIdx = SearchString.IndexOf('%'); - int startIndex = 0; - if (sl == precentIdx + 1) // % the last char. - { - ss = SearchString.Substring(startIndex, sl - 1); - var isNumeric = int.TryParse(ss, out int n); - if (isNumeric == true) // other that a % are the rest of the characters numbers. - { - ss = ' ' + SearchString; //add a space prefix; - } - } - } - return ss; - } private void DataPortal_Fetch(ItemListSearchCriteria criteria) { this.RaiseListChangedEvents = false; - //criteria.SearchString = checkPercentChar(criteria.SearchString); try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index f30c8bb2..6f569b4e 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2078,8 +2078,9 @@ namespace Volian.Controls.Library if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { + string ROSearchList2 = checkPercentChar(ROSearchList); // match exact string // B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. - SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); + SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); cmbResultsStyleIndex = 3; // display step text in results } else @@ -2190,6 +2191,34 @@ namespace Volian.Controls.Library OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); } + private string checkPercentChar(string SearchString) + { + string ss = ""; + string pattern = "%"; // Pattern to match the percentage sign + Match match = Regex.Match(SearchString, pattern); + if (match.Success) // Special case for percents. + { + int sl = SearchString.Length; + int precentIdx = SearchString.IndexOf('%'); + int startIndex = 0; + if (sl == precentIdx + 1) // % the last char. + { + ss = SearchString.Substring(startIndex, sl - 1); + var isNumeric = int.TryParse(ss, out int n); + if (isNumeric == true) // other that a % are the rest of the characters numbers. + { + ss = ' ' + SearchString; //add a space prefix to make the search exact. If search is 5% this makes it excult 25% 55% etc.; + } + } + } + else + { + ss = ' ' + SearchString + ' '; // Exact match add spaces before and after search string. + + } + return ss; + } + private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) { if (tabSearchTypes.SelectedTab != tabSearchTypes.Tabs[4]) From 7c3a43749c2a820783e6c1d75e59aa99279ed509 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Thu, 23 Jul 2026 09:09:22 -0400 Subject: [PATCH 20/49] B2026-053-Find-Unlinked-Values-of-Selected --- PROMS/Volian.Controls.Library/DisplaySearch.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index 6f569b4e..0038c518 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2078,7 +2078,7 @@ namespace Volian.Controls.Library if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { - string ROSearchList2 = checkPercentChar(ROSearchList); // match exact string + string ROSearchList2 = checkPercentChar(ROSearchList); // B2026-053 match exact string // B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); cmbResultsStyleIndex = 3; // display step text in results @@ -2191,10 +2191,10 @@ namespace Volian.Controls.Library OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); } - private string checkPercentChar(string SearchString) + private string checkPercentChar(string SearchString) // B2026-053 { string ss = ""; - string pattern = "%"; // Pattern to match the percentage sign + string pattern = "%"; // B2026-053 Pattern to match the percentage sign Match match = Regex.Match(SearchString, pattern); if (match.Success) // Special case for percents. { @@ -2205,9 +2205,9 @@ namespace Volian.Controls.Library { ss = SearchString.Substring(startIndex, sl - 1); var isNumeric = int.TryParse(ss, out int n); - if (isNumeric == true) // other that a % are the rest of the characters numbers. + if (isNumeric == true) // B2026-053 other that a % are the rest of the characters numbers. { - ss = ' ' + SearchString; //add a space prefix to make the search exact. If search is 5% this makes it excult 25% 55% etc.; + ss = ' ' + SearchString; //B2026-053 add a space prefix to make the search exact. If search is 5% this makes it excult 25% 55% etc.; } } } From f93b16fc52a7efc07793bf4ff6dc63e45bd99a7a Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Thu, 23 Jul 2026 09:21:09 -0400 Subject: [PATCH 21/49] B2026-053-Find-Unlinked-Values-of-Selected --- PROMS/Volian.Controls.Library/DisplaySearch.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index 0038c518..d0361ac5 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2210,6 +2210,10 @@ namespace Volian.Controls.Library ss = ' ' + SearchString; //B2026-053 add a space prefix to make the search exact. If search is 5% this makes it excult 25% 55% etc.; } } + else + { + ss = ' ' + SearchString + ' '; // Exact match add spaces before and after search string. + } } else { From 2261c8f0f5522a48c8f091414e85b510deb7d17e Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Fri, 24 Jul 2026 10:47:25 -0400 Subject: [PATCH 22/49] B2026-053-Find-Unlinked-Values-of-Selected --- .../Volian.Controls.Library/DisplaySearch.cs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index d0361ac5..c981bfb9 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2199,7 +2199,7 @@ namespace Volian.Controls.Library if (match.Success) // Special case for percents. { int sl = SearchString.Length; - int precentIdx = SearchString.IndexOf('%'); + int precentIdx = SearchString.LastIndexOf('%'); int startIndex = 0; if (sl == precentIdx + 1) // % the last char. { @@ -2207,12 +2207,26 @@ namespace Volian.Controls.Library var isNumeric = int.TryParse(ss, out int n); if (isNumeric == true) // B2026-053 other that a % are the rest of the characters numbers. { - ss = ' ' + SearchString; //B2026-053 add a space prefix to make the search exact. If search is 5% this makes it excult 25% 55% etc.; + ss = ' ' + SearchString + ' '; // to get exact match add spaces before and after search string. + } + else + { + ss = ' ' + SearchString + ' '; // string it not a percent. } } else { - ss = ' ' + SearchString + ' '; // Exact match add spaces before and after search string. + int strl2 = SearchString.Length; + int prcIdx2 = SearchString.LastIndexOf(' '); + int strIdx2 = 0; + if (strl2 == prcIdx2 + 1) // if the last char is ' ' the last char. + { + ss = ' ' + SearchString; //B2026-053 add a space prefix to make the search exact. If search is 5% this makes it excult 25% 55% etc.; + } + else + { + ss = ' ' + SearchString + ' '; // Exact match add spaces before and after search string. + } } } else From 99fe567e78f5b5ddc1afa862d15dce6fd49c6977 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 27 Jul 2026 09:13:34 -0400 Subject: [PATCH 23/49] Development --- .../Volian.Controls.Library/DisplaySearch.cs | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index 6f569b4e..ef100b56 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2078,7 +2078,7 @@ namespace Volian.Controls.Library if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { - string ROSearchList2 = checkPercentChar(ROSearchList); // match exact string + string ROSearchList2 = exactsearch(ROSearchList); // match exact string // B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); cmbResultsStyleIndex = 3; // display step text in results @@ -2191,32 +2191,20 @@ namespace Volian.Controls.Library OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); } - private string checkPercentChar(string SearchString) + private string exactsearch(string SearchString) // B2026-053 { string ss = ""; - string pattern = "%"; // Pattern to match the percentage sign - Match match = Regex.Match(SearchString, pattern); - if (match.Success) // Special case for percents. + int sl = SearchString.Length; + int LstIdxSp = SearchString.LastIndexOf(' '); + if (sl == LstIdxSp + 1) // B2026-053 if ' ' the last char. { - int sl = SearchString.Length; - int precentIdx = SearchString.IndexOf('%'); - int startIndex = 0; - if (sl == precentIdx + 1) // % the last char. - { - ss = SearchString.Substring(startIndex, sl - 1); - var isNumeric = int.TryParse(ss, out int n); - if (isNumeric == true) // other that a % are the rest of the characters numbers. - { - ss = ' ' + SearchString; //add a space prefix to make the search exact. If search is 5% this makes it excult 25% 55% etc.; - } - } + ss = ' ' + SearchString; //add a space prefix to make the search exact if the end of the search string is a space. } else { - ss = ' ' + SearchString + ' '; // Exact match add spaces before and after search string. - + ss = ' ' + SearchString + ' '; // Exact match add spaces before and after search string. } - return ss; + return ss; } private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) From db198cb7d019316704ff2525460c7252f8127502 Mon Sep 17 00:00:00 2001 From: John Jenko Date: Mon, 27 Jul 2026 11:08:35 -0400 Subject: [PATCH 24/49] B2026-066 Fixed issue of the Update RO Values button and Working Draft context menu item, not being disabled after Updating RO Values. --- PROMS/VEPROMS.CSLA.Library/Extension/ROFSTExt.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTExt.cs index f2e4ffc2..50ff8877 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTExt.cs @@ -262,8 +262,10 @@ namespace VEPROMS.CSLA.Library if (dvi.DocVersionAssociations[0].MyROFst.ROFstID != newfstid) { dv.DocVersionAssociations[0].MyROFst = localROFst.GetJustROFst(); - SetAssociationLastCompleted(dv, DateTime.Now.ToString()); } + // B2026-066 moved this out of if statement above + // - was not resetting the datetime and thus not disabling the Update RO Values button and menu item + SetAssociationLastCompleted(dv, DateTime.Now.ToString()); } } From 9bf7b2ffde84a8d6998e2e8dd61baf467d1a05b4 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 27 Jul 2026 11:14:19 -0400 Subject: [PATCH 25/49] B2026-053-Find-Unlinked-Values-of-Selected --- .../Volian.Controls.Library/DisplaySearch.cs | 51 +++++-------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index c981bfb9..0e79af26 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2078,7 +2078,7 @@ namespace Volian.Controls.Library if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { - string ROSearchList2 = checkPercentChar(ROSearchList); // B2026-053 match exact string + string ROSearchList2 = exactsearch(ROSearchList); // B2026-053 match exact string // B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); cmbResultsStyleIndex = 3; // display step text in results @@ -2191,50 +2191,23 @@ namespace Volian.Controls.Library OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); } - private string checkPercentChar(string SearchString) // B2026-053 + private string exactsearch(string SearchString) // B2026-053 { - string ss = ""; - string pattern = "%"; // B2026-053 Pattern to match the percentage sign - Match match = Regex.Match(SearchString, pattern); - if (match.Success) // Special case for percents. + StringBuilder ss = new StringBuilder(); + int sl = SearchString.Length; + int LstIdxSp = SearchString.LastIndexOf(' '); + if (sl == LstIdxSp + 1) // B2026-053 if ' ' the last char. { - int sl = SearchString.Length; - int precentIdx = SearchString.LastIndexOf('%'); - int startIndex = 0; - if (sl == precentIdx + 1) // % the last char. - { - ss = SearchString.Substring(startIndex, sl - 1); - var isNumeric = int.TryParse(ss, out int n); - if (isNumeric == true) // B2026-053 other that a % are the rest of the characters numbers. - { - ss = ' ' + SearchString + ' '; // to get exact match add spaces before and after search string. - } - else - { - ss = ' ' + SearchString + ' '; // string it not a percent. - } - } - else - { - int strl2 = SearchString.Length; - int prcIdx2 = SearchString.LastIndexOf(' '); - int strIdx2 = 0; - if (strl2 == prcIdx2 + 1) // if the last char is ' ' the last char. - { - ss = ' ' + SearchString; //B2026-053 add a space prefix to make the search exact. If search is 5% this makes it excult 25% 55% etc.; - } - else - { - ss = ' ' + SearchString + ' '; // Exact match add spaces before and after search string. - } - } + ss.Append(' '); + ss.Append(SearchString); // B2026-053 add a space prefix to make the search exact if the end of the searchString is a space. } else { - ss = ' ' + SearchString + ' '; // Exact match add spaces before and after search string. - + ss.Append(' '); + ss.Append(SearchString); // B2026-053 Exact match add spaces before and after searchString. + ss.Append(' '); } - return ss; + return ss.ToString(); } private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) From 58a6cb9a246f0e91fb30ef6dcec91ed7fbf9a5f6 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 27 Jul 2026 11:19:47 -0400 Subject: [PATCH 26/49] Development --- PROMS/Volian.Controls.Library/DisplaySearch.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index ef100b56..b22a7cb5 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2079,7 +2079,7 @@ namespace Volian.Controls.Library if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { string ROSearchList2 = exactsearch(ROSearchList); // match exact string - // B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. + // B2022-031 - added a exactsearch to filter out procedure and section titles from global search results. SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); cmbResultsStyleIndex = 3; // display step text in results } @@ -2193,18 +2193,22 @@ namespace Volian.Controls.Library private string exactsearch(string SearchString) // B2026-053 { - string ss = ""; + //string ss = ""; + StringBuilder ss = new StringBuilder(); int sl = SearchString.Length; int LstIdxSp = SearchString.LastIndexOf(' '); if (sl == LstIdxSp + 1) // B2026-053 if ' ' the last char. { - ss = ' ' + SearchString; //add a space prefix to make the search exact if the end of the search string is a space. + ss.Append(' '); + ss.Append(SearchString); // B2026-053 add a space prefix to make the search exact if the end of the searchString is a space. } else { - ss = ' ' + SearchString + ' '; // Exact match add spaces before and after search string. + ss.Append(' '); + ss.Append(SearchString); // B2026-053 Exact match add spaces before and after searchString. + ss.Append(' '); } - return ss; + return ss.ToString(); } private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) From 780ce657ca4b14e184c31b99fa9d15dd1108a800 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 27 Jul 2026 11:28:40 -0400 Subject: [PATCH 27/49] B2026-053-Find-Unlinked-Values-of-Selected --- .../Volian.Controls.Library/DisplaySearch.cs | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index e115fa9e..9aec6451 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2078,7 +2078,7 @@ namespace Volian.Controls.Library if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { - string ROSearchList2 = exactsearch(ROSearchList); // match exact string + string ROSearchList2 = exactsearch(ROSearchList); // B2026-053 match exact string // B2022-031 - added a exactsearch to filter out procedure and section titles from global search results. SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); cmbResultsStyleIndex = 3; // display step text in results @@ -2193,23 +2193,14 @@ namespace Volian.Controls.Library private string exactsearch(string SearchString) // B2026-053 { - string ss = ""; - string pattern = "%"; // Pattern to match the percentage sign - Match match = Regex.Match(SearchString, pattern); - if (match.Success) // Special case for percents. + //string ss = ""; + StringBuilder ss = new StringBuilder(); + int sl = SearchString.Length; + int LstIdxSp = SearchString.LastIndexOf(' '); + if (sl == LstIdxSp + 1) // B2026-053 if ' ' the last char. { - int sl = SearchString.Length; - int precentIdx = SearchString.IndexOf('%'); - int startIndex = 0; - if (sl == precentIdx + 1) // % the last char. - { - ss = SearchString.Substring(startIndex, sl - 1); - var isNumeric = int.TryParse(ss, out int n); - if (isNumeric == true) // other that a % are the rest of the characters numbers. - { - ss = ' ' + SearchString; //add a space prefix to make the search exact. If search is 5% this makes it excult 25% 55% etc.; - } - } + ss.Append(' '); + ss.Append(SearchString); // B2026-053 add a space prefix to make the search exact if the end of the searchString is a space. } else { From be744b40a3ea309cd533dfb8f15c9cf5a360b50b Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 27 Jul 2026 11:35:42 -0400 Subject: [PATCH 28/49] B2026-053-Find-Unlinked-Values-of-Selected --- PROMS/Volian.Controls.Library/DisplaySearch.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index 9aec6451..e821f5a1 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2193,7 +2193,6 @@ namespace Volian.Controls.Library private string exactsearch(string SearchString) // B2026-053 { - //string ss = ""; StringBuilder ss = new StringBuilder(); int sl = SearchString.Length; int LstIdxSp = SearchString.LastIndexOf(' '); From da6139c93285c74c60c247f82d493b03da5468ce Mon Sep 17 00:00:00 2001 From: mschill Date: Mon, 27 Jul 2026 11:47:36 -0400 Subject: [PATCH 29/49] =?UTF-8?q?B2026-067=20=E2=80=93=20Corrected=20speci?= =?UTF-8?q?fic=20instance=20where=20a=20crash=20would=20occur=20when=20mul?= =?UTF-8?q?tiple=20Word=20Sections=20open=20and=20were=20closed=20in=20a?= =?UTF-8?q?=20specific=20order.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROMS/VEPROMS User Interface/frmVEPROMS.cs | 2 +- PROMS/Volian.Controls.Library/DSOTabPanel.cs | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/PROMS/VEPROMS User Interface/frmVEPROMS.cs b/PROMS/VEPROMS User Interface/frmVEPROMS.cs index 07f0ab5a..c5a6f11d 100644 --- a/PROMS/VEPROMS User Interface/frmVEPROMS.cs +++ b/PROMS/VEPROMS User Interface/frmVEPROMS.cs @@ -2148,7 +2148,7 @@ namespace VEPROMS //C2019-036 View Only mode work with Checked Out Procedures // View Only Mode is no longer checked out, so no longer has an OwnerID // This will keep those tabs from auto-closing based on the timer - if (!myList.Contains(dti.OwnerID) && dti.MyStepTabPanel.MyStepPanel.VwMode != E_ViewMode.View) + if (!myList.Contains(dti.OwnerID) && dti?.MyStepTabPanel?.MyStepPanel?.VwMode != E_ViewMode.View) { MyCloseTabList.PushDTI(dti); } diff --git a/PROMS/Volian.Controls.Library/DSOTabPanel.cs b/PROMS/Volian.Controls.Library/DSOTabPanel.cs index a97e038a..f428da3e 100644 --- a/PROMS/Volian.Controls.Library/DSOTabPanel.cs +++ b/PROMS/Volian.Controls.Library/DSOTabPanel.cs @@ -613,7 +613,15 @@ namespace Volian.Controls.Library _In_DSOTabPanel_Enter = false; _MyDisplayTabControl.SelectedDisplayTabItem = MyDisplayTabItem; // B2018-070 Position the text cursor - Activate MS Word Panel - _MyEdWord.GotoItem(EDWordLib.WdGoToItem.wdGoToObject, EDWordLib.WdGoToDirection.wdGoToNext, 0, null); + try + { + _MyEdWord.GotoItem(EDWordLib.WdGoToItem.wdGoToObject, EDWordLib.WdGoToDirection.wdGoToNext, 0, null); + } + catch + { + //B2026-067 - Do nothing if cannot Position cursor + } + } #endregion #region Public Methods From b90d419bc5e95af1681725ecfe75bcd81a4ca9ea Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 27 Jul 2026 12:14:55 -0400 Subject: [PATCH 30/49] B2026-053-Find-Unlinked-Values-of-Selected --- .../VlnFlexGrid.Designer.cs | 6 +-- PROMS/Volian.Controls.Library/VlnFlexGrid.cs | 48 ++++++------------- 2 files changed, 16 insertions(+), 38 deletions(-) diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs index d6e48711..95fa1523 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs @@ -1,5 +1,4 @@ using System; -using System.Windows.Forms; namespace Volian.Controls.Library { @@ -79,10 +78,7 @@ namespace Volian.Controls.Library // VlnFlexGrid // this.Rows.DefaultSize = 19; - this.AllowDrop = true; - this.DragEnter += new DragEventHandler(Control_DragEnter); - this.DragDrop += new DragEventHandler(Control_DragDrop); - + ((System.ComponentModel.ISupportInitialize)(this)).EndInit(); this.ResumeLayout(false); diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs index 6f85943f..f7f2310f 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs @@ -1,23 +1,22 @@ -using C1.Win.C1FlexGrid; -using C1.Win.C1SpellChecker; -using DevComponents.DotNetBar.Controls; -using JR.Utils.GUI.Forms; using System; +using System.ComponentModel; using System.Collections; using System.Collections.Generic; -using System.ComponentModel; using System.Diagnostics; -using System.Drawing; -using System.IO; -using System.Runtime.InteropServices; using System.Text; -using System.Text.RegularExpressions; using System.Windows.Forms; +using System.Drawing; +using System.Runtime.InteropServices; using System.Xml; -using System.Xml.Serialization; -using VEPROMS.CSLA.Library; -using Volian.Base.Library; +using System.IO; using Volian.Controls.Library; +using VEPROMS.CSLA.Library; +using C1.Win.C1FlexGrid; +using C1.Win.C1SpellChecker; +using System.Text.RegularExpressions; +using System.Xml.Serialization; +using Volian.Base.Library; +using JR.Utils.GUI.Forms; namespace Volian.Controls.Library { @@ -4439,28 +4438,11 @@ namespace Volian.Controls.Library // } //} - private void Control_DragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.Text)) - { - e.Effect = DragDropEffects.Copy; // Allow copy - } - else - { - e.Effect = DragDropEffects.None; // Disallow - } - } - private void Control_DragDrop(object sender, DragEventArgs e) - { - string data = (string)e.Data.GetData(DataFormats.Text); - // Process the data (e.g., display it in a TextBox) - this.Text = data; - } #region Uneven Selections - /// - /// True if the top and bottom row of the selection is the same for every column - /// - public bool EvenSelection + /// + /// True if the top and bottom row of the selection is the same for every column + /// + public bool EvenSelection { get { From b49d8871a28a9326aed426f2a0c48eb6864a7dfd Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 27 Jul 2026 12:25:46 -0400 Subject: [PATCH 31/49] B2026-053-Find-Unlinked-Values-of-Selected --- PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs index 0ca5cbfe..b6f02379 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs @@ -7279,7 +7279,6 @@ namespace VEPROMS.CSLA.Library _ByWordSuffix = byWordSuffix; } } - private void DataPortal_Fetch(ItemListSearchCriteria criteria) { this.RaiseListChangedEvents = false; From 57bd8d569e7335199ff9266d071a214177e4a3af Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 27 Jul 2026 13:45:20 -0400 Subject: [PATCH 32/49] B2026-053-Find-Unlinked-Values-of-Selected --- PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs index 95fa1523..dc4245ea 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs @@ -83,7 +83,6 @@ namespace Volian.Controls.Library this.ResumeLayout(false); } - #endregion } } From 914837a5a2bf0eeede719ea0aa9f66fbd07a9d79 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Tue, 28 Jul 2026 10:57:55 -0400 Subject: [PATCH 33/49] B2026-053-Find-Unlinked-Values-of-Selected --- .../DisplaySearch.Designer.cs | 253 +++++++++--------- .../VlnFlexGrid.Designer.cs | 1 + 2 files changed, 130 insertions(+), 124 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.Designer.cs b/PROMS/Volian.Controls.Library/DisplaySearch.Designer.cs index 80bbc53a..5c2552de 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.Designer.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.Designer.cs @@ -94,6 +94,15 @@ namespace Volian.Controls.Library this.label2 = new System.Windows.Forms.Label(); this.cbxAnnoTypes = new DevComponents.DotNetBar.Controls.ComboBoxEx(); this.tabAnnotationSearch = new DevComponents.DotNetBar.TabItem(this.components); + this.tabControlPanel1 = new DevComponents.DotNetBar.TabControlPanel(); + this.btnTranCvtSelToTxt = new System.Windows.Forms.Button(); + this.lblIncTran = new System.Windows.Forms.Label(); + this.btnTranCvtAllToTxt = new System.Windows.Forms.Button(); + this.lblSrchIncTran = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.rbFromEditor = new System.Windows.Forms.RadioButton(); + this.rbFromTree = new System.Windows.Forms.RadioButton(); + this.tabIncTrans = new DevComponents.DotNetBar.TabItem(this.components); this.contextMenuBar1 = new DevComponents.DotNetBar.ContextMenuBar(); this.btnCMIFindText = new DevComponents.DotNetBar.ButtonItem(); this.btnCMEdit = new DevComponents.DotNetBar.ButtonItem(); @@ -112,15 +121,6 @@ namespace Volian.Controls.Library this.btnAND = new DevComponents.DotNetBar.ButtonItem(); this.btnOR = new DevComponents.DotNetBar.ButtonItem(); this.btnNOT = new DevComponents.DotNetBar.ButtonItem(); - this.tabIncTrans = new DevComponents.DotNetBar.TabItem(this.components); - this.tabControlPanel1 = new DevComponents.DotNetBar.TabControlPanel(); - this.btnTranCvtSelToTxt = new System.Windows.Forms.Button(); - this.lblIncTran = new System.Windows.Forms.Label(); - this.btnTranCvtAllToTxt = new System.Windows.Forms.Button(); - this.lblSrchIncTran = new System.Windows.Forms.Label(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.rbFromEditor = new System.Windows.Forms.RadioButton(); - this.rbFromTree = new System.Windows.Forms.RadioButton(); this.advTreeProcSets = new DevComponents.AdvTree.AdvTree(); this.elementStyle1 = new DevComponents.DotNetBar.ElementStyle(); this.node1 = new DevComponents.AdvTree.Node(); @@ -168,9 +168,9 @@ namespace Volian.Controls.Library this.tabControlPanel3.SuspendLayout(); this.gpSrchAnnoText.SuspendLayout(); this.panel4.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.contextMenuBar1)).BeginInit(); this.tabControlPanel1.SuspendLayout(); this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.contextMenuBar1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.advTreeProcSets)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.advTreeStepTypes)).BeginInit(); this.grpPanSearchResults.SuspendLayout(); @@ -974,6 +974,118 @@ namespace Volian.Controls.Library this.tabAnnotationSearch.Text = "Annotations"; this.tabAnnotationSearch.Click += new System.EventHandler(this.tabAnnotationSearch_Click); // + // tabControlPanel1 + // + this.tabControlPanel1.Controls.Add(this.btnTranCvtSelToTxt); + this.tabControlPanel1.Controls.Add(this.lblIncTran); + this.tabControlPanel1.Controls.Add(this.btnTranCvtAllToTxt); + this.tabControlPanel1.Controls.Add(this.lblSrchIncTran); + this.tabControlPanel1.Controls.Add(this.groupBox1); + this.tabControlPanel1.DisabledBackColor = System.Drawing.Color.Empty; + this.tabControlPanel1.Location = new System.Drawing.Point(0, 34); + this.tabControlPanel1.Name = "tabControlPanel1"; + this.tabControlPanel1.Padding = new System.Windows.Forms.Padding(1); + this.tabControlPanel1.Size = new System.Drawing.Size(277, 113); + this.tabControlPanel1.Style.BackColor1.Color = System.Drawing.Color.FromArgb(((int)(((byte)(253)))), ((int)(((byte)(253)))), ((int)(((byte)(254))))); + this.tabControlPanel1.Style.BackColor2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(157)))), ((int)(((byte)(188)))), ((int)(((byte)(227))))); + this.tabControlPanel1.Style.Border = DevComponents.DotNetBar.eBorderType.SingleLine; + this.tabControlPanel1.Style.BorderColor.Color = System.Drawing.Color.FromArgb(((int)(((byte)(146)))), ((int)(((byte)(165)))), ((int)(((byte)(199))))); + this.tabControlPanel1.Style.BorderSide = ((DevComponents.DotNetBar.eBorderSide)(((DevComponents.DotNetBar.eBorderSide.Left | DevComponents.DotNetBar.eBorderSide.Right) + | DevComponents.DotNetBar.eBorderSide.Bottom))); + this.tabControlPanel1.Style.GradientAngle = 90; + this.tabControlPanel1.TabIndex = 17; + this.tabControlPanel1.TabItem = this.tabIncTrans; + this.tabControlPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(( System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.tabControlPanel1.RightToLeft = System.Windows.Forms.RightToLeft.No; + // + // btnTranCvtSelToTxt + // + this.btnTranCvtSelToTxt.Enabled = false; + this.btnTranCvtSelToTxt.Location = new System.Drawing.Point(121, 63); + this.btnTranCvtSelToTxt.Name = "btnTranCvtSelToTxt"; + this.btnTranCvtSelToTxt.Size = new System.Drawing.Size(145, 22); + this.superTooltip1.SetSuperTooltip(this.btnTranCvtSelToTxt, new DevComponents.DotNetBar.SuperTooltipInfo("Convert Selected Incoming Transitions To Text", "", "Converts selected transitions in the results list to text unless the user does no" + + "t have permission to change text.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 90))); + this.btnTranCvtSelToTxt.TabIndex = 3; + this.btnTranCvtSelToTxt.Text = "Convert Selected To Text"; + this.btnTranCvtSelToTxt.UseVisualStyleBackColor = true; + this.btnTranCvtSelToTxt.Click += new System.EventHandler(this.btnTranCvtSelToTxt_Click); + // + // lblIncTran + // + this.lblIncTran.AutoSize = true; + this.lblIncTran.Location = new System.Drawing.Point(4, 9); + this.lblIncTran.Name = "lblIncTran"; + this.lblIncTran.Size = new System.Drawing.Size(23, 13); + this.lblIncTran.TabIndex = 2; + this.lblIncTran.Text = "To:"; + // + // btnTranCvtAllToTxt + // + this.btnTranCvtAllToTxt.Enabled = false; + this.btnTranCvtAllToTxt.Location = new System.Drawing.Point(6, 63); + this.btnTranCvtAllToTxt.Name = "btnTranCvtAllToTxt"; + this.btnTranCvtAllToTxt.Size = new System.Drawing.Size(109, 22); + this.superTooltip1.SetSuperTooltip(this.btnTranCvtAllToTxt, new DevComponents.DotNetBar.SuperTooltipInfo("Convert All Incoming Transitions To Text", "", "Converts all of the transitions in the results list to text unless the user does " + + "not have permission to change text.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 90))); + this.btnTranCvtAllToTxt.TabIndex = 1; + this.btnTranCvtAllToTxt.Text = "Convert All To Text"; + this.btnTranCvtAllToTxt.UseVisualStyleBackColor = true; + this.btnTranCvtAllToTxt.Click += new System.EventHandler(this.btnTranCvtAllToTxt_Click); + // + // lblSrchIncTran + // + this.lblSrchIncTran.BackColor = System.Drawing.Color.Transparent; + this.lblSrchIncTran.Location = new System.Drawing.Point(34, 9); + this.lblSrchIncTran.Name = "lblSrchIncTran"; + this.lblSrchIncTran.Size = new System.Drawing.Size(239, 40); + this.superTooltip1.SetSuperTooltip(this.lblSrchIncTran, new DevComponents.DotNetBar.SuperTooltipInfo("Incoming Transitions", "", "This is the step, section, or procedure for which incoming transitions to it are " + + "shown in the list.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 80))); + this.lblSrchIncTran.TabIndex = 1; + // + // groupBox1 + // + this.groupBox1.BackColor = System.Drawing.Color.Transparent; + this.groupBox1.Controls.Add(this.rbFromEditor); + this.groupBox1.Controls.Add(this.rbFromTree); + this.groupBox1.Location = new System.Drawing.Point(147, 4); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(130, 57); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Search Selection"; + this.groupBox1.Visible = false; + // + // rbFromEditor + // + this.rbFromEditor.AutoSize = true; + this.rbFromEditor.Location = new System.Drawing.Point(22, 34); + this.rbFromEditor.Name = "rbFromEditor"; + this.rbFromEditor.Size = new System.Drawing.Size(78, 17); + this.rbFromEditor.TabIndex = 1; + this.rbFromEditor.TabStop = true; + this.rbFromEditor.Text = "From Editor"; + this.rbFromEditor.UseVisualStyleBackColor = true; + // + // rbFromTree + // + this.rbFromTree.AutoSize = true; + this.rbFromTree.Location = new System.Drawing.Point(22, 16); + this.rbFromTree.Name = "rbFromTree"; + this.rbFromTree.Size = new System.Drawing.Size(73, 17); + this.rbFromTree.TabIndex = 0; + this.rbFromTree.TabStop = true; + this.rbFromTree.Text = "From Tree"; + this.rbFromTree.UseVisualStyleBackColor = true; + // + // tabIncTrans + // + this.tabIncTrans.AttachedControl = this.tabControlPanel1; + this.tabIncTrans.Name = "tabIncTrans"; + this.superTooltip1.SetSuperTooltip(this.tabIncTrans, new DevComponents.DotNetBar.SuperTooltipInfo("Search for Incoming Transitions", "", "Finds the Incoming Transitions that point to the current item and convert the tra" + + "nsition(s) to text if desired and if have permissions.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 120))); + this.tabIncTrans.Text = "Incoming\nTransitions"; + // // contextMenuBar1 // this.contextMenuBar1.DockSide = DevComponents.DotNetBar.eDockSide.Top; @@ -1136,119 +1248,6 @@ namespace Volian.Controls.Library this.btnNOT.Text = "NOT"; this.btnNOT.Click += new System.EventHandler(this.btnNOT_Click); // - // tabIncTrans - // - this.tabIncTrans.AttachedControl = this.tabControlPanel1; - this.tabIncTrans.Name = "tabIncTrans"; - this.superTooltip1.SetSuperTooltip(this.tabIncTrans, new DevComponents.DotNetBar.SuperTooltipInfo("Search for Incoming Transitions", "", "Finds the Incoming Transitions that point to the current item and convert the tra" + - "nsition(s) to text if desired and if have permissions.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 120))); - this.tabIncTrans.Text = "Incoming\nTransitions"; - // - // tabControlPanel1 - // - this.tabControlPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControlPanel1.Controls.Add(this.btnTranCvtSelToTxt); - this.tabControlPanel1.Controls.Add(this.lblIncTran); - this.tabControlPanel1.Controls.Add(this.btnTranCvtAllToTxt); - this.tabControlPanel1.Controls.Add(this.lblSrchIncTran); - this.tabControlPanel1.Controls.Add(this.groupBox1); - this.tabControlPanel1.DisabledBackColor = System.Drawing.Color.Empty; - this.tabControlPanel1.Location = new System.Drawing.Point(0, 34); - this.tabControlPanel1.Name = "tabControlPanel1"; - this.tabControlPanel1.Padding = new System.Windows.Forms.Padding(1); - this.tabControlPanel1.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.tabControlPanel1.Size = new System.Drawing.Size(277, 113); - this.tabControlPanel1.Style.BackColor1.Color = System.Drawing.Color.FromArgb(((int)(((byte)(253)))), ((int)(((byte)(253)))), ((int)(((byte)(254))))); - this.tabControlPanel1.Style.BackColor2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(157)))), ((int)(((byte)(188)))), ((int)(((byte)(227))))); - this.tabControlPanel1.Style.Border = DevComponents.DotNetBar.eBorderType.SingleLine; - this.tabControlPanel1.Style.BorderColor.Color = System.Drawing.Color.FromArgb(((int)(((byte)(146)))), ((int)(((byte)(165)))), ((int)(((byte)(199))))); - this.tabControlPanel1.Style.BorderSide = ((DevComponents.DotNetBar.eBorderSide)(((DevComponents.DotNetBar.eBorderSide.Left | DevComponents.DotNetBar.eBorderSide.Right) - | DevComponents.DotNetBar.eBorderSide.Bottom))); - this.tabControlPanel1.Style.GradientAngle = 90; - this.tabControlPanel1.TabIndex = 17; - this.tabControlPanel1.TabItem = this.tabIncTrans; - // - // btnTranCvtSelToTxt - // - this.btnTranCvtSelToTxt.Enabled = false; - this.btnTranCvtSelToTxt.Location = new System.Drawing.Point(121, 63); - this.btnTranCvtSelToTxt.Name = "btnTranCvtSelToTxt"; - this.btnTranCvtSelToTxt.Size = new System.Drawing.Size(145, 22); - this.superTooltip1.SetSuperTooltip(this.btnTranCvtSelToTxt, new DevComponents.DotNetBar.SuperTooltipInfo("Convert Selected Incoming Transitions To Text", "", "Converts selected transitions in the results list to text unless the user does no" + - "t have permission to change text.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 90))); - this.btnTranCvtSelToTxt.TabIndex = 3; - this.btnTranCvtSelToTxt.Text = "Convert Selected To Text"; - this.btnTranCvtSelToTxt.UseVisualStyleBackColor = true; - this.btnTranCvtSelToTxt.Click += new System.EventHandler(this.btnTranCvtSelToTxt_Click); - // - // lblIncTran - // - this.lblIncTran.AutoSize = true; - this.lblIncTran.Location = new System.Drawing.Point(4, 9); - this.lblIncTran.Name = "lblIncTran"; - this.lblIncTran.Size = new System.Drawing.Size(23, 13); - this.lblIncTran.TabIndex = 2; - this.lblIncTran.Text = "To:"; - // - // btnTranCvtAllToTxt - // - this.btnTranCvtAllToTxt.Enabled = false; - this.btnTranCvtAllToTxt.Location = new System.Drawing.Point(6, 63); - this.btnTranCvtAllToTxt.Name = "btnTranCvtAllToTxt"; - this.btnTranCvtAllToTxt.Size = new System.Drawing.Size(109, 22); - this.superTooltip1.SetSuperTooltip(this.btnTranCvtAllToTxt, new DevComponents.DotNetBar.SuperTooltipInfo("Convert All Incoming Transitions To Text", "", "Converts all of the transitions in the results list to text unless the user does " + - "not have permission to change text.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 90))); - this.btnTranCvtAllToTxt.TabIndex = 1; - this.btnTranCvtAllToTxt.Text = "Convert All To Text"; - this.btnTranCvtAllToTxt.UseVisualStyleBackColor = true; - this.btnTranCvtAllToTxt.Click += new System.EventHandler(this.btnTranCvtAllToTxt_Click); - // - // lblSrchIncTran - // - this.lblSrchIncTran.BackColor = System.Drawing.Color.Transparent; - this.lblSrchIncTran.Location = new System.Drawing.Point(34, 9); - this.lblSrchIncTran.Name = "lblSrchIncTran"; - this.lblSrchIncTran.Size = new System.Drawing.Size(239, 40); - this.superTooltip1.SetSuperTooltip(this.lblSrchIncTran, new DevComponents.DotNetBar.SuperTooltipInfo("Incoming Transitions", "", "This is the step, section, or procedure for which incoming transitions to it are " + - "shown in the list.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(170, 80))); - this.lblSrchIncTran.TabIndex = 1; - // - // groupBox1 - // - this.groupBox1.BackColor = System.Drawing.Color.Transparent; - this.groupBox1.Controls.Add(this.rbFromEditor); - this.groupBox1.Controls.Add(this.rbFromTree); - this.groupBox1.Location = new System.Drawing.Point(147, 4); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(130, 57); - this.groupBox1.TabIndex = 0; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Search Selection"; - this.groupBox1.Visible = false; - // - // rbFromEditor - // - this.rbFromEditor.AutoSize = true; - this.rbFromEditor.Location = new System.Drawing.Point(22, 34); - this.rbFromEditor.Name = "rbFromEditor"; - this.rbFromEditor.Size = new System.Drawing.Size(78, 17); - this.rbFromEditor.TabIndex = 1; - this.rbFromEditor.TabStop = true; - this.rbFromEditor.Text = "From Editor"; - this.rbFromEditor.UseVisualStyleBackColor = true; - // - // rbFromTree - // - this.rbFromTree.AutoSize = true; - this.rbFromTree.Location = new System.Drawing.Point(22, 16); - this.rbFromTree.Name = "rbFromTree"; - this.rbFromTree.Size = new System.Drawing.Size(73, 17); - this.rbFromTree.TabIndex = 0; - this.rbFromTree.TabStop = true; - this.rbFromTree.Text = "From Tree"; - this.rbFromTree.UseVisualStyleBackColor = true; - // // advTreeProcSets // this.advTreeProcSets.AccessibleRole = System.Windows.Forms.AccessibleRole.Outline; @@ -1407,6 +1406,7 @@ namespace Volian.Controls.Library // this.lbSrchResultsIncTrans.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square; this.lbSrchResultsIncTrans.CheckBoxesVisible = true; + this.lbSrchResultsIncTrans.CheckStateMember = null; this.lbSrchResultsIncTrans.ContainerControlProcessDialogKey = true; this.lbSrchResultsIncTrans.Dock = System.Windows.Forms.DockStyle.Fill; this.lbSrchResultsIncTrans.DragDropSupport = true; @@ -1733,6 +1733,11 @@ namespace Volian.Controls.Library this.Controls.Add(this.xpSetToSearch); this.Controls.Add(this.tabSearchTypes); this.Controls.Add(this.tabControlPanel1); + //B2025-056 Click on Incoming Transitions + // This needs to be part of overall control + // since if it is part of tabSearchTypes, + // then when that is disabled, buttons on + // this will be also this.Margin = new System.Windows.Forms.Padding(2); this.Name = "DisplaySearch"; this.RightToLeft = System.Windows.Forms.RightToLeft.Yes; @@ -1755,11 +1760,11 @@ namespace Volian.Controls.Library this.gpSrchAnnoText.ResumeLayout(false); this.panel4.ResumeLayout(false); this.panel4.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.contextMenuBar1)).EndInit(); this.tabControlPanel1.ResumeLayout(false); this.tabControlPanel1.PerformLayout(); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.contextMenuBar1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.advTreeProcSets)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.advTreeStepTypes)).EndInit(); this.grpPanSearchResults.ResumeLayout(false); diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs index dc4245ea..95fa1523 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.Designer.cs @@ -83,6 +83,7 @@ namespace Volian.Controls.Library this.ResumeLayout(false); } + #endregion } } From a89c2d3d22267db74ccb7ba6a292a2ce16f2d4ab Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Tue, 28 Jul 2026 15:37:37 -0400 Subject: [PATCH 34/49] B2026-053-Find-Unlinked-Values-of-Selected --- .../Volian.Controls.Library/DisplaySearch.cs | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index e821f5a1..bbe06f08 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2078,9 +2078,27 @@ namespace Volian.Controls.Library if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { - string ROSearchList2 = exactsearch(ROSearchList); // B2026-053 match exact string - // B2022-031 - added a exactsearch to filter out procedure and section titles from global search results. - SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); + string byWordPrefix = string.Empty; + string byWordSuffix = string.Empty; + + if (Regex.IsMatch(ROSearchList, @"^[\d\.]")) // starts with a number or '.' decimal pt + { + byWordPrefix = @"[^0-9a-zA-Z.vbpi:\\-]"; + } + else if (Regex.IsMatch(ROSearchList, @"^[a-zA-Z]")) // starts with a letter + { + byWordPrefix = @"[^a-zA-Z]"; + } + if (Regex.IsMatch(ROSearchList, @"[\d\.]$")) // ends with a number or decimal + { + byWordSuffix = @"[^0-9a-zA-Z.vbpi:\\-]"; + } + else if (Regex.IsMatch(ROSearchList, @"[a-zA-Z]$")) // ends with a letter + { + byWordSuffix = @"[^a-zA-Z]"; + } + string ROSearchList2 = ROSearchList; + SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix); cmbResultsStyleIndex = 3; // display step text in results } else @@ -2190,26 +2208,6 @@ namespace Volian.Controls.Library } OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); } - - private string exactsearch(string SearchString) // B2026-053 - { - StringBuilder ss = new StringBuilder(); - int sl = SearchString.Length; - int LstIdxSp = SearchString.LastIndexOf(' '); - if (sl == LstIdxSp + 1) // B2026-053 if ' ' the last char. - { - ss.Append(' '); - ss.Append(SearchString); // B2026-053 add a space prefix to make the search exact if the end of the searchString is a space. - } - else - { - ss.Append(' '); - ss.Append(SearchString); // B2026-053 Exact match add spaces before and after searchString. - ss.Append(' '); - } - return ss.ToString(); - } - private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) { if (tabSearchTypes.SelectedTab != tabSearchTypes.Tabs[4]) From 1eb3c3e7254fc65db0d26147e6b9bd385da4ada4 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Tue, 28 Jul 2026 15:39:17 -0400 Subject: [PATCH 35/49] B2026-053-Find-Unlinked-Values-of-Selected --- PROMS/Volian.Controls.Library/DisplaySearch.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index bbe06f08..d9dfb107 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2097,7 +2097,7 @@ namespace Volian.Controls.Library { byWordSuffix = @"[^a-zA-Z]"; } - string ROSearchList2 = ROSearchList; + SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix); cmbResultsStyleIndex = 3; // display step text in results } From 4ef16e78565f1ee312527029964301ab4a59fcbf Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Tue, 28 Jul 2026 15:46:43 -0400 Subject: [PATCH 36/49] B2026-053-Find-Unlinked-Values-of-Selected --- PROMS/Volian.Controls.Library/DisplaySearch.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index d9dfb107..242be943 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2098,7 +2098,7 @@ namespace Volian.Controls.Library byWordSuffix = @"[^a-zA-Z]"; } - SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList2, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix); + SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix); cmbResultsStyleIndex = 3; // display step text in results } else From 954cc5918ffe0a04767554ab05e483de92c82ff5 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 29 Jul 2026 12:34:20 -0400 Subject: [PATCH 37/49] B2026-053-Find-Unlinked-Values-of-Selected --- .../Volian.Controls.Library/DisplaySearch.cs | 91 +++++++++---------- 1 file changed, 43 insertions(+), 48 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index 242be943..ba5e7ce0 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2017,35 +2017,21 @@ namespace Volian.Controls.Library ReportTitle = string.Format("Search for '{0}'", TextSearchString); // C2020-009: Search - Allow search 'By Word'. - string byWordPrefix = string.Empty; - string byWordSuffix = string.Empty; - if (cbxByWord.Checked) - { - // Generate a prefix & suffix to be used in the sql query around the search string. - // If the search string starts (prefix)/ends(suffix) with a number, then use an expression that - // does not allow the preceding/following text to have a number, '.', letter or other rtf - // commands. If the search string starts/ends with a letter, then use an expression that does not - // find the preceding/following text that is text, i.e. a letter. - if (Regex.IsMatch(TextSearchString, @"^[\d\.]")) // starts with a number or '.' decimal pt - { - byWordPrefix = @"[^0-9a-zA-Z.vbpi:\\-]"; - } - else if (Regex.IsMatch(TextSearchString, @"^[a-zA-Z]")) // starts with a letter - { - byWordPrefix = @"[^a-zA-Z]"; - } - if (Regex.IsMatch(TextSearchString, @"[\d\.]$")) // ends with a number or decimal - { - byWordSuffix = @"[^0-9a-zA-Z.vbpi:\\-]"; - } - else if (Regex.IsMatch(TextSearchString, @"[a-zA-Z]$")) // ends with a letter - { - byWordSuffix = @"[^a-zA-Z]"; - } - } + + //if (cbxByWord.Checked) + //{ + // // Generate a prefix & suffix to be used in the sql query around the search string. + // // If the search string starts (prefix)/ends(suffix) with a number, then use an expression that + // // does not allow the preceding/following text to have a number, '.', letter or other rtf + // // commands. If the search string starts/ends with a letter, then use an expression that does not + // // find the preceding/following text that is text, i.e. a letter. + SearchString = TextSearchString; - // 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); + + Dictionary rtnByWord = GetByWordSettings(TextSearchString); + + // 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, rtnByWord["byWordPrefix"], rtnByWord["byWordSuffix"]); cmbResultsStyleIndex = 3; // display step text in results //} @@ -2078,27 +2064,10 @@ namespace Volian.Controls.Library if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { - string byWordPrefix = string.Empty; - string byWordSuffix = string.Empty; - if (Regex.IsMatch(ROSearchList, @"^[\d\.]")) // starts with a number or '.' decimal pt - { - byWordPrefix = @"[^0-9a-zA-Z.vbpi:\\-]"; - } - else if (Regex.IsMatch(ROSearchList, @"^[a-zA-Z]")) // starts with a letter - { - byWordPrefix = @"[^a-zA-Z]"; - } - if (Regex.IsMatch(ROSearchList, @"[\d\.]$")) // ends with a number or decimal - { - byWordSuffix = @"[^0-9a-zA-Z.vbpi:\\-]"; - } - else if (Regex.IsMatch(ROSearchList, @"[a-zA-Z]$")) // ends with a letter - { - byWordSuffix = @"[^a-zA-Z]"; - } - - SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix); + Dictionary rtnByWord = GetByWordSettings(ROSearchList); + + SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, rtnByWord["byWordPrefix"], rtnByWord["byWordSuffix"]); cmbResultsStyleIndex = 3; // display step text in results } else @@ -2208,6 +2177,32 @@ namespace Volian.Controls.Library } OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); } + private Dictionary GetByWordSettings(string ss) + { + + Dictionary settings = new Dictionary(); + + string byWordPrefix = string.Empty; + string byWordSuffix = string.Empty; + + if (Regex.IsMatch(ss, @"^[\d\.]")) // starts with a number or '.' decimal pt + { + settings.Add("byWordPrefix", @"[^0-9a-zA-Z.vbpi:\\-]"); + } + else if (Regex.IsMatch(ss, @"^[a-zA-Z]")) // starts with a letter + { + settings.Add("byWordPrefix", @"[^a-zA-Z]"); + } + if (Regex.IsMatch(ss, @"^[\d\.]")) // ends with a number or decimal + { + settings.Add("byWordSuffix", @"[^0-9a-zA-Z.vbpi:\\-]"); + } + else if (Regex.IsMatch(ss, @"[a-zA-Z]$")) // ends with a letter + { + settings.Add("byWordSuffix", @"[^a-zA-Z]"); + } + return settings; + } private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) { if (tabSearchTypes.SelectedTab != tabSearchTypes.Tabs[4]) From bc9407f52f64ca51d2efbeb86bebdf7c1684fef6 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 29 Jul 2026 13:48:05 -0400 Subject: [PATCH 38/49] B2026-053-Find-Unlinked-Values-of-Selected --- PROMS/Volian.Controls.Library/DisplaySearch.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index ba5e7ce0..d96e172b 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2179,13 +2179,9 @@ namespace Volian.Controls.Library } private Dictionary GetByWordSettings(string ss) { - Dictionary settings = new Dictionary(); - string byWordPrefix = string.Empty; - string byWordSuffix = string.Empty; - - if (Regex.IsMatch(ss, @"^[\d\.]")) // starts with a number or '.' decimal pt + if (Regex.IsMatch(ss, @"^[\d\.]")) // starts with a number or '.' decimal pt { settings.Add("byWordPrefix", @"[^0-9a-zA-Z.vbpi:\\-]"); } From 453edbb28ea372cbe547fc16eebf3baa0fb39e2c Mon Sep 17 00:00:00 2001 From: mschill Date: Thu, 30 Jul 2026 10:54:24 -0400 Subject: [PATCH 39/49] =?UTF-8?q?B2026-069=20=E2=80=93=20Updated=20Messagi?= =?UTF-8?q?ng=20related=20to=20Checking=20out=20working=20Drafts=20when=20?= =?UTF-8?q?ROs=20are=20being=20checked=20if=20they=20need=20updated.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROMS/Volian.Controls.Library/DisplayRO.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplayRO.cs b/PROMS/Volian.Controls.Library/DisplayRO.cs index 86ff26cb..d8b59abd 100644 --- a/PROMS/Volian.Controls.Library/DisplayRO.cs +++ b/PROMS/Volian.Controls.Library/DisplayRO.cs @@ -643,10 +643,9 @@ namespace Volian.Controls.Library 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)) + if (_progressBar?.Text != "RO Check Paused - Other Users In Set" && !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"; + FinalProgressBarMessage = "RO Check Paused - Other Users In Set"; } else if (!MySessionInfo.CanCheckOutItem(_docVersionInfo.VersionID, CheckOutType.DocVersion, ref message)) { @@ -719,7 +718,7 @@ namespace Volian.Controls.Library 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") + if (_progressBar?.Text != "RO Check Paused - Other Users In Set") { changedDocVersion = false; } From 43b63e2843dd4c63ebcc3d4ee54a073d317f3245 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Thu, 30 Jul 2026 12:51:24 -0400 Subject: [PATCH 40/49] B2026-053-Find-Unlinked-Values-of-Selected --- .../Volian.Controls.Library/DisplaySearch.cs | 78 +++++++++++++------ 1 file changed, 53 insertions(+), 25 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index d96e172b..84b73d4d 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2028,10 +2028,8 @@ namespace Volian.Controls.Library SearchString = TextSearchString; - Dictionary rtnByWord = GetByWordSettings(TextSearchString); - // 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, rtnByWord["byWordPrefix"], rtnByWord["byWordSuffix"]); + 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, GetByWordSettings(TextSearchString, true), GetByWordSettings(TextSearchString, false)); cmbResultsStyleIndex = 3; // display step text in results //} @@ -2065,9 +2063,7 @@ namespace Volian.Controls.Library if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { - Dictionary rtnByWord = GetByWordSettings(ROSearchList); - - SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, rtnByWord["byWordPrefix"], rtnByWord["byWordSuffix"]); + SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, GetByWordSettings(ROSearchList, true), GetByWordSettings(ROSearchList, false)); cmbResultsStyleIndex = 3; // display step text in results } else @@ -2177,27 +2173,59 @@ namespace Volian.Controls.Library } OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); } - private Dictionary GetByWordSettings(string ss) + private string GetByWordSettings(string ss, bool checkstart) { - Dictionary settings = new Dictionary(); + //if (Regex.IsMatch(ss, @"^[\d\.]")) // starts with a number or '.' decimal pt + //{ + // settings.Add("byWordPrefix", @"[^0-9a-zA-Z.vbpi:\\-]"); + //} + //else if (Regex.IsMatch(ss, @"^[a-zA-Z]")) // starts with a letter + //{ + // settings.Add("byWordPrefix", @"[^a-zA-Z]"); + //} + //if (Regex.IsMatch(ss, @"^[\d\.]")) // ends with a number or decimal + //{ + // settings.Add("byWordSuffix", @"[^0-9a-zA-Z.vbpi:\\-]"); + //} + //else if (Regex.IsMatch(ss, @"[a-zA-Z]$")) // ends with a letter + //{ + // settings.Add("byWordSuffix", @"[^a-zA-Z]"); + //} + //return settings; + if (ss.Length > 0) + { + //checking start + if (checkstart) + { + // starts with a number or '.' decimal pt + if (char.IsNumber(ss, 0) || ss[0] == '.') + { + return @"[^0-9a-zA-Z.vbpi:\\-]"; + } + // starts with a letter + else if (char.IsLetter(ss, 0)) + { + return @"[^a-zA-Z]"; + } + } + //checking end + else + { + // ends with a number or '.' decimal pt + if (char.IsNumber(ss, ss.Length - 1) || ss[ss.Length - 1] == '.') + { + return @"[^0-9a-zA-Z.vbpi:\\-]"; + } + // ends with a letter + else if (char.IsLetter(ss, ss.Length - 1)) + { + return @"[^a-zA-Z]"; + } + } + } - if (Regex.IsMatch(ss, @"^[\d\.]")) // starts with a number or '.' decimal pt - { - settings.Add("byWordPrefix", @"[^0-9a-zA-Z.vbpi:\\-]"); - } - else if (Regex.IsMatch(ss, @"^[a-zA-Z]")) // starts with a letter - { - settings.Add("byWordPrefix", @"[^a-zA-Z]"); - } - if (Regex.IsMatch(ss, @"^[\d\.]")) // ends with a number or decimal - { - settings.Add("byWordSuffix", @"[^0-9a-zA-Z.vbpi:\\-]"); - } - else if (Regex.IsMatch(ss, @"[a-zA-Z]$")) // ends with a letter - { - settings.Add("byWordSuffix", @"[^a-zA-Z]"); - } - return settings; + //default + return string.Empty; } private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) { From cfc324d31e808a18f6498cfb32e96eda9b11685c Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Thu, 30 Jul 2026 15:22:32 -0400 Subject: [PATCH 41/49] B2026-053-Find-Unlinked-Values-of-Selected --- .../Volian.Controls.Library/DisplaySearch.cs | 47 +++++++------------ 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index 84b73d4d..3ddbe677 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -2016,20 +2016,17 @@ namespace Volian.Controls.Library { ReportTitle = string.Format("Search for '{0}'", TextSearchString); - // C2020-009: Search - Allow search 'By Word'. + string byWordPrefix = string.Empty; + string byWordSuffix = string.Empty; + if (cbxByWord.Checked) + { + byWordPrefix = GetByWordSettings(TextSearchString, true); + byWordSuffix = GetByWordSettings(TextSearchString, false); + } - //if (cbxByWord.Checked) - //{ - // // Generate a prefix & suffix to be used in the sql query around the search string. - // // If the search string starts (prefix)/ends(suffix) with a number, then use an expression that - // // does not allow the preceding/following text to have a number, '.', letter or other rtf - // // commands. If the search string starts/ends with a letter, then use an expression that does not - // // find the preceding/following text that is text, i.e. a letter. + SearchString = TextSearchString; - SearchString = TextSearchString; - - // 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, GetByWordSettings(TextSearchString, true), GetByWordSettings(TextSearchString, false)); + 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); cmbResultsStyleIndex = 3; // display step text in results //} @@ -2175,23 +2172,15 @@ namespace Volian.Controls.Library } private string GetByWordSettings(string ss, bool checkstart) { - //if (Regex.IsMatch(ss, @"^[\d\.]")) // starts with a number or '.' decimal pt - //{ - // settings.Add("byWordPrefix", @"[^0-9a-zA-Z.vbpi:\\-]"); - //} - //else if (Regex.IsMatch(ss, @"^[a-zA-Z]")) // starts with a letter - //{ - // settings.Add("byWordPrefix", @"[^a-zA-Z]"); - //} - //if (Regex.IsMatch(ss, @"^[\d\.]")) // ends with a number or decimal - //{ - // settings.Add("byWordSuffix", @"[^0-9a-zA-Z.vbpi:\\-]"); - //} - //else if (Regex.IsMatch(ss, @"[a-zA-Z]$")) // ends with a letter - //{ - // settings.Add("byWordSuffix", @"[^a-zA-Z]"); - //} - //return settings; + + // C2020-009: Search - Allow search 'By Word'. + + // // Generate a prefix & suffix to be used in the sql query around the search string. + // // If the search string starts (prefix)/ends(suffix) with a number, then use an expression that + // // does not allow the preceding/following text to have a number, '.', letter or other rtf + // // commands. If the search string starts/ends with a letter, then use an expression that does not + // // find the preceding/following text that is text, i.e. a letter. + if (ss.Length > 0) { //checking start From 1b9b63412c7eab8e6e01366707fb19a16784117a Mon Sep 17 00:00:00 2001 From: John Jenko Date: Fri, 31 Jul 2026 13:44:19 -0400 Subject: [PATCH 42/49] C2026-047 Improved the efficiency of retrieving Alarm Point Table information. --- PROMS/Volian.Controls.Library/EditItem.cs | 11 +++++------ PROMS/Volian.Print.Library/VlnSvgPageHelper.cs | 10 +++++----- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/PROMS/Volian.Controls.Library/EditItem.cs b/PROMS/Volian.Controls.Library/EditItem.cs index 80a47892..b52a03cd 100644 --- a/PROMS/Volian.Controls.Library/EditItem.cs +++ b/PROMS/Volian.Controls.Library/EditItem.cs @@ -3684,15 +3684,14 @@ namespace Volian.Controls.Library { ROFSTLookup myLookup = MySection.MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(MySection.MyDocVersion, null); - string accpgid = accpageid; - - //B2022 - 083: Support Conditional RO Values - ROFSTLookup.rochild roc = myLookup.GetROChildByAccPageID(string.Format("<{0}.{1}>", accpgid, multiid), MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix); + //B2022-083: Support Conditional RO Values + //C2026-047 first try the RO Lookup with the ascii dash character in the accpageid. If not found, try again with the unicode dash + ROFSTLookup.rochild roc = myLookup.GetROChildByAccPageID(string.Format("<{0}.{1}>", accpageid.Replace(@"\u8209?", "-"), multiid), MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix); if (roc.value == null) { - accpgid = accpgid.Replace(@"\u8209?", "-"); - roc = myLookup.GetROChildByAccPageID(string.Format("<{0}.{1}>", accpgid, multiid), MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix); + // try again but this time with the unicode dash + roc = myLookup.GetROChildByAccPageID(string.Format("<{0}.{1}>", accpageid, multiid), MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix); } if (!deflt.StartsWith("[") && !string.IsNullOrEmpty(roc.value) && roc.value.Trim().Length > 0) // don't return val if it's an empty or blank string - jsj 01-28-2019 diff --git a/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs b/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs index 89efa648..a6cc1382 100644 --- a/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs +++ b/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs @@ -1659,14 +1659,14 @@ i = 0; private string ROLookup(string accpageid, string multiid, string deflt, string overrideChild) { ROFSTLookup myLookup = MySection.MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(MySection.MyDocVersion, overrideChild); - - string accpgid = accpageid; - ROFSTLookup.rochild roc = myLookup.GetROChildByAccPageID("<" + accpgid + "." + multiid + ">", MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix); + + //C2026-047 first try the RO Lookup with the ascii dash character in the accpageid. If not found, try again with the unicode dash + ROFSTLookup.rochild roc = myLookup.GetROChildByAccPageID("<" + accpageid.Replace(@"\u8209?", "-") + "." + multiid + ">", MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix); if (roc.value == null) { - accpgid = accpgid.Replace(@"\u8209?", "-"); - roc = myLookup.GetROChildByAccPageID("<" + accpgid + "." + multiid + ">", MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix); + // try again but this time with the unicode dash + roc = myLookup.GetROChildByAccPageID("<" + accpageid + "." + multiid + ">", MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix); } if (!deflt.StartsWith("[") && !string.IsNullOrEmpty(roc.value) && roc.value.Trim().Length > 0) // don't return val if it's an empty or blank string - jsj 01-28-2019 From 6c2eee0cbc299da0e576491bd2c77b7e04e42b5c Mon Sep 17 00:00:00 2001 From: mschill Date: Tue, 4 Aug 2026 07:57:01 -0400 Subject: [PATCH 43/49] =?UTF-8?q?B2026-070=20=E2=80=93Barakah=20Word=20Sec?= =?UTF-8?q?tion=20with=20less=20than=20sign?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/DocumentExt.cs | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/DocumentExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/DocumentExt.cs index 2dec2bda..5d7095b0 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/DocumentExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/DocumentExt.cs @@ -1258,7 +1258,7 @@ namespace VEPROMS.CSLA.Library int lastStart = sel == null ? 0 : sel.Start; - while (sel != null) + while (sel != null) { if (!string.IsNullOrEmpty(sel.Text)) { @@ -1438,7 +1438,7 @@ namespace VEPROMS.CSLA.Library lastStart = sel.Start; - sel = FindRO(); + sel = FindRO(); if (sel != null && !string.IsNullOrEmpty(sel.Text) && sel.Start == lastStart) { @@ -2124,22 +2124,22 @@ namespace VEPROMS.CSLA.Library bool executeResult = false; LBSelection sel = null; - while (!executeResult) + while (!executeResult) { sel = MyApp.Selection; LBFind find = sel.Find; find.ClearFormatting(); - // Search string format - this is MSWord wildcard format - // If you do a search in MSWord, make sure wildcard box is checked and then press the - // Special button to see the definitions of the various wildcards - // [<] - Less-Than Character - // [!<> -]@ - 1 or more characters not including Less-Than, Greater-Than, Dash or Space - // - Dash - // [!<>]@ - 1 or more characters not including Less-Than, Greater-Than. - // a space be included as part of the accessory page id (Callaway, EOP Addendum 37) - // [>] - Greater-Than Character - find.Text = "[<][!<> -]@-[!<>]@[>]"; + // Search string format - this is MSWord wildcard format + // If you do a search in MSWord, make sure wildcard box is checked and then press the + // Special button to see the definitions of the various wildcards + // [<] - Less-Than Character + // [!<> -]@ - 1 or more characters not including Less-Than, Greater-Than, Dash or Space + // - Dash + // [!<>]@ - 1 or more characters not including Less-Than, Greater-Than. + // a space be included as part of the accessory page id (Callaway, EOP Addendum 37) + // [>] - Greater-Than Character + find.Text = "[<][!<> -]@-[!<>]@[>]"; find.Wrap = LBWdFindWrap.wdFindContinue; find.MatchCase = false; find.MatchWholeWord = false; @@ -2159,14 +2159,18 @@ namespace VEPROMS.CSLA.Library { tryagain = false; executeResult = find.Execute(); - // B2022-053 if the found text does not begin with a "<" and end with a ">", then - // move past that text and try the Word Find function again. - // B2022-088: [JPR] Find Doc Ro button not working in Word Sections - // B2022-098: [JPR] ROs not being resolved in Word Sections + // B2022-053 if the found text does not begin with a "<" and end with a ">", then + // move past that text and try the Word Find function again. + // B2022-088: [JPR] Find Doc Ro button not working in Word Sections + // B2022-098: [JPR] ROs not being resolved in Word Sections + // B2026-070: When there is a less-then sign (<) followed by a numeric value in a Word attachment (inside of a table), PROMS thinks the user put in an RO token will generate an RO not found error in the following table row who's text contains . if (executeResult && !string.IsNullOrEmpty(sel.Text) && !sel.Text.StartsWith("<") && !sel.Text.EndsWith(">")) - { - sel.MoveStart(LBWdUnits.wdCharacter, sel.Text.Length - 1); - tryagain = true; + { + int location = sel.Start + sel.Text.Length - 1; //do not do this inline - this needs captured before WholeStory + + sel.WholeStory(); + sel.MoveStart(LBWdUnits.wdCharacter, location); + tryagain = true; } } while (tryagain); @@ -2191,7 +2195,7 @@ namespace VEPROMS.CSLA.Library sel.MoveStart(LBWdUnits.wdCharacter, 1); executeResult = false; } - } + } if (executeResult) return sel; From 70aa1f4024f224d82b3f5d810d14005770afafa1 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 5 Aug 2026 17:23:13 -0400 Subject: [PATCH 44/49] B2026-056-Syntax-problem-in-XY-plot --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 919325b1..2d70bb0b 100644 --- a/.gitignore +++ b/.gitignore @@ -401,4 +401,5 @@ FodyWeavers.xsd /fmtall /genmacall -*AssemblyInfo.cs \ No newline at end of file +*AssemblyInfo.cs +/PROMS/Baseline/Baseline.sln From cd9eaaaba175a928f3203dc7a2504bad5d0b2e76 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 5 Aug 2026 21:42:44 -0400 Subject: [PATCH 45/49] B2026-056-Syntac-problem-in-XY-Plot --- PROMS/VEPROMS User Interface/frmVEPROMS.cs | 3 +- PROMS/Volian.Base.Library/BaseLnSettings.cs | 18 ++++++ .../Volian.Base.Library.csproj | 1 + PROMS/XYPlots/XYPlots.cs | 61 +++++++++++++------ PROMS/XYPlots/XYPlots.csproj | 4 ++ 5 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 PROMS/Volian.Base.Library/BaseLnSettings.cs diff --git a/PROMS/VEPROMS User Interface/frmVEPROMS.cs b/PROMS/VEPROMS User Interface/frmVEPROMS.cs index c5a6f11d..facb6027 100644 --- a/PROMS/VEPROMS User Interface/frmVEPROMS.cs +++ b/PROMS/VEPROMS User Interface/frmVEPROMS.cs @@ -3578,6 +3578,7 @@ namespace VEPROMS { if (parameter.StartsWith("/P=")) { + BaseLnSettings.blBaseLine = true; MSWordToPDF.Automatic = true; PromsPrinter.BaselineTesting = true;// Set Baseline Testing property for PROMsPrinter string[] dvstrs = parameter.Substring(3).Split(",".ToCharArray()); @@ -3623,7 +3624,7 @@ namespace VEPROMS } ranAuto = true; } - + BaseLnSettings.blBaseLine = false; if (ranAuto) { this.Close(); diff --git a/PROMS/Volian.Base.Library/BaseLnSettings.cs b/PROMS/Volian.Base.Library/BaseLnSettings.cs new file mode 100644 index 00000000..ba4da28f --- /dev/null +++ b/PROMS/Volian.Base.Library/BaseLnSettings.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Volian.Base.Library +{ + public static class BaseLnSettings + { + private static bool _blBaseLine = false; + public static bool blBaseLine + { + get { return _blBaseLine; } + set { _blBaseLine = value; } + } + } +} diff --git a/PROMS/Volian.Base.Library/Volian.Base.Library.csproj b/PROMS/Volian.Base.Library/Volian.Base.Library.csproj index 525629a6..91c1a431 100644 --- a/PROMS/Volian.Base.Library/Volian.Base.Library.csproj +++ b/PROMS/Volian.Base.Library/Volian.Base.Library.csproj @@ -90,6 +90,7 @@ + diff --git a/PROMS/XYPlots/XYPlots.cs b/PROMS/XYPlots/XYPlots.cs index 8ac65c0d..85600fd5 100644 --- a/PROMS/XYPlots/XYPlots.cs +++ b/PROMS/XYPlots/XYPlots.cs @@ -6,6 +6,7 @@ using System.Windows.Forms; using System.Text; using System.Drawing; using System.Text.RegularExpressions; +using Volian.Base.Library; using VG; namespace XYPlots @@ -282,9 +283,12 @@ namespace XYPlots { if (!File.Exists(FileName)) { - // File does not exist, show error message - MessageBox.Show(String.Format("X/Y Plot File {0} Does Not Exist", FileName), "Error Opening X/Y Plot File"); - return false; + if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + { + // File does not exist, show error message + MessageBox.Show(String.Format("X/Y Plot File {0} Does Not Exist", FileName), "Error Opening X/Y Plot File"); + return false; + } } // Open the X/Y Plot file try @@ -293,9 +297,12 @@ namespace XYPlots } catch (Exception e) { - // cannot open the x/y plot file - MessageBox.Show(e.Message, String.Format("Error Opening {0} for Reading", FileName)); - return false; + if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + { + // cannot open the x/y plot file + MessageBox.Show(e.Message, String.Format("Error Opening {0} for Reading", FileName)); + return false; + } } int blen = (int)XYPlotFile.Length; int bread = 0; @@ -309,8 +316,11 @@ namespace XYPlots } catch (Exception e) { - MessageBox.Show(e.Message, String.Format("Error Reading {0}", FileName)); - return false; + if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + { + MessageBox.Show(e.Message, String.Format("Error Reading {0}", FileName)); + return false; + } } try { @@ -318,8 +328,11 @@ namespace XYPlots } catch (Exception e) { - MessageBox.Show(e.Message, String.Format("Error Closing {0}", FileName)); - return false; + if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + { + MessageBox.Show(e.Message, String.Format("Error Closing {0}", FileName)); + return false; + } } StringBuilder sb = new StringBuilder(); for (int i = 0; i < bbuf.Length; i++) @@ -446,7 +459,7 @@ namespace XYPlots char retval; StringBuilder Lbuff = new StringBuilder(); retval = NextChar(); - if (retval != '"' && retval != '\x1C') // open double quote + if (retval != '"' && retval != '\x1C' && BaseLnSettings.blBaseLine == false) // open double quote MessageBox.Show("Double Quote not found", "Syntax problem in XY Plot"); retval = NextChar(); while (retval != 0 && retval != '\n') @@ -1440,7 +1453,10 @@ namespace XYPlots } private void PrintStackError(string relation, int limit) { - MessageBox.Show(String.Format("Position Stack Pointer {0} {1}", relation, limit.ToString()), "Print Stack Error"); + if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + { + MessageBox.Show(String.Format("Position Stack Pointer {0} {1}", relation, limit.ToString()), "Print Stack Error"); + } } private void SavePosition() { @@ -1658,8 +1674,11 @@ namespace XYPlots } private void err_exit(string msg, string msg2) { - MessageBox.Show(msg + "\n" + msg2 + "\n\n This p=Process Will Terminate", "\n## ERROR ## - "); - Environment.Exit(255); + if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + { + MessageBox.Show(msg + "\n" + msg2 + "\n\n This p=Process Will Terminate", "\n## ERROR ## - "); + Environment.Exit(255); + } } private void FindBoxesinArea(int ptval, int flag) { @@ -1916,7 +1935,7 @@ namespace XYPlots { // MSWord enters left and right double-quotes when you press the double-quote key //B2017 - Replace left and right double-quotes with normal double-quotes - PlotCommands = PlotCommands.Replace('\u201C', '"').Replace('\u201D', '"'); + PlotCommands = PlotCommands.Replace('\u201C', '"').Replace('\u201D', '"'); LoadBuffFromString(PlotCommands); Setup(); //#if DEBUG @@ -1991,10 +2010,14 @@ namespace XYPlots AxisLabel[1] = getint(); break; default: - if (PrevCommand.Equals(null)) - MessageBox.Show("Check the first line of the X/Y Plot definition.", "Unrecognized Graph Command"); - else - MessageBox.Show(string.Format("Problem with the X/Y Plot Command after {0}", PrevCommand.ToString()), "Unrecognized Graph Command"); + if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + { + if (PrevCommand.Equals(null)) + MessageBox.Show("Check the first line of the X/Y Plot definition.", "Unrecognized Graph Command"); + else + MessageBox.Show(string.Format("Problem with the X/Y Plot Command after {0}", PrevCommand.ToString()), "Unrecognized Graph Command"); + break; + } break; } PrevCommand = Command; diff --git a/PROMS/XYPlots/XYPlots.csproj b/PROMS/XYPlots/XYPlots.csproj index 93469b8a..b94ba2be 100644 --- a/PROMS/XYPlots/XYPlots.csproj +++ b/PROMS/XYPlots/XYPlots.csproj @@ -176,6 +176,10 @@ {52D74078-3822-410E-889B-464BD21AAB9E} VG + + {aeee9fd1-6892-45e2-a67e-418c06d46ff9} + Volian.Base.Library + From 70f132540fc864b5442c3f27022e74ee9b0dee04 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Fri, 7 Aug 2026 12:15:52 -0400 Subject: [PATCH 46/49] B2026-056-Syntax-problem-in-XY-plot --- PROMS/XYPlots/XYPlots.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PROMS/XYPlots/XYPlots.cs b/PROMS/XYPlots/XYPlots.cs index 85600fd5..f9269c6c 100644 --- a/PROMS/XYPlots/XYPlots.cs +++ b/PROMS/XYPlots/XYPlots.cs @@ -283,7 +283,7 @@ namespace XYPlots { if (!File.Exists(FileName)) { - if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + if (!BaseLnSettings.blBaseLine) // B2026-056 suppress messages when running baseline. { // File does not exist, show error message MessageBox.Show(String.Format("X/Y Plot File {0} Does Not Exist", FileName), "Error Opening X/Y Plot File"); @@ -297,7 +297,7 @@ namespace XYPlots } catch (Exception e) { - if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + if (!BaseLnSettings.blBaseLine) // B2026-056 suppress messages when running baseline. { // cannot open the x/y plot file MessageBox.Show(e.Message, String.Format("Error Opening {0} for Reading", FileName)); @@ -316,7 +316,7 @@ namespace XYPlots } catch (Exception e) { - if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + if (!BaseLnSettings.blBaseLine) // B2026-056 suppress messages when running baseline. { MessageBox.Show(e.Message, String.Format("Error Reading {0}", FileName)); return false; @@ -328,7 +328,7 @@ namespace XYPlots } catch (Exception e) { - if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + if (!BaseLnSettings.blBaseLine) // B2026-056 suppress messages when running baseline. { MessageBox.Show(e.Message, String.Format("Error Closing {0}", FileName)); return false; @@ -459,7 +459,7 @@ namespace XYPlots char retval; StringBuilder Lbuff = new StringBuilder(); retval = NextChar(); - if (retval != '"' && retval != '\x1C' && BaseLnSettings.blBaseLine == false) // open double quote + if (retval != '"' && retval != '\x1C' && !BaseLnSettings.blBaseLine) // open double quote MessageBox.Show("Double Quote not found", "Syntax problem in XY Plot"); retval = NextChar(); while (retval != 0 && retval != '\n') @@ -1453,7 +1453,7 @@ namespace XYPlots } private void PrintStackError(string relation, int limit) { - if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + if (!BaseLnSettings.blBaseLine) // B2026-056 suppress messages when running baseline. { MessageBox.Show(String.Format("Position Stack Pointer {0} {1}", relation, limit.ToString()), "Print Stack Error"); } @@ -1674,7 +1674,7 @@ namespace XYPlots } private void err_exit(string msg, string msg2) { - if (BaseLnSettings.blBaseLine == false) // B2026-056 suppress messages when running baseline. + if (!BaseLnSettings.blBaseLine) // B2026-056 suppress messages when running baseline. { MessageBox.Show(msg + "\n" + msg2 + "\n\n This p=Process Will Terminate", "\n## ERROR ## - "); Environment.Exit(255); From 6a42800d2ce154f33b0794b4f8b131da2c1a8611 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Sun, 9 Aug 2026 22:54:27 -0400 Subject: [PATCH 47/49] B2026-056-Syntax-problem-in-XY-Plot --- PROMS/Volian.Base.Library/BaseLnSettings.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/PROMS/Volian.Base.Library/BaseLnSettings.cs b/PROMS/Volian.Base.Library/BaseLnSettings.cs index ba4da28f..a7380cbf 100644 --- a/PROMS/Volian.Base.Library/BaseLnSettings.cs +++ b/PROMS/Volian.Base.Library/BaseLnSettings.cs @@ -8,11 +8,6 @@ namespace Volian.Base.Library { public static class BaseLnSettings { - private static bool _blBaseLine = false; - public static bool blBaseLine - { - get { return _blBaseLine; } - set { _blBaseLine = value; } - } + public static bool blBaseLine { get; set; } = false; } } From 30b34c3a50dc10e6575174ae132383c5519c88ea Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 10 Aug 2026 10:02:16 -0400 Subject: [PATCH 48/49] B2026-056-Syntax-problem-in-XY-Plot --- PROMS/Volian.Base.Library/BaseLnSettings.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/PROMS/Volian.Base.Library/BaseLnSettings.cs b/PROMS/Volian.Base.Library/BaseLnSettings.cs index a7380cbf..f6589524 100644 --- a/PROMS/Volian.Base.Library/BaseLnSettings.cs +++ b/PROMS/Volian.Base.Library/BaseLnSettings.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - + namespace Volian.Base.Library { public static class BaseLnSettings { public static bool blBaseLine { get; set; } = false; } -} +} \ No newline at end of file From 18d2aa3b51c94292d0206662cc9f55c0acacf47e Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 10 Aug 2026 21:28:29 -0400 Subject: [PATCH 49/49] B2026-039-Error-sequence-contains-no-elements --- PROMS/Baseline/frmBaseline.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PROMS/Baseline/frmBaseline.cs b/PROMS/Baseline/frmBaseline.cs index 8551661e..e1ed4744 100644 --- a/PROMS/Baseline/frmBaseline.cs +++ b/PROMS/Baseline/frmBaseline.cs @@ -503,7 +503,7 @@ namespace Baseline string[] fileList = Directory.GetFiles(fi.DirectoryName, patern); // sort the list of file list Array.Sort((string[])fileList); - return fileList.First(); // the PDF file that we what should be top of the list then. + return fileList.FirstOrDefault(); // the PDF file that we what should be top of the list then. } ///