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/CAL2all.xml b/PROMS/Formats/fmtall/CAL2all.xml
index 87f3ee82..08b15d5e 100644
Binary files a/PROMS/Formats/fmtall/CAL2all.xml and b/PROMS/Formats/fmtall/CAL2all.xml differ
diff --git a/PROMS/Formats/fmtall/CPL_03all.xml b/PROMS/Formats/fmtall/CPL_03all.xml
index ed9f7660..568fe5f5 100644
Binary files a/PROMS/Formats/fmtall/CPL_03all.xml and b/PROMS/Formats/fmtall/CPL_03all.xml differ
diff --git a/PROMS/Formats/fmtall/CPL_04all.xml b/PROMS/Formats/fmtall/CPL_04all.xml
new file mode 100644
index 00000000..10e780a3
Binary files /dev/null and b/PROMS/Formats/fmtall/CPL_04all.xml differ
diff --git a/PROMS/Formats/fmtall/HLPall.xml b/PROMS/Formats/fmtall/HLPall.xml
index d4fa3919..591f5bde 100644
Binary files a/PROMS/Formats/fmtall/HLPall.xml and b/PROMS/Formats/fmtall/HLPall.xml differ
diff --git a/PROMS/Formats/fmtall/OHLPall.xml b/PROMS/Formats/fmtall/OHLPall.xml
index acb7e54e..16f8f7d7 100644
Binary files a/PROMS/Formats/fmtall/OHLPall.xml and b/PROMS/Formats/fmtall/OHLPall.xml differ
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..5209a3a7 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
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;
}
diff --git a/PROMS/Volian.Controls.Library/DisplayRO.cs b/PROMS/Volian.Controls.Library/DisplayRO.cs
index 35216fff..7c271a05 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,61 @@ 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)
+ {
+ 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 +687,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 +708,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
+ }
}
diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs
index b0dd922e..f30c8bb2 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
+#pragma warning disable IDE1006 // Naming Styles
+#pragma warning disable IDE0044 // Add readonly modifier
+ 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);
- }
+ PrintRequest?.Invoke(this, args);
+ }
private void OnSearchComplete(DisplaySearchEventArgs args)
{
- if (SearchComplete != null)
- SearchComplete(this, args);
- }
+ SearchComplete?.Invoke(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;
@@ -218,9 +218,11 @@ namespace Volian.Controls.Library
{
if (_TmrRefresh == null)
{
- _TmrRefresh = new Timer();
- _TmrRefresh.Interval = 1000;
- _TmrRefresh.Tick += _TmrRefresh_Tick;
+ _TmrRefresh = new Timer
+ {
+ Interval = 1000
+ };
+ _TmrRefresh.Tick += _TmrRefresh_Tick;
}
return _TmrRefresh;
}
@@ -324,8 +326,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)
@@ -336,23 +337,21 @@ 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"));
- }
- 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;
- }
- }
+ if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rodbi db)
+ {
+ return $"{_MyRODbID.ToString()}:{string.Format("{0}", db.dbiID.ToString("X4"))}";
+ }
+ else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild roch)
+ {
+ 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)}";
+ if (strRtnStr.EndsWith(","))
+ strRtnStr = strRtnStr.Substring(0, strRtnStr.Length - 1);
+ return strRtnStr;
+ }
+ }
}
}
return string.Empty;
@@ -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)
@@ -468,15 +452,22 @@ 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();
+
+ //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)
{
- 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);
@@ -501,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"))
{
@@ -556,41 +521,21 @@ 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)
- {
- 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;
@@ -616,13 +561,17 @@ namespace Volian.Controls.Library
dicSelectedFolderNodes.Clear();
}
}
- this.Cursor = Cursors.Default;
+
+ //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;
@@ -699,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
@@ -723,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);
@@ -826,12 +758,11 @@ 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)
- {
- CheckTreeNodeChildren(pnode.Nodes);
- }
- }
+ if (sender is DevComponents.AdvTree.Node pnode && pnode.HasChildNodes)
+ {
+ CheckTreeNodeChildren(pnode.Nodes);
+ }
+ }
public void advTreeProcSetsFillIn(bool blSeachTabClicked)
{
@@ -842,38 +773,45 @@ 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;
- advTreeProcSets.Nodes.Add(topnode);
- //advTreeProcSets.AfterNodeInsert += new TreeNodeCollectionEventHandler(advTreeProcSets_AfterNodeInsert);
+ topnode = new DevComponents.AdvTree.Node
+ {
+ Text = "Available Procedure Sets",
+ Tag = fi,
+ DataKey = fi.FolderID
+ };
+ advTreeProcSets.Nodes.Add(topnode);
- //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);
+ //B2023-076: Adding option to select all procedure sets
+ DevComponents.AdvTree.Node selectAllNode = new Node
+ {
+ Text = SelectAllProcedureSetsText,
+ Tag = SelectAllProcedureSetsText,
+ CheckBoxVisible = true
+ };
+ selectAllNode.NodeClick += new EventHandler(AllProcedureSets_clicked);
topnode.Nodes.Add(selectAllNode);
if (fi.SortedChildFolders != null)
{
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;
- AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected.
+ 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;
- newnode.Nodes.Add(tnt);
+ DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node
+ {
+ Text = DummyNodeText
+ };
+ newnode.Nodes.Add(tnt);
}
topnode.Nodes.Add(newnode);
}
@@ -881,11 +819,13 @@ namespace Volian.Controls.Library
}
else
{
- DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node();
- newnode.Text = fi.ToString();
- newnode.Tag = fi;
- newnode.DataKey = fi.FolderID;
- AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected.
+ 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);
buildSetToSearchPanelTitle();
@@ -895,9 +835,11 @@ namespace Volian.Controls.Library
{
cntnd++;
fi = Mydocversion.MyFolder;
- topnode = new DevComponents.AdvTree.Node();
- topnode.Text = fi.ToString();
- advTreeProcSets.Nodes.Add(topnode);
+ topnode = new DevComponents.AdvTree.Node
+ {
+ Text = fi.ToString()
+ };
+ advTreeProcSets.Nodes.Add(topnode);
topnode.Tag = fi;
topnode.DataKey = fi.FolderID;
}
@@ -931,32 +873,37 @@ 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;
- par.Nodes.Add(newnode);
+ 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)
+
+ 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:
- 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;
- }
- }
- }
+ 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 && !dicSelectedFolderNodes.ContainsKey(newnode))
+ dicSelectedFolderNodes.Add(newnode, false);
+ }
+
+ if (tabSearchTypes.SelectedTab == tabTranSearch)
+ {
+ //B2026-055 – Transition Search Improvements
+ //Update Enabling/Disabling of Tree Elements
+ TraverseTree(advTreeProcSets.Nodes[0], cbxTranVersion.Tag?.ToString().Split(','));
+ }
+ }
}
}
}
@@ -964,10 +911,10 @@ namespace Volian.Controls.Library
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));
@@ -976,10 +923,7 @@ 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();
}
}
@@ -990,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()));
@@ -1058,15 +1004,16 @@ 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);
- // 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);
+ 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
+ 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);
}
}
@@ -1114,10 +1061,12 @@ 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;
- AddCheckBox(chxbxvisable, newnode);//C2016-045 Allow Folders to be selected.
+ newnode = new DevComponents.AdvTree.Node
+ {
+ Text = nodetext,
+ Selectable = selectable
+ };
+ AddCheckBox(chxbxvisable, newnode);//C2016-045 Allow Folders to be selected.
return newnode;
}
@@ -1163,8 +1112,8 @@ namespace Volian.Controls.Library
// folder properties dialog
bool allowNonAdmin = IncTranCvtPerm();
List itmsEditable = new List(); // return this list
- int listCount = 0;
- if (all) // Check all in list
+ int listCount;
+ if (all) // Check all in list
{
listCount = _SearchResults.Count;
foreach (ItemInfo ii in _SearchResults)
@@ -1187,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;
}
@@ -1214,9 +1162,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
- List lbis = lbSrchResultsIncTrans.CheckedItems;
- List itmsEditable = TranCvtCheckPermission(false);
+ // First see if all selected can be converted, i.e. user has permission to edit
+ _ = lbSrchResultsIncTrans.CheckedItems;
+ List itmsEditable = TranCvtCheckPermission(false);
if (itmsEditable == null || itmsEditable.Count == 0) return;
TranCvtToTxt(itmsEditable);
fromTranCvtBtn = true;
@@ -1448,9 +1396,11 @@ namespace Volian.Controls.Library
{
ROFSTLookup.rodbi db = dbs[i];
- DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node(db.dbiTitle);
- tn.Tag = db;
- cmboTreeROs.Nodes.Add(tn);
+ DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node(db.dbiTitle)
+ {
+ Tag = db
+ };
+ cmboTreeROs.Nodes.Add(tn);
AddDummyGroup(db, tn);
}
@@ -1502,42 +1452,37 @@ 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;
+ ROFSTLookup.rochild[] chld;
+ if (tn.Tag is ROFSTLookup.rodbi db)
+ {
+ MyROFSTLookup.LoadChildren(ref db);
+ chld = db.children;
+ }
+ else if (tn.Tag is ROFSTLookup.rochild ch)
+ {
+ MyROFSTLookup.LoadChildren(ref ch);
+ chld = ch.children;
+ }
+ else
+ {
+ Console.WriteLine("error - no type");
+ return;
+ }
- if (tn.Tag is ROFSTLookup.rodbi)
- {
- ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag;
- 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;
- }
-
- // 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);
for (int i = 0; i < chld.Length; i++)
{
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 +1501,38 @@ namespace Volian.Controls.Library
}
- if (roc.value == null)
- {
- tmp = new DevComponents.AdvTree.Node(roc.title);
- tmp.Tag = roc;
+ Node tmp;
+ if (roc.value == null)
+ {
+ tmp = new DevComponents.AdvTree.Node(roc.title)
+ {
+ 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
- {
- tmp = new DevComponents.AdvTree.Node(roc.title);
- tmp.Tag = roc;
+ DevComponents.AdvTree.Node sub = new DevComponents.AdvTree.Node(DummyNodeText);
+ tmp.Nodes.Add(sub);
+ }
+ else
+ {
+ tmp = new DevComponents.AdvTree.Node(roc.title)
+ {
+ 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();
@@ -1610,19 +1560,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);
- }
+ else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild ro)
+ {
+ // 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
@@ -1634,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)
@@ -1824,26 +1768,24 @@ 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)
- {
- ItemBindingData ibd = lbi.Tag as ItemBindingData;
- ItemInfo ii = ibd.DataItem as ItemInfo;
- 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 (sender is ListBoxItem lbi)
+ {
+ ItemBindingData ibd = lbi.Tag as ItemBindingData;
+ bool allowNonAdmin = IncTranCvtPerm();
+ if (lbi.CheckState == CheckState.Checked && ibd.DataItem is ItemInfo ii)
+ {
+ 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)
{
@@ -2041,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;
@@ -2065,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);
@@ -2078,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'.
@@ -2116,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);
@@ -2131,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);
@@ -2140,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();
@@ -2155,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)
{
@@ -2177,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();
@@ -2249,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)
@@ -2319,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;
@@ -2449,8 +2378,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();
@@ -2469,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)
{
@@ -2520,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:
@@ -2567,9 +2495,11 @@ namespace Volian.Controls.Library
lstCheckedStepTypesStr.Clear();
foreach (string str in strs)
{
- Node newnode = new DevComponents.AdvTree.Node();
- newnode.Text = str;
- advTreeStepTypes.Nodes.Add(newnode);
+ Node newnode = new DevComponents.AdvTree.Node
+ {
+ Text = str
+ };
+ advTreeStepTypes.Nodes.Add(newnode);
}
buildStepTypePannelTitle();
}
@@ -2657,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");
- 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++)
+ if (!string.IsNullOrEmpty(vid))
{
- cbxTranFormat.Items.Add(new TransItem(ttl[i].TransMenu.Replace("?.", string.Empty), ttl[i].TransFormat.Replace("?.", string.Empty)));
- }
+ DocVersionInfo dvi = DocVersionInfo.Get(int.Parse(vid));
+ TransTypeList ttl = dvi.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList;
+
+
+ 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();
@@ -2717,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
}
}
@@ -2744,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
@@ -2874,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}
@@ -2946,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;
@@ -3145,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.
@@ -3179,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();
@@ -3202,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();
}
@@ -3298,8 +3227,8 @@ 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,9 +3405,49 @@ namespace Volian.Controls.Library
break;
}
}
- }
+ }
- private void btnCopySearchResults_Click(object sender, EventArgs e)
+ //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;
if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4]) myList = lbSrchResultsIncTrans.DataSource as ICollection;
@@ -3543,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)
{
@@ -3659,8 +3627,10 @@ namespace Volian.Controls.Library
}
}
}
+#pragma warning restore IDE1006 // Naming Styles
+#pragma warning restore IDE0044 // Add readonly modifier
- #endregion
+ #endregion
- public delegate void DisplaySearchEvent(object sender, DisplaySearchEventArgs args);
+ public delegate void DisplaySearchEvent(object sender, DisplaySearchEventArgs args);
}