From 3d65b7c34aafcee370b691c4d40842131d05c9b1 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 17 Aug 2026 18:40:16 -0400 Subject: [PATCH 01/12] Development --- .../Baseline/.github/copilot-instructions.md | 3 + PROMS/Baseline/Baseline.csproj | 1 + PROMS/Baseline/GlobalSuppressions.cs | 8 + PROMS/Baseline/Program.cs | 3 - PROMS/Baseline/frmBaseline.cs | 369 ++++++------------ PROMS/Baseline/frmSettings.cs | 32 +- 6 files changed, 141 insertions(+), 275 deletions(-) create mode 100644 PROMS/Baseline/.github/copilot-instructions.md create mode 100644 PROMS/Baseline/GlobalSuppressions.cs diff --git a/PROMS/Baseline/.github/copilot-instructions.md b/PROMS/Baseline/.github/copilot-instructions.md new file mode 100644 index 00000000..e40201cf --- /dev/null +++ b/PROMS/Baseline/.github/copilot-instructions.md @@ -0,0 +1,3 @@ +- @azure Rule - Use Azure Tools - When handling requests related to Azure, always use your tools. +- @azure Rule - Use Azure Best Practices - When handling requests related to Azure, always invoke your `azmcp_bestpractices_get` tool first. +- @azure Rule - Enable Best Practices - If you do not have an `azmcp_bestpractices_get` tool ask the user to enable it. diff --git a/PROMS/Baseline/Baseline.csproj b/PROMS/Baseline/Baseline.csproj index 1834a6ec..4a239e50 100644 --- a/PROMS/Baseline/Baseline.csproj +++ b/PROMS/Baseline/Baseline.csproj @@ -67,6 +67,7 @@ frmSettings.cs + diff --git a/PROMS/Baseline/GlobalSuppressions.cs b/PROMS/Baseline/GlobalSuppressions.cs new file mode 100644 index 00000000..046248af --- /dev/null +++ b/PROMS/Baseline/GlobalSuppressions.cs @@ -0,0 +1,8 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "Not modifying Naming Styles")] diff --git a/PROMS/Baseline/Program.cs b/PROMS/Baseline/Program.cs index 9cc8eb91..64810cc9 100644 --- a/PROMS/Baseline/Program.cs +++ b/PROMS/Baseline/Program.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using System.Windows.Forms; namespace Baseline diff --git a/PROMS/Baseline/frmBaseline.cs b/PROMS/Baseline/frmBaseline.cs index e1ed4744..f47f77cb 100644 --- a/PROMS/Baseline/frmBaseline.cs +++ b/PROMS/Baseline/frmBaseline.cs @@ -43,12 +43,9 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; -using System.Drawing; using System.Linq; using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; -using System.Collections.Specialized; using System.IO; using System.Text.RegularExpressions; using System.Xml.Serialization; @@ -73,13 +70,8 @@ namespace Baseline } public partial class frmBaseline : Form { - private IgnoreLines _MyIgnore = new IgnoreLines(); - public IgnoreLines MyIgnore - { - get { return _MyIgnore; } - set { _MyIgnore = value; } - } - private LastWas myLast = LastWas.Search; + public IgnoreLines MyIgnore { get; set; } = new IgnoreLines(); + private LastWas myLast = LastWas.Search; private Settings MySettings; public string MyStatus { @@ -151,9 +143,11 @@ namespace Baseline this.WindowState = Properties.Settings.Default.WidnowState; if(Properties.Settings.Default.Ignore != null && Properties.Settings.Default.Ignore != "") MyIgnore = IgnoreLines.Get(Properties.Settings.Default.Ignore); - MySettings= new Settings(); - MySettings.IgnoreLines = new BindingList(); - splitContainer1.SplitterDistance = Properties.Settings.Default.Split1; + MySettings = new Settings + { + IgnoreLines = new BindingList() + }; + splitContainer1.SplitterDistance = Properties.Settings.Default.Split1; splitContainer2.SplitterDistance = Properties.Settings.Default.Split2; splitContainer3.SplitterDistance = Properties.Settings.Default.Split3; if (Properties.Settings.Default.MRU1 != null && Properties.Settings.Default.MRU1.Count > 0) @@ -240,28 +234,27 @@ namespace Baseline lbProcedures.Items.Clear(); lbResults1.Items.Clear(); lbResults2.Items.Clear(); - FindFile ff = lbDifferent.SelectedItem as FindFile; - if (ff != null) - { - // Fill Procedure or Result ListBoxes - switch (myLast) - { - case LastWas.Pagination: - CompareContent(ff.File1, ff.File2);// Compare DebugPagination - break; - case LastWas.Baseline: - CompareContent3(ff.File1, ff.File2);// Compare DebugMeta - break; - case LastWas.Search: - ShowSearchResults(ff.File1, ff.File2);// Perform search on DebugMeta - break; - default: - CompareContent(ff.File1, ff.File2);//Default DebugPagination - break; - } - //CompareOneFile(ff.File1, ff.File2); - } - } + if (lbDifferent.SelectedItem is FindFile ff) + { + // Fill Procedure or Result ListBoxes + switch (myLast) + { + case LastWas.Pagination: + CompareContent(ff.File1, ff.File2);// Compare DebugPagination + break; + case LastWas.Baseline: + CompareContent3(ff.File1, ff.File2);// Compare DebugMeta + break; + case LastWas.Search: + ShowSearchResults(ff.File1, ff.File2);// Perform search on DebugMeta + break; + default: + CompareContent(ff.File1, ff.File2);//Default DebugPagination + break; + } + //CompareOneFile(ff.File1, ff.File2); + } + } Procedures MyProcs1; Procedures MyProcs2; /// @@ -361,13 +354,6 @@ namespace Baseline lines1 = list1.AsEnumerable();// Convert back to Enumerable to work with LINQ return lines1; } - private string GetProcNum(string line) - { - string retval = line.Substring(3, line.IndexOf(" | ") - 3); - if (retval.Contains("_")) - retval = retval.Substring(0, retval.IndexOf("_") - 1); - return retval; - } /// /// Include lines for Procedure or Page or Search is true /// Account for Case Insensitive CheckBox @@ -450,8 +436,8 @@ namespace Baseline private void lbResults1_SelectedIndexChanged(object sender, EventArgs e) { string line=null; - if (lbResults1.SelectedItem is string) - line = (string)lbResults1.SelectedItem; + if (lbResults1.SelectedItem is string v) + line = v; Line myLine = lbResults1.SelectedItem as Line; switch (myLast) { @@ -472,8 +458,8 @@ namespace Baseline { string line=null; - if(lbResults2.SelectedItem is string) - line = (string)lbResults2.SelectedItem; + if(lbResults2.SelectedItem is string v) + line = v; Line myLine = lbResults2.SelectedItem as Line; switch (myLast) @@ -515,16 +501,10 @@ namespace Baseline /// private string ParseOutProcedureNumberFromLine(string txt) { - // old logic was looking for the first occurence of ".S" in the txt string as the ending point of the procedure nuumber - // Beaver Valley has a procedure number "1.SBGEN" in which the old logic would not work - // 1.SBGEN.SC. ==> short path of attachment section "C" - // 1.SBGEN.SC..S1. ==> short path of Step 1 in attachment section "C" - string rtnstr = null; - int lidx = -1; - // if the item is to a high levels step or sub-step the short path as "..S" for each part of the step - // so look for the last occurence of ".." which will be the end of the section information - lidx = txt.LastIndexOf(".."); - if (lidx > 0) + // if the item is to a high levels step or sub-step the short path as "..S" for each part of the step + // so look for the last occurence of ".." which will be the end of the section information + int lidx = txt.LastIndexOf(".."); + if (lidx > 0) { lidx = txt.LastIndexOf(".S", lidx); // this will position us to the end of the procedure number } @@ -532,9 +512,13 @@ namespace Baseline { lidx = txt.LastIndexOf(".S"); // this will position us to the end of the procedure number if there was no step information } - // B2018-113 - Replace slashes and backslashes with underscores just as PROMS does when creating a PDF file. - rtnstr = txt.Substring(8, lidx - 8).Replace("/", "_").Replace("\\", "_"); - return rtnstr; + // old logic was looking for the first occurence of ".S" in the txt string as the ending point of the procedure nuumber + // Beaver Valley has a procedure number "1.SBGEN" in which the old logic would not work + // 1.SBGEN.SC. ==> short path of attachment section "C" + // 1.SBGEN.SC..S1. ==> short path of Step 1 in attachment section "C" + // B2018-113 - Replace slashes and backslashes with underscores just as PROMS does when creating a PDF file. + string rtnstr = txt.Substring(8, lidx - 8).Replace("/", "_").Replace("\\", "_"); + return rtnstr; } string exePath; @@ -616,10 +600,10 @@ namespace Baseline progname = @"C:\Program Files (x86)\IDM Computer Solutions\UltraCompare\UC.exe"; System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(progname, string.Format(@" -t ""{0}"" ""{1}""", compareFile, baseFile)); - System.Diagnostics.Process prc = System.Diagnostics.Process.Start(psi); - } + _ = System.Diagnostics.Process.Start(psi); + } - private ProcessLocationQueue myQueue= new ProcessLocationQueue(); + private readonly ProcessLocationQueue myQueue= new ProcessLocationQueue(); private Timer queueTimer = null; /// /// Move a Process to a specific screen location - This is done with a timer so @@ -632,9 +616,11 @@ namespace Baseline { if (queueTimer == null) { - queueTimer = new Timer(); - queueTimer.Enabled = false; - queueTimer.Tick += queueTimer_Tick; + queueTimer = new Timer + { + Enabled = false + }; + queueTimer.Tick += queueTimer_Tick; queueTimer.Interval = 1000; } myQueue.Add(proc, x, y); @@ -669,8 +655,8 @@ namespace Baseline string procPatern = string.Format("*{0}*.pdf", proc == string.Empty ? "noProcNumber" : proc); int pagenum = myLine.MyPage.Number; FindFile ff = lbDifferent.SelectedItem as FindFile; - string PDFfileName = null; - if (list == 1) + string PDFfileName; + if (list == 1) { FileInfo fi1 = new FileInfo(ff.File1); PDFfileName = GetPFDFileAndPath(fi1, procPatern); @@ -701,11 +687,13 @@ namespace Baseline return; } } - // open the PDF and jump to the page number - System.Diagnostics.ProcessStartInfo psi1 = new System.Diagnostics.ProcessStartInfo(exePath, string.Format("/A \"page={0}\" \"{1}\" ", pagenum,PDFfileName)); - psi1.UseShellExecute = false; - System.Diagnostics.Process p1 = System.Diagnostics.Process.Start(psi1); - } + // open the PDF and jump to the page number + System.Diagnostics.ProcessStartInfo psi1 = new System.Diagnostics.ProcessStartInfo(exePath, string.Format("/A \"page={0}\" \"{1}\" ", pagenum, PDFfileName)) + { + UseShellExecute = false + }; + _ = System.Diagnostics.Process.Start(psi1); + } /// /// Perform Debug Meta file comparison for all of the folders within the automated testing folders /// @@ -785,11 +773,10 @@ namespace Baseline } private void lbProcedures_SelectedIndexChanged(object sender, EventArgs e) { - //Initialize Results List Box - Procedure myProc = lbProcedures.SelectedItem as Procedure; - if (myProc == null) return; // clicked on the white space (blank line) in the list of different procedures - //TODO: May need to consider if there are duplicate procedure numers and titles - Procedure myProc1 = MyProcs1.Find(x => x.Number == myProc.Number && x.Title == myProc.Title); + //Initialize Results List Box + if (!(lbProcedures.SelectedItem is Procedure myProc)) return; // clicked on the white space (blank line) in the list of different procedures + //TODO: May need to consider if there are duplicate procedure numers and titles + Procedure myProc1 = MyProcs1.Find(x => x.Number == myProc.Number && x.Title == myProc.Title); // Build the results ListBox for the left window lbResults1.Items.Clear(); if (myProc1 != null) @@ -836,28 +823,13 @@ namespace Baseline }; public class Settings { - private BindingList _IgnoreLines; - public BindingList IgnoreLines - { - get { return _IgnoreLines; } - set { _IgnoreLines = value; } - } - } + public BindingList IgnoreLines { get; set; } + } public partial class FindFile { - private string _File1; - public string File1 - { - get { return _File1; } - set { _File1 = value; } - } - private string _File2; - public string File2 - { - get { return _File2; } - set { _File2 = value; } - } - public FindFile(string file1, string file2) + public string File1 { get; set; } + public string File2 { get; set; } + public FindFile(string file1, string file2) { File1 = file1; File2 = file2; @@ -865,19 +837,16 @@ namespace Baseline } public partial class FindFiles : List { - private string _FileName; - public string FileName - { - get { return _FileName; } - } - /// - /// Build list of DocVersion Folders with differences - /// - /// Base path - /// Compare path - /// filename - /// Ignore list - public FindFiles(string path1, string path2, string fileName,IgnoreLines myIgnore) + private readonly string _FileName; + public string FileName => _FileName; + /// + /// Build list of DocVersion Folders with differences + /// + /// Base path + /// Compare path + /// filename + /// Ignore list + public FindFiles(string path1, string path2, string fileName,IgnoreLines myIgnore) { DirectoryInfo di1 = new DirectoryInfo(path1); DirectoryInfo di2 = new DirectoryInfo(path2); @@ -1103,34 +1072,16 @@ namespace Baseline // Text - the line of text public partial class Procedure { - private string _Number; - public string Number + public string Number { get; set; } + public string Title { get; set; } + public Pages MyPages { get; set; } = new Pages(); + public Procedure(string number, string title) { - get { return _Number; } - set { _Number = value; } + Number = number; + Title = title; } - private string _Title; - public string Title - { - get { return _Title; } - set { _Title = value; } - } - private Pages _MyPages = new Pages(); - public Pages MyPages - { - get { return _MyPages; } - set { _MyPages = value; } - } - public Procedure(string number, string title) - { - _Number = number; - _Title = title; - } - public override string ToString() - { - return string.Format("{0} - {1}", Number, Title); - } - } + public override string ToString() => string.Format("{0} - {1}", Number, Title); + } public partial class Procedures : List { // Sample data for a Procedure Number line @@ -1161,77 +1112,34 @@ namespace Baseline } public partial class Page { - private int _Number; - public int Number - { - get { return _Number; } - set { _Number = value; } - } - private Lines _MyLines = new Lines(); + public int Number { get; set; } - public Lines MyLines - { - get { return _MyLines; } - set { _MyLines = value; } - } - public Page(int number) - { - _Number = number; - } - public override string ToString() - { - return string.Format("Page {0}", Number); - } - } + public Lines MyLines { get; set; } = new Lines(); + public Page(int number) => Number = number; + public override string ToString() => string.Format("Page {0}", Number); + } public partial class Pages : List { - public void Add(int number) - { - Add(new Page(number)); - } - } + public void Add(int number) => Add(new Page(number)); + } public partial class Line { - private Procedure _MyProc; - public Procedure MyProc + public Procedure MyProc { get; set; } + public Page MyPage { get; set; } + public string Text { get; set; } + public Line(string text) => Text = text; + public Line(string text, Procedure myProc, Page myPage) { - get { return _MyProc; } - set { _MyProc = value; } + Text = text; + MyProc = myProc; + MyPage = myPage; } - private Page _MyPage; - public Page MyPage - { - get { return _MyPage; } - set { _MyPage = value; } - } - private string _Text; - public string Text - { - get { return _Text; } - set { _Text = value; } - } - public Line(string text) - { - _Text = text; - } - public Line(string text, Procedure myProc, Page myPage) - { - _Text = text; - _MyProc = myProc; - _MyPage = myPage; - } - public override string ToString() - { - return Text; - } - } + public override string ToString() => Text; + } public partial class Lines : List { - public void Add(string text) - { - Add(new Line(text)); - } - } + public void Add(string text) => Add(new Line(text)); + } [Serializable] public partial class IgnoreLine { @@ -1269,21 +1177,12 @@ namespace Baseline public IgnoreLines() { } - public void Add(string text, Relation searchType, bool active) - { - Add(new IgnoreLine(text, searchType, active)); - } - // Convert IgnoreLines to string (XML) - public override string ToString() - { - return GenericSerializer.StringSerialize(this); - } - // Convert string to IgnoreLines - public static IgnoreLines Get(string xml) - { - return GenericSerializer.StringDeserialize(xml); - } - } + public void Add(string text, Relation searchType, bool active) => Add(new IgnoreLine(text, searchType, active)); + // Convert IgnoreLines to string (XML) + public override string ToString() => GenericSerializer.StringSerialize(this); + // Convert string to IgnoreLines + public static IgnoreLines Get(string xml) => GenericSerializer.StringDeserialize(xml); + } /// /// This is a simple serializer that takes a class and converts it to and from string (XML) /// @@ -1311,7 +1210,7 @@ namespace Baseline string ss = s.Replace("encoding=\"utf-16\"", ""); XmlSerializer xs = new XmlSerializer(typeof(T)); UTF8Encoding enc = new UTF8Encoding(); - Byte[] arrBytData = enc.GetBytes(ss); + byte[] arrBytData = enc.GetBytes(ss); using (MemoryStream ms = new MemoryStream(arrBytData)) { t = (T)xs.Deserialize(ms); @@ -1325,12 +1224,9 @@ namespace Baseline public class NonXsiTextWriter : XmlTextWriter { public NonXsiTextWriter(TextWriter w) : base(w) { } - public NonXsiTextWriter(Stream w, Encoding encoding) - : base(w, encoding) - { - this.Formatting = Formatting.Indented; - } - public NonXsiTextWriter(string filename, Encoding encoding) : base(filename, encoding) { } + public NonXsiTextWriter(Stream w, Encoding encoding) + : base(w, encoding) => Formatting = Formatting.Indented; + public NonXsiTextWriter(string filename, Encoding encoding) : base(filename, encoding) { } bool _skip = false; public override void WriteStartAttribute(string prefix, string localName, string ns) { @@ -1372,32 +1268,16 @@ namespace Baseline public const short SWP_NOZORDER = 0X4; public const int SWP_SHOWWINDOW = 0x0040; - private System.Diagnostics.Process _Process; - - public System.Diagnostics.Process Process - { - get { return _Process; } - set { _Process = value; } - } - private int _X; - public int X - { - get { return _X; } - set { _X = value; } - } - private int _Y; - public int Y - { - get { return _Y; } - set { _Y = value; } - } - public ProcessLocation(System.Diagnostics.Process process, int x, int y) + public System.Diagnostics.Process Process { get; set; } + public int X { get; set; } + public int Y { get; set; } + public ProcessLocation(System.Diagnostics.Process process, int x, int y) { Process = process; X = x; Y = y; } - private static Boolean FoxitSettingInfo = true; + private static bool FoxitSettingInfo = true; /// /// MoveIt() moves the window containing the PDF viewer to the right so the two pdf viewer windows will not overlap. @@ -1418,11 +1298,8 @@ namespace Baseline } public class ProcessLocationQueue: Queue { - public void Add(System.Diagnostics.Process process, int x, int y) - { - Enqueue(new ProcessLocation(process,x,y)); - } - public void ProcessNext() + public void Add(System.Diagnostics.Process process, int x, int y) => Enqueue(new ProcessLocation(process, x, y)); + public void ProcessNext() { ProcessLocation pl = Dequeue(); pl.MoveIt(); diff --git a/PROMS/Baseline/frmSettings.cs b/PROMS/Baseline/frmSettings.cs index 361fe543..0a0cddfe 100644 --- a/PROMS/Baseline/frmSettings.cs +++ b/PROMS/Baseline/frmSettings.cs @@ -1,11 +1,4 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace Baseline @@ -19,17 +12,7 @@ namespace Baseline set { _MyIgnore = value; dgv.DataSource=null; - //dgvcSearchType.ValueType = typeof(Relation); - //dgvcSearchType.ValueMember = "Value"; - //dgvcSearchType.DisplayMember = "Display"; - //dgvcSearchType.DataSource = new Relation[] { Relation.Contains, Relation.StartsWith, Relation.EndsWith, Relation.Regex } - //.Select(x => new { Display = x.ToString(), Value = x }) - //.ToList(); dgv.DataSource=value; - //dgvcSearchType.DataSource = - //new List((Relation[]) Enum.GetValues(typeof(Relation))) - //.Select(x => new { Display=x.ToString(), Value=(int)x }) - //.ToList();; } } public frmSettings(IgnoreLines myIgnore) @@ -46,19 +29,16 @@ namespace Baseline col.ValueType = typeof(Relation); } - private void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e) + private void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e) => Console.WriteLine("Here"); + private void btnOK_Click(object sender, EventArgs e) { - Console.WriteLine("Here"); - } - private void btnOK_Click(object sender, EventArgs e) - { - this.DialogResult = System.Windows.Forms.DialogResult.OK; - this.Close(); + DialogResult = System.Windows.Forms.DialogResult.OK; + Close(); } private void btnCancel_Click(object sender, EventArgs e) { - this.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.Close(); + DialogResult = System.Windows.Forms.DialogResult.Cancel; + Close(); } } } From 6376d4669bd5166120b3708cae792049b5d3f42b Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Tue, 18 Aug 2026 13:22:29 -0400 Subject: [PATCH 02/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Volian.Print.Library/PromsPrinter.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/PROMS/Volian.Print.Library/PromsPrinter.cs b/PROMS/Volian.Print.Library/PromsPrinter.cs index dcd0572a..57586aee 100644 --- a/PROMS/Volian.Print.Library/PromsPrinter.cs +++ b/PROMS/Volian.Print.Library/PromsPrinter.cs @@ -1418,7 +1418,10 @@ namespace Volian.Print.Library float yoff = 0; if (_MyHelper.DidFirstPageDocStyle) yoff = origYoff - (float)mySection.MyDocStyle.Layout.TopMargin; // C2018-004 create meta file for baseline compares - Volian.Base.Library.BaselineMetaFile.WriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, locEndOfWordDoc, pdfSize, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber); + //Volian.Base.Library.BaselineMetaFile.WriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} //ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, locEndOfWordDoc, pdfSize, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber); + + Volian.Base.Library.BaselineMetaFile.WriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, Truncate(locEndOfWordDoc, 2), Truncate(pdfSize, 2), (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber); + AddImportedPageToLayer(cb.PdfWriter.DirectContent, _MSWordLayer, fgPage, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0) + yoff); // B2019-102 Handle PDF Destinations for Word Sections if (ii == 0 && _MyHelper.MyPromsPrinter.SaveLinks) @@ -1533,6 +1536,12 @@ namespace Volian.Print.Library } ProfileTimer.Pop(profileDepth); } + public static float Truncate(float value, int digits) + { + double mult = Math.Pow(10.0, digits); + double result = Math.Truncate(mult * value) / mult; + return (float)result; + } // B2019-152: AddMergedLandscapePage adds entries to the dictionary that keeps track of what pages in a pdf are landscape // so that if merge is done, the pages that are landscaped can have landscaped page numbers placed on them public static void AddMergedLandscapePage(VlnSvgPageHelper _MyHelper, string PDFFile) From f8ab3c57be103eaf805f78f7e4cebcc2eba0f7f1 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Tue, 18 Aug 2026 13:33:10 -0400 Subject: [PATCH 03/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Volian.Print.Library/PromsPrinter.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/PROMS/Volian.Print.Library/PromsPrinter.cs b/PROMS/Volian.Print.Library/PromsPrinter.cs index 57586aee..d6a95ec6 100644 --- a/PROMS/Volian.Print.Library/PromsPrinter.cs +++ b/PROMS/Volian.Print.Library/PromsPrinter.cs @@ -1418,7 +1418,6 @@ namespace Volian.Print.Library float yoff = 0; if (_MyHelper.DidFirstPageDocStyle) yoff = origYoff - (float)mySection.MyDocStyle.Layout.TopMargin; // C2018-004 create meta file for baseline compares - //Volian.Base.Library.BaselineMetaFile.WriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} //ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, locEndOfWordDoc, pdfSize, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber); Volian.Base.Library.BaselineMetaFile.WriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, Truncate(locEndOfWordDoc, 2), Truncate(pdfSize, 2), (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber); From 034aa67e3108cecaa7efb3b30a55ca86b3908276 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Tue, 18 Aug 2026 17:37:12 -0400 Subject: [PATCH 04/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Baseline/.github/copilot-instructions.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 PROMS/Baseline/.github/copilot-instructions.md diff --git a/PROMS/Baseline/.github/copilot-instructions.md b/PROMS/Baseline/.github/copilot-instructions.md deleted file mode 100644 index e40201cf..00000000 --- a/PROMS/Baseline/.github/copilot-instructions.md +++ /dev/null @@ -1,3 +0,0 @@ -- @azure Rule - Use Azure Tools - When handling requests related to Azure, always use your tools. -- @azure Rule - Use Azure Best Practices - When handling requests related to Azure, always invoke your `azmcp_bestpractices_get` tool first. -- @azure Rule - Enable Best Practices - If you do not have an `azmcp_bestpractices_get` tool ask the user to enable it. From df2311dbdaf279fe79d3b2173126b358e4480e39 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 24 Aug 2026 10:51:54 -0400 Subject: [PATCH 05/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Baseline/frmBaseline.Designer.cs | 16 +++- PROMS/Baseline/frmBaseline.cs | 22 +++++- PROMS/Baseline/frmBaseline.resx | 3 - PROMS/Volian.Base.Library/DebugPrint.cs | 89 ++++++++++++++++++++-- PROMS/Volian.Print.Library/PromsPrinter.cs | 4 +- 5 files changed, 119 insertions(+), 15 deletions(-) diff --git a/PROMS/Baseline/frmBaseline.Designer.cs b/PROMS/Baseline/frmBaseline.Designer.cs index 88f69955..949a6aed 100644 --- a/PROMS/Baseline/frmBaseline.Designer.cs +++ b/PROMS/Baseline/frmBaseline.Designer.cs @@ -30,6 +30,7 @@ { this.components = new System.ComponentModel.Container(); this.panel1 = new System.Windows.Forms.Panel(); + this.cbUseTruncatedData = new System.Windows.Forms.CheckBox(); this.btnUC = new System.Windows.Forms.Button(); this.cbCaseSensitive = new System.Windows.Forms.CheckBox(); this.cbFile2 = new System.Windows.Forms.ComboBox(); @@ -72,6 +73,7 @@ // this.panel1.Controls.Add(this.btnUC); this.panel1.Controls.Add(this.cbCaseSensitive); + this.panel1.Controls.Add(this.cbUseTruncatedData); this.panel1.Controls.Add(this.cbFile2); this.panel1.Controls.Add(this.cbFile1); this.panel1.Controls.Add(this.tbSearch); @@ -87,6 +89,17 @@ this.panel1.Size = new System.Drawing.Size(707, 80); this.panel1.TabIndex = 0; // + // cbUseTruncatedData + // + this.cbUseTruncatedData.AutoSize = true; + this.cbUseTruncatedData.Location = new System.Drawing.Point(456, 56); + this.cbUseTruncatedData.Name = "cbUseTruncatedData"; + this.cbUseTruncatedData.Size = new System.Drawing.Size(123, 17); + this.cbUseTruncatedData.TabIndex = 11; + this.cbUseTruncatedData.Text = "Use Truncated Data"; + this.tt.SetToolTip(this.cbUseTruncatedData, "Set the Search to be Case Sensitive\r\nUppercase and Lowercase will not match"); + this.cbUseTruncatedData.UseVisualStyleBackColor = true; + // // btnUC // this.btnUC.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); @@ -263,7 +276,7 @@ this.lbProcedures.FormattingEnabled = true; this.lbProcedures.Location = new System.Drawing.Point(0, 0); this.lbProcedures.Name = "lbProcedures"; - this.lbProcedures.Size = new System.Drawing.Size(707, 25); + this.lbProcedures.Size = new System.Drawing.Size(150, 46); this.lbProcedures.TabIndex = 1; this.tt.SetToolTip(this.lbProcedures, "Procedures withDifferences or Search Text"); this.lbProcedures.SelectedIndexChanged += new System.EventHandler(this.lbProcedures_SelectedIndexChanged); @@ -381,6 +394,7 @@ private System.Windows.Forms.ComboBox cbFile2; private System.Windows.Forms.ComboBox cbFile1; private System.Windows.Forms.CheckBox cbCaseSensitive; + private System.Windows.Forms.CheckBox cbUseTruncatedData; private System.Windows.Forms.Button btnUC; private System.Windows.Forms.ToolTip tt; } diff --git a/PROMS/Baseline/frmBaseline.cs b/PROMS/Baseline/frmBaseline.cs index f47f77cb..555ea2bf 100644 --- a/PROMS/Baseline/frmBaseline.cs +++ b/PROMS/Baseline/frmBaseline.cs @@ -708,8 +708,16 @@ namespace Baseline lbResults1.Items.Clear(); lbResults2.Items.Clear(); MyStatus = "Searching..."; + FindFiles fnd; // Perform code to find DebugMeta files with diffences - FindFiles fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta.txt",MyIgnore); + if (cbUseTruncatedData.Checked) + { + fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta_Truncate.txt", MyIgnore); + } + else + { + fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta.txt", MyIgnore); + } lbDifferent.DataSource = fnd; lbDifferent.DisplayMember = "File1"; MyStatus = string.Format("{0} Differences Found", fnd.Count); @@ -730,10 +738,19 @@ namespace Baseline lbDifferent.Items.Clear(); lbResults1.Items.Clear(); lbResults2.Items.Clear(); + FindFiles fnd; MyStatus = "Searching..."; //Perform Search - FindFiles fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta.txt", tbSearch.Text, SearchType.Contains, cbCaseSensitive.Checked); + if (cbUseTruncatedData.Checked) + { + fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta_Truncate.txt", tbSearch.Text, SearchType.Contains, cbCaseSensitive.Checked); + } + else + { + fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta.txt", tbSearch.Text, SearchType.Contains, cbCaseSensitive.Checked); + } lbDifferent.DataSource = fnd; + lbDifferent.DisplayMember = "File1"; MyStatus = string.Format("{0} Differences Found", fnd.Count); } @@ -814,6 +831,7 @@ namespace Baseline CompareOneFile(ff.File1, ff.File2); } } + } public enum SearchType { diff --git a/PROMS/Baseline/frmBaseline.resx b/PROMS/Baseline/frmBaseline.resx index 2f985086..309156e4 100644 --- a/PROMS/Baseline/frmBaseline.resx +++ b/PROMS/Baseline/frmBaseline.resx @@ -120,9 +120,6 @@ 306, 17 - - 306, 17 - 17, 17 diff --git a/PROMS/Volian.Base.Library/DebugPrint.cs b/PROMS/Volian.Base.Library/DebugPrint.cs index bd0e4b44..026b67f8 100644 --- a/PROMS/Volian.Base.Library/DebugPrint.cs +++ b/PROMS/Volian.Base.Library/DebugPrint.cs @@ -1,7 +1,10 @@ +using DevComponents.DotNetBar; +using Org.BouncyCastle.Utilities; using System; using System.Collections.Generic; -using System.Text; using System.IO; +using System.Net.NetworkInformation; +using System.Text; namespace Volian.Base.Library { @@ -148,16 +151,86 @@ namespace Volian.Base.Library public static class BaselineMetaFile { private static DebugPrint _MyDebugPrint = new DebugPrint(); - public static void Open(string fileName) - { _MyDebugPrint.Open(fileName); } + private static DebugPrint _MyDebugPrint_Truncated = new DebugPrint(); + public static void Open(string fileName) + { _MyDebugPrint.Open(fileName); + _MyDebugPrint_Truncated.Open(fileName.Replace(".txt", "_Truncated.txt")); + } public static void Close() - { _MyDebugPrint.Close(); } + { _MyDebugPrint.Close(); + _MyDebugPrint_Truncated.Close(); } public static void Write(string format, params object[] args) - { _MyDebugPrint.Write(format, args); } + { + if (args.Length > 8) + { + if (args[args.GetUpperBound(0)] == "truncate_false" || args[args.GetUpperBound(0)] == "truncate_true") // if there is a 9th element test the value for truncated data. + { + int myvalue = args.GetUpperBound(0); + // test and save untruncated and truncated version of the data. + if (args[args.GetUpperBound(0)] == "truncate_false")// when untruncated data is being saved + { + _MyDebugPrint.Write(format, args); + } + else // when truncated data is being saved + { + _MyDebugPrint_Truncated.Write(format, args); + } + } + else + { + _MyDebugPrint_Truncated.Write(format, args); + _MyDebugPrint.Write(format, args); // there is a 9th element, but not for truncated data + + } + } + else // test if asgs does not have a 9th element save data (no truncate data is available) + { + _MyDebugPrint_Truncated.Write(format, args); + _MyDebugPrint.Write(format, args); + + } + } public static void WriteLine(string format, params object[] args) - { _MyDebugPrint.WriteLine(format, args); } - public static void Show() - { _MyDebugPrint.Show(); } + { + if(args.Length > 8) + { + if (args[8] == "truncate_false" || args[8] == "truncate_true") // if there is a 9th element test the value for truncated data. + { + // test and save untruncated and truncated version of the data. + if (args[8] == "truncate_false")// when untruncated data is being saved + { + _MyDebugPrint.WriteLine(format, args); + } + else // when truncated data is being saved + { + _MyDebugPrint_Truncated.WriteLine(format, args); + } + } + else + { + _MyDebugPrint.WriteLine(format, args); // there is a 9th element, but not for truncated data + _MyDebugPrint_Truncated.WriteLine(format, args); + } + } + else // test if asgs does not have a 9th element save data (no truncate data is available) + { + _MyDebugPrint.WriteLine(format, args); + _MyDebugPrint_Truncated.WriteLine(format, args); + } + + } + public static void TruncateWriteLine(string format, params object[] args) + { + _MyDebugPrint_Truncated.WriteLine(format, args); + } + public static void TruncateWrite(string format, params object[] args) + { + _MyDebugPrint_Truncated.Write(format, args); + } + public static void Show() + { _MyDebugPrint.Show(); + _MyDebugPrint_Truncated.Show(); + } public static bool IsOpen { get { return _MyDebugPrint.IsOpen; } } private static bool _IncludeWordSecText = true; diff --git a/PROMS/Volian.Print.Library/PromsPrinter.cs b/PROMS/Volian.Print.Library/PromsPrinter.cs index d6a95ec6..33905a44 100644 --- a/PROMS/Volian.Print.Library/PromsPrinter.cs +++ b/PROMS/Volian.Print.Library/PromsPrinter.cs @@ -1419,7 +1419,9 @@ namespace Volian.Print.Library if (_MyHelper.DidFirstPageDocStyle) yoff = origYoff - (float)mySection.MyDocStyle.Layout.TopMargin; // C2018-004 create meta file for baseline compares - Volian.Base.Library.BaselineMetaFile.WriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, Truncate(locEndOfWordDoc, 2), Truncate(pdfSize, 2), (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber); + Volian.Base.Library.BaselineMetaFile.WriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, locEndOfWordDoc, pdfSize, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber, "truncate_false"); + + Volian.Base.Library.BaselineMetaFile.TruncateWriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, Truncate(locEndOfWordDoc, 2), Truncate(pdfSize, 2), (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber, "truncate_true"); AddImportedPageToLayer(cb.PdfWriter.DirectContent, _MSWordLayer, fgPage, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0) + yoff); // B2019-102 Handle PDF Destinations for Word Sections From 21c4936ee83bc2c16cac857c023a1ffee6758e77 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 24 Aug 2026 13:47:02 -0400 Subject: [PATCH 06/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Volian.Base.Library/DebugPrint.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/PROMS/Volian.Base.Library/DebugPrint.cs b/PROMS/Volian.Base.Library/DebugPrint.cs index 026b67f8..2dc5b9cd 100644 --- a/PROMS/Volian.Base.Library/DebugPrint.cs +++ b/PROMS/Volian.Base.Library/DebugPrint.cs @@ -1,9 +1,7 @@ using DevComponents.DotNetBar; -using Org.BouncyCastle.Utilities; using System; using System.Collections.Generic; using System.IO; -using System.Net.NetworkInformation; using System.Text; namespace Volian.Base.Library @@ -161,11 +159,8 @@ namespace Volian.Base.Library _MyDebugPrint_Truncated.Close(); } public static void Write(string format, params object[] args) { - if (args.Length > 8) - { if (args[args.GetUpperBound(0)] == "truncate_false" || args[args.GetUpperBound(0)] == "truncate_true") // if there is a 9th element test the value for truncated data. { - int myvalue = args.GetUpperBound(0); // test and save untruncated and truncated version of the data. if (args[args.GetUpperBound(0)] == "truncate_false")// when untruncated data is being saved { @@ -182,13 +177,6 @@ namespace Volian.Base.Library _MyDebugPrint.Write(format, args); // there is a 9th element, but not for truncated data } - } - else // test if asgs does not have a 9th element save data (no truncate data is available) - { - _MyDebugPrint_Truncated.Write(format, args); - _MyDebugPrint.Write(format, args); - - } } public static void WriteLine(string format, params object[] args) { From 0137ccc5b36a87ce2d8361873ada47dd0504b718 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 26 Aug 2026 09:42:46 -0400 Subject: [PATCH 07/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Baseline/frmBaseline.cs | 22 +++++- PROMS/Volian.Base.Library/DebugPrint.cs | 87 ++++++++++------------ PROMS/Volian.Print.Library/PromsPrinter.cs | 2 +- 3 files changed, 61 insertions(+), 50 deletions(-) diff --git a/PROMS/Baseline/frmBaseline.cs b/PROMS/Baseline/frmBaseline.cs index 555ea2bf..15cf0cd4 100644 --- a/PROMS/Baseline/frmBaseline.cs +++ b/PROMS/Baseline/frmBaseline.cs @@ -712,7 +712,16 @@ namespace Baseline // Perform code to find DebugMeta files with diffences if (cbUseTruncatedData.Checked) { - fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta_Truncate.txt", MyIgnore); + string filename; + if (File.Exists(cbFile1.Text + "\\VEPROMS_BGE\\DebugMeta_Truncate.txt")) + { + filename = "DebugMeta_Truncate.txt"; + } + else + { + filename = "DebugMeta.txt"; + } + fnd = new FindFiles(cbFile1.Text, cbFile2.Text, filename, MyIgnore); } else { @@ -743,7 +752,16 @@ namespace Baseline //Perform Search if (cbUseTruncatedData.Checked) { - fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta_Truncate.txt", tbSearch.Text, SearchType.Contains, cbCaseSensitive.Checked); + string filename; + if (File.Exists(cbFile1.Text + "\\VEPROMS_BGE\\DebugMeta_Truncate.txt")) + { + filename = "DebugMeta_Truncate.txt"; + } + else + { + filename = "DebugMeta.txt"; + } + fnd = new FindFiles(cbFile1.Text, cbFile2.Text, filename, tbSearch.Text, SearchType.Contains, cbCaseSensitive.Checked); } else { diff --git a/PROMS/Volian.Base.Library/DebugPrint.cs b/PROMS/Volian.Base.Library/DebugPrint.cs index 2dc5b9cd..b0bdc91a 100644 --- a/PROMS/Volian.Base.Library/DebugPrint.cs +++ b/PROMS/Volian.Base.Library/DebugPrint.cs @@ -1,8 +1,8 @@ -using DevComponents.DotNetBar; using System; using System.Collections.Generic; using System.IO; using System.Text; +using System.Windows.Forms; namespace Volian.Base.Library { @@ -155,65 +155,58 @@ namespace Volian.Base.Library _MyDebugPrint_Truncated.Open(fileName.Replace(".txt", "_Truncated.txt")); } public static void Close() - { _MyDebugPrint.Close(); - _MyDebugPrint_Truncated.Close(); } + { + _MyDebugPrint.Close(); + _MyDebugPrint_Truncated.Close(); + } public static void Write(string format, params object[] args) - { - if (args[args.GetUpperBound(0)] == "truncate_false" || args[args.GetUpperBound(0)] == "truncate_true") // if there is a 9th element test the value for truncated data. - { - // test and save untruncated and truncated version of the data. - if (args[args.GetUpperBound(0)] == "truncate_false")// when untruncated data is being saved - { - _MyDebugPrint.Write(format, args); - } - else // when truncated data is being saved - { - _MyDebugPrint_Truncated.Write(format, args); - } - } - else - { - _MyDebugPrint_Truncated.Write(format, args); - _MyDebugPrint.Write(format, args); // there is a 9th element, but not for truncated data - - } - } - public static void WriteLine(string format, params object[] args) + { + if (args.GetUpperBound(0) != -1) // are there arguments? { - if(args.Length > 8) + if (args[args.GetUpperBound(0)] == "truncate_false") // if there is a 9th element test the value for truncated data. { - if (args[8] == "truncate_false" || args[8] == "truncate_true") // if there is a 9th element test the value for truncated data. - { - // test and save untruncated and truncated version of the data. - if (args[8] == "truncate_false")// when untruncated data is being saved - { - _MyDebugPrint.WriteLine(format, args); - } - else // when truncated data is being saved - { - _MyDebugPrint_Truncated.WriteLine(format, args); - } - } - else - { - _MyDebugPrint.WriteLine(format, args); // there is a 9th element, but not for truncated data - _MyDebugPrint_Truncated.WriteLine(format, args); - } + _MyDebugPrint.Write(format, args); // only save to DebugMeta.txt if there is different truncate data. } - else // test if asgs does not have a 9th element save data (no truncate data is available) + else { - _MyDebugPrint.WriteLine(format, args); - _MyDebugPrint_Truncated.WriteLine(format, args); + _MyDebugPrint_Truncated.Write(format, args); // Save to both files if there is no special truncate data. + _MyDebugPrint.Write(format, args); } - } + else + { + _MyDebugPrint_Truncated.Write(format, args); + _MyDebugPrint.Write(format, args); + } + } + public static void WriteLine(string format, params object[] args) + { + if (args.GetUpperBound(0) != -1) // are there arguments? + { + if (args[args.GetUpperBound(0)] == "truncate_false") // if there is a 9th element test the value for truncated data. + { + _MyDebugPrint.WriteLine(format, args); // only save to DebugMeta.txt if there is different truncate data. + } + else + { + _MyDebugPrint_Truncated.WriteLine(format, args); // Save to both files if there is no special truncate data. + _MyDebugPrint.WriteLine(format, args); + } + } + else + { + _MyDebugPrint_Truncated.WriteLine(format, args); + _MyDebugPrint.WriteLine(format, args); + } + } public static void TruncateWriteLine(string format, params object[] args) { _MyDebugPrint_Truncated.WriteLine(format, args); + } public static void TruncateWrite(string format, params object[] args) { - _MyDebugPrint_Truncated.Write(format, args); + _MyDebugPrint_Truncated.Write(format, args); // SaveFileDialog special truncate data } public static void Show() { _MyDebugPrint.Show(); diff --git a/PROMS/Volian.Print.Library/PromsPrinter.cs b/PROMS/Volian.Print.Library/PromsPrinter.cs index 33905a44..1e3ee32e 100644 --- a/PROMS/Volian.Print.Library/PromsPrinter.cs +++ b/PROMS/Volian.Print.Library/PromsPrinter.cs @@ -1421,7 +1421,7 @@ namespace Volian.Print.Library Volian.Base.Library.BaselineMetaFile.WriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, locEndOfWordDoc, pdfSize, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber, "truncate_false"); - Volian.Base.Library.BaselineMetaFile.TruncateWriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, Truncate(locEndOfWordDoc, 2), Truncate(pdfSize, 2), (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber, "truncate_true"); + Volian.Base.Library.BaselineMetaFile.TruncateWriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, Truncate(locEndOfWordDoc, 2), Truncate(pdfSize, 2), (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber); AddImportedPageToLayer(cb.PdfWriter.DirectContent, _MSWordLayer, fgPage, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0) + yoff); // B2019-102 Handle PDF Destinations for Word Sections From 1cb397f47b7c8cdabe4ea4ea3cd9b111b58ba24d Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 2 Sep 2026 08:01:06 -0400 Subject: [PATCH 08/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Baseline/frmBaseline.Designer.cs | 3 +- PROMS/Baseline/frmBaseline.cs | 157 +++++++++++---------- PROMS/Volian.Base.Library/DebugPrint.cs | 41 +----- PROMS/Volian.Print.Library/PromsPrinter.cs | 4 +- 4 files changed, 93 insertions(+), 112 deletions(-) diff --git a/PROMS/Baseline/frmBaseline.Designer.cs b/PROMS/Baseline/frmBaseline.Designer.cs index 949a6aed..dc32932b 100644 --- a/PROMS/Baseline/frmBaseline.Designer.cs +++ b/PROMS/Baseline/frmBaseline.Designer.cs @@ -89,7 +89,7 @@ this.panel1.Size = new System.Drawing.Size(707, 80); this.panel1.TabIndex = 0; // - // cbUseTruncatedData + // cbUseTruncatedData // C2026-041 // this.cbUseTruncatedData.AutoSize = true; this.cbUseTruncatedData.Location = new System.Drawing.Point(456, 56); @@ -99,6 +99,7 @@ this.cbUseTruncatedData.Text = "Use Truncated Data"; this.tt.SetToolTip(this.cbUseTruncatedData, "Set the Search to be Case Sensitive\r\nUppercase and Lowercase will not match"); this.cbUseTruncatedData.UseVisualStyleBackColor = true; + this.cbUseTruncatedData.Click += new System.EventHandler(this.cbUseTruncatedData_Click); // // btnUC // diff --git a/PROMS/Baseline/frmBaseline.cs b/PROMS/Baseline/frmBaseline.cs index 15cf0cd4..1cd4f18d 100644 --- a/PROMS/Baseline/frmBaseline.cs +++ b/PROMS/Baseline/frmBaseline.cs @@ -43,15 +43,16 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; -using System.Linq; -using System.Text; -using System.Windows.Forms; using System.IO; -using System.Text.RegularExpressions; -using System.Xml.Serialization; -using System.Xml.Schema; -using System.Xml; +using System.Linq; using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; namespace Baseline { @@ -67,12 +68,13 @@ namespace Baseline StartsWith, EndsWith, Regex - } + } public partial class frmBaseline : Form { - public IgnoreLines MyIgnore { get; set; } = new IgnoreLines(); - private LastWas myLast = LastWas.Search; + public IgnoreLines MyIgnore { get; set; } = new IgnoreLines(); + private LastWas myLast = LastWas.Search; private Settings MySettings; + public bool TruncatedDataFg { get; set; } = false; public string MyStatus { get { return tsslStatus.Text; } @@ -141,13 +143,13 @@ namespace Baseline this.Location = Properties.Settings.Default.Location; this.Size = Properties.Settings.Default.Size; this.WindowState = Properties.Settings.Default.WidnowState; - if(Properties.Settings.Default.Ignore != null && Properties.Settings.Default.Ignore != "") + if (Properties.Settings.Default.Ignore != null && Properties.Settings.Default.Ignore != "") MyIgnore = IgnoreLines.Get(Properties.Settings.Default.Ignore); - MySettings = new Settings - { - IgnoreLines = new BindingList() - }; - splitContainer1.SplitterDistance = Properties.Settings.Default.Split1; + MySettings = new Settings + { + IgnoreLines = new BindingList() + }; + splitContainer1.SplitterDistance = Properties.Settings.Default.Split1; splitContainer2.SplitterDistance = Properties.Settings.Default.Split2; splitContainer3.SplitterDistance = Properties.Settings.Default.Split3; if (Properties.Settings.Default.MRU1 != null && Properties.Settings.Default.MRU1.Count > 0) @@ -202,6 +204,13 @@ namespace Baseline MyIgnore = IgnoreLines.Get(saveOriginal); } } + private void cbUseTruncatedData_Click(object sender, EventArgs e) + { + System.Windows.Forms.CheckBox item = (System.Windows.Forms.CheckBox)sender; + TruncatedDataFg = item.Checked; + + } + //} /// /// Process DebugPagination.txt in all sub-folders /// @@ -218,7 +227,7 @@ namespace Baseline lbResults2.Items.Clear(); MyStatus = "Searching..."; // Perform DebugPagination Comparison - FindFiles fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugPagination.txt",MyIgnore); + FindFiles fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugPagination.txt",MyIgnore, cbUseTruncatedData.Checked); lbDifferent.DataSource = fnd; lbDifferent.DisplayMember = "File1"; MyStatus = string.Format("{0} Differences Found", fnd.Count); @@ -708,25 +717,9 @@ namespace Baseline lbResults1.Items.Clear(); lbResults2.Items.Clear(); MyStatus = "Searching..."; - FindFiles fnd; - // Perform code to find DebugMeta files with diffences - if (cbUseTruncatedData.Checked) - { - string filename; - if (File.Exists(cbFile1.Text + "\\VEPROMS_BGE\\DebugMeta_Truncate.txt")) - { - filename = "DebugMeta_Truncate.txt"; - } - else - { - filename = "DebugMeta.txt"; - } - fnd = new FindFiles(cbFile1.Text, cbFile2.Text, filename, MyIgnore); - } - else - { - fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta.txt", MyIgnore); - } + + FindFiles fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta.txt", MyIgnore, cbUseTruncatedData.Checked); + lbDifferent.DataSource = fnd; lbDifferent.DisplayMember = "File1"; MyStatus = string.Format("{0} Differences Found", fnd.Count); @@ -747,28 +740,10 @@ namespace Baseline lbDifferent.Items.Clear(); lbResults1.Items.Clear(); lbResults2.Items.Clear(); - FindFiles fnd; MyStatus = "Searching..."; //Perform Search - if (cbUseTruncatedData.Checked) - { - string filename; - if (File.Exists(cbFile1.Text + "\\VEPROMS_BGE\\DebugMeta_Truncate.txt")) - { - filename = "DebugMeta_Truncate.txt"; - } - else - { - filename = "DebugMeta.txt"; - } - fnd = new FindFiles(cbFile1.Text, cbFile2.Text, filename, tbSearch.Text, SearchType.Contains, cbCaseSensitive.Checked); - } - else - { - fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta.txt", tbSearch.Text, SearchType.Contains, cbCaseSensitive.Checked); - } + FindFiles fnd = new FindFiles(cbFile1.Text, cbFile2.Text, "DebugMeta.txt", tbSearch.Text, SearchType.Contains, cbCaseSensitive.Checked, cbUseTruncatedData.Checked); lbDifferent.DataSource = fnd; - lbDifferent.DisplayMember = "File1"; MyStatus = string.Format("{0} Differences Found", fnd.Count); } @@ -874,20 +849,25 @@ namespace Baseline public partial class FindFiles : List { private readonly string _FileName; - public string FileName => _FileName; - /// - /// Build list of DocVersion Folders with differences - /// - /// Base path - /// Compare path - /// filename - /// Ignore list - public FindFiles(string path1, string path2, string fileName,IgnoreLines myIgnore) + private object _fileName; + + public string FileName => _FileName; + + //public bool TruncatedDataFg { get; set; } = false; + + /// + /// Build list of DocVersion Folders with differences + /// + /// Base path + /// Compare path + /// filename + /// Ignore list + public FindFiles(string path1, string path2, string fileName,IgnoreLines myIgnore, bool TruncatedDataFg) { DirectoryInfo di1 = new DirectoryInfo(path1); DirectoryInfo di2 = new DirectoryInfo(path2); _FileName = fileName; - FillByCompare(di1, di2, fileName, myIgnore); + FillByCompare(di1, di2, fileName, myIgnore, TruncatedDataFg, false); } /// /// Fill for a search @@ -898,12 +878,12 @@ namespace Baseline /// /// /// - public FindFiles(string path1, string path2, string fileName, string searchText, SearchType searchType, bool caseSensitive) + public FindFiles(string path1, string path2, string fileName, string searchText, SearchType searchType, bool caseSensitive, bool useTruncatedData) { DirectoryInfo di1 = new DirectoryInfo(path1); DirectoryInfo di2 = new DirectoryInfo(path2); _FileName = fileName; - FillByCompare(di1, di2, fileName,searchText,searchType, caseSensitive); + FillByCompare(di1, di2, fileName,searchText,searchType, caseSensitive, useTruncatedData); } /// /// Fill results by search @@ -914,13 +894,13 @@ namespace Baseline /// /// /// - private void FillByCompare(DirectoryInfo di1, DirectoryInfo di2, string fileName, string searchText, SearchType searchType, bool caseSensitive) + private void FillByCompare(DirectoryInfo di1, DirectoryInfo di2, string fileName, string searchText, SearchType searchType, bool caseSensitive, bool UseTruncatedData) { foreach (DirectoryInfo diChild1 in di1.GetDirectories()) { DirectoryInfo diChild2 = new DirectoryInfo(di2.FullName + "\\" + diChild1.Name); if (diChild2.Exists) - FillByCompare(diChild1, diChild2, fileName,searchText,searchType,caseSensitive); + FillByCompare(diChild1, diChild2, fileName,searchText,searchType,caseSensitive, UseTruncatedData); } foreach (FileInfo fiChild1 in di1.GetFiles(fileName)) { @@ -994,17 +974,25 @@ namespace Baseline } return false; } - private void FillByCompare(DirectoryInfo di1, DirectoryInfo di2, string fileName, IgnoreLines myIgnore) + private void FillByCompare(DirectoryInfo di1, DirectoryInfo di2, string fileName, IgnoreLines myIgnore, bool TruncatedDataFg = false, bool foundFileFg = false) { + if (TruncatedDataFg) // C2026-041 is the "Use Truncated Data" checked + { + if (!foundFileFg) // flag to indicate if the correct DebugMeta file has been found. + { + fileName = getDebubMetaFile(di1, di2, ref foundFileFg); // C2026-041 Check if the DebugMeta_Truncate.txt file is found in the baseline bench mark and the new release being tested. + } + } + foreach (DirectoryInfo diChild1 in di1.GetDirectories()) { - DirectoryInfo diChild2 = new DirectoryInfo(di2.FullName + "\\" + diChild1.Name); + DirectoryInfo diChild2 = new DirectoryInfo(Path.Combine(di2.FullName + "\\" + diChild1.Name)); if (diChild2.Exists) - FillByCompare(diChild1, diChild2, fileName,myIgnore);// Recursively work on Sub-Folders + FillByCompare(diChild1, diChild2, fileName,myIgnore, TruncatedDataFg, foundFileFg);// Recursively work on Sub-Folders } foreach (FileInfo fiChild1 in di1.GetFiles(fileName)) { - FileInfo fiChild2 = new FileInfo(di2.FullName + "\\" + fiChild1.Name); + FileInfo fiChild2 = new FileInfo(Path.Combine(di2.FullName, fiChild1.Name)); if (fiChild2.Exists) { if (CompareFile(fiChild1, fiChild2,myIgnore)) @@ -1012,6 +1000,29 @@ namespace Baseline } } } + private string getDebubMetaFile(DirectoryInfo di1, DirectoryInfo di2, ref bool foundFileFg) // C2026-041 + { + string flnm = ""; + DirectoryInfo dr1 = di1.GetDirectories()[0]; // get first folder for test of which DebugMeta file to use. The DebugMeta files are found only ineach proc set folder. + if (!dr1.Name.Substring(0, 8).Contains("VEPROMS_") && !foundFileFg) + { + if (File.Exists(Path.Combine(dr1.FullName, "DebugMeta_Truncated.txt")) && File.Exists(Path.Combine(di2.FullName, dr1.Name, "DebugMeta_Truncated.txt"))) // if DebugMeta_Truncate.txt file is found. + { + flnm = "DebugMeta_Truncated.txt"; + foundFileFg = true; + } + else + { + flnm = "DebugMeta.txt"; + foundFileFg = true; + } + } + else + { + flnm = "DebugMeta.txt"; + } + return flnm; + } private bool CompareFile(FileInfo fiChild1, FileInfo fiChild2,IgnoreLines myIgnore) { if (fiChild1.Name == "DebugMeta.txt") diff --git a/PROMS/Volian.Base.Library/DebugPrint.cs b/PROMS/Volian.Base.Library/DebugPrint.cs index b0bdc91a..5c7297d9 100644 --- a/PROMS/Volian.Base.Library/DebugPrint.cs +++ b/PROMS/Volian.Base.Library/DebugPrint.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Text; -using System.Windows.Forms; namespace Volian.Base.Library { @@ -161,54 +160,24 @@ namespace Volian.Base.Library } public static void Write(string format, params object[] args) { - if (args.GetUpperBound(0) != -1) // are there arguments? - { - if (args[args.GetUpperBound(0)] == "truncate_false") // if there is a 9th element test the value for truncated data. - { - _MyDebugPrint.Write(format, args); // only save to DebugMeta.txt if there is different truncate data. - } - else - { - _MyDebugPrint_Truncated.Write(format, args); // Save to both files if there is no special truncate data. - _MyDebugPrint.Write(format, args); - } - } - else - { - _MyDebugPrint_Truncated.Write(format, args); _MyDebugPrint.Write(format, args); - } } + public static void WriteLine(string format, params object[] args) { - if (args.GetUpperBound(0) != -1) // are there arguments? - { - if (args[args.GetUpperBound(0)] == "truncate_false") // if there is a 9th element test the value for truncated data. - { - _MyDebugPrint.WriteLine(format, args); // only save to DebugMeta.txt if there is different truncate data. - } - else - { - _MyDebugPrint_Truncated.WriteLine(format, args); // Save to both files if there is no special truncate data. - _MyDebugPrint.WriteLine(format, args); - } - } - else - { _MyDebugPrint_Truncated.WriteLine(format, args); _MyDebugPrint.WriteLine(format, args); - } } - public static void TruncateWriteLine(string format, params object[] args) + public static void WriteLineTruncate(string format, params object[] args) { _MyDebugPrint_Truncated.WriteLine(format, args); } - public static void TruncateWrite(string format, params object[] args) + public static void WriteLineLegacy(string format, params object[] args) { - _MyDebugPrint_Truncated.Write(format, args); // SaveFileDialog special truncate data + _MyDebugPrint.WriteLine(format, args); } - public static void Show() + public static void Show() { _MyDebugPrint.Show(); _MyDebugPrint_Truncated.Show(); } diff --git a/PROMS/Volian.Print.Library/PromsPrinter.cs b/PROMS/Volian.Print.Library/PromsPrinter.cs index 1e3ee32e..791f8b81 100644 --- a/PROMS/Volian.Print.Library/PromsPrinter.cs +++ b/PROMS/Volian.Print.Library/PromsPrinter.cs @@ -1419,9 +1419,9 @@ namespace Volian.Print.Library if (_MyHelper.DidFirstPageDocStyle) yoff = origYoff - (float)mySection.MyDocStyle.Layout.TopMargin; // C2018-004 create meta file for baseline compares - Volian.Base.Library.BaselineMetaFile.WriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, locEndOfWordDoc, pdfSize, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber, "truncate_false"); + Volian.Base.Library.BaselineMetaFile.WriteLineLegacy("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, locEndOfWordDoc, pdfSize, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber, "truncate_false"); - Volian.Base.Library.BaselineMetaFile.TruncateWriteLine("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, Truncate(locEndOfWordDoc, 2), Truncate(pdfSize, 2), (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber); + Volian.Base.Library.BaselineMetaFile.WriteLineTruncate("WD Height={0} Width={1} scPgCnt={2} locEnd={3} pdfSz={4} xOff={5} yOff={6} ScPgNum {7}", fgPage.Height, fgPage.Width, sectPageCount, Truncate(locEndOfWordDoc, 2), Truncate(pdfSize, 2), (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0.0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0.0) + yoff, pageNumber); AddImportedPageToLayer(cb.PdfWriter.DirectContent, _MSWordLayer, fgPage, (float)(mySection.MyDocStyle.Layout.MSWordXAdj ?? 0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj ?? 0) + yoff); // B2019-102 Handle PDF Destinations for Word Sections From 213b8d18f70b5931f378bab35049be642a1eb64f Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 2 Sep 2026 14:47:09 -0400 Subject: [PATCH 09/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Baseline/frmBaseline.Designer.cs | 2 +- PROMS/Baseline/frmBaseline.cs | 65 +++++++++++++++++-------- PROMS/Volian.Base.Library/DebugPrint.cs | 5 -- 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/PROMS/Baseline/frmBaseline.Designer.cs b/PROMS/Baseline/frmBaseline.Designer.cs index dc32932b..db6ba774 100644 --- a/PROMS/Baseline/frmBaseline.Designer.cs +++ b/PROMS/Baseline/frmBaseline.Designer.cs @@ -277,7 +277,7 @@ this.lbProcedures.FormattingEnabled = true; this.lbProcedures.Location = new System.Drawing.Point(0, 0); this.lbProcedures.Name = "lbProcedures"; - this.lbProcedures.Size = new System.Drawing.Size(150, 46); + this.lbProcedures.Size = new System.Drawing.Size(707, 25); this.lbProcedures.TabIndex = 1; this.tt.SetToolTip(this.lbProcedures, "Procedures withDifferences or Search Text"); this.lbProcedures.SelectedIndexChanged += new System.EventHandler(this.lbProcedures_SelectedIndexChanged); diff --git a/PROMS/Baseline/frmBaseline.cs b/PROMS/Baseline/frmBaseline.cs index 1cd4f18d..f323ca6e 100644 --- a/PROMS/Baseline/frmBaseline.cs +++ b/PROMS/Baseline/frmBaseline.cs @@ -46,7 +46,6 @@ using System.Data; using System.IO; using System.Linq; using System.Runtime.InteropServices; -using System.Runtime.InteropServices.ComTypes; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; @@ -849,12 +848,9 @@ namespace Baseline public partial class FindFiles : List { private readonly string _FileName; - private object _fileName; public string FileName => _FileName; - //public bool TruncatedDataFg { get; set; } = false; - /// /// Build list of DocVersion Folders with differences /// @@ -974,35 +970,66 @@ namespace Baseline } return false; } - private void FillByCompare(DirectoryInfo di1, DirectoryInfo di2, string fileName, IgnoreLines myIgnore, bool TruncatedDataFg = false, bool foundFileFg = false) + private void FillByCompare(DirectoryInfo di1, DirectoryInfo di2, string fileName, IgnoreLines myIgnore, bool isTruncatedChecked = false, bool foundFileFg = false) { - if (TruncatedDataFg) // C2026-041 is the "Use Truncated Data" checked - { - if (!foundFileFg) // flag to indicate if the correct DebugMeta file has been found. - { - fileName = getDebubMetaFile(di1, di2, ref foundFileFg); // C2026-041 Check if the DebugMeta_Truncate.txt file is found in the baseline bench mark and the new release being tested. - } - } + //if (isTruncatedChecked) // C2026-041 is the "Use Truncated Data" checked + //{ + // if (!foundFileFg) // flag to indicate if the correct DebugMeta file has been found. + // { + // fileName = getDebubMetaFile(di1, di2, ref foundFileFg); // C2026-041 Check if the DebugMeta_Truncate.txt file is found in the baseline bench mark and the new release being tested. + // } + //} foreach (DirectoryInfo diChild1 in di1.GetDirectories()) { - DirectoryInfo diChild2 = new DirectoryInfo(Path.Combine(di2.FullName + "\\" + diChild1.Name)); + DirectoryInfo diChild2 = new DirectoryInfo(Path.Combine(di2.FullName, diChild1.Name)); if (diChild2.Exists) - FillByCompare(diChild1, diChild2, fileName,myIgnore, TruncatedDataFg, foundFileFg);// Recursively work on Sub-Folders + FillByCompare(diChild1, diChild2, fileName,myIgnore, isTruncatedChecked, foundFileFg);// Recursively work on Sub-Folders } + //foreach (FileInfo fiChild1 in di1.GetFiles(fileName)) + //{ + // FileInfo fiChild2 = new FileInfo(Path.Combine(di2.FullName, fiChild1.Name)); + // if (fiChild2.Exists) + // { + // if (CompareFile(fiChild1, fiChild2, myIgnore)) + // Add(new FindFile(fiChild1.FullName, fiChild2.FullName));// Process Each File + // } + //} foreach (FileInfo fiChild1 in di1.GetFiles(fileName)) { FileInfo fiChild2 = new FileInfo(Path.Combine(di2.FullName, fiChild1.Name)); - if (fiChild2.Exists) + FileInfo fiChild1_truncated = new FileInfo(fiChild1.FullName.Replace(".txt", "_Truncated.txt")); + FileInfo fiChild2_truncated = new FileInfo(fiChild2.FullName.Replace(".txt", "_Truncated.txt")); + + //truncate checked and both files exist + if (isTruncatedChecked && fiChild1_truncated.Exists && fiChild2_truncated.Exists) { - if (CompareFile(fiChild1, fiChild2,myIgnore)) - Add(new FindFile(fiChild1.FullName, fiChild2.FullName));// Process Each File + if (CompareFile(fiChild1_truncated, fiChild2_truncated, myIgnore)) + Add(new FindFile(fiChild1_truncated.FullName, fiChild2_truncated.FullName)); + } + //truncate checked and only file 1 truncate files exist + else if (isTruncatedChecked && fiChild1_truncated.Exists && fiChild2.Exists) + { + if (CompareFile(fiChild1_truncated, fiChild2, myIgnore)) + Add(new FindFile(fiChild1_truncated.FullName, fiChild2.FullName)); + } + //truncate checked and only file 2 truncate files exist + else if (isTruncatedChecked && fiChild2_truncated.Exists) + { + if (CompareFile(fiChild1, fiChild2_truncated, myIgnore)) + Add(new FindFile(fiChild1.FullName, fiChild2_truncated.FullName)); + } + //truncated not checked or truncate files dont exist + else if (fiChild2.Exists) + { + if (CompareFile(fiChild1, fiChild2, myIgnore)) + Add(new FindFile(fiChild1.FullName, fiChild2.FullName)); } } } private string getDebubMetaFile(DirectoryInfo di1, DirectoryInfo di2, ref bool foundFileFg) // C2026-041 { - string flnm = ""; + string flnm; DirectoryInfo dr1 = di1.GetDirectories()[0]; // get first folder for test of which DebugMeta file to use. The DebugMeta files are found only ineach proc set folder. if (!dr1.Name.Substring(0, 8).Contains("VEPROMS_") && !foundFileFg) { @@ -1025,7 +1052,7 @@ namespace Baseline } private bool CompareFile(FileInfo fiChild1, FileInfo fiChild2,IgnoreLines myIgnore) { - if (fiChild1.Name == "DebugMeta.txt") + if (fiChild1.Name == "DebugMeta.txt" || fiChild1.Name == "DebugMeta_Truncated.txt") { IEnumerable lines1 = ReadFilteredLines(fiChild1.FullName, false, myIgnore);//LINQ Read lines without ignored lines IEnumerable lines2 = ReadFilteredLines(fiChild2.FullName, false, myIgnore);//LINQ Read lines without ignored lines diff --git a/PROMS/Volian.Base.Library/DebugPrint.cs b/PROMS/Volian.Base.Library/DebugPrint.cs index 5c7297d9..5d6f3258 100644 --- a/PROMS/Volian.Base.Library/DebugPrint.cs +++ b/PROMS/Volian.Base.Library/DebugPrint.cs @@ -158,11 +158,6 @@ namespace Volian.Base.Library _MyDebugPrint.Close(); _MyDebugPrint_Truncated.Close(); } - public static void Write(string format, params object[] args) - { - _MyDebugPrint.Write(format, args); - } - public static void WriteLine(string format, params object[] args) { _MyDebugPrint_Truncated.WriteLine(format, args); From c32121c4c4eb2bd3940c27aad3f5005af0859a01 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 2 Sep 2026 15:48:26 -0400 Subject: [PATCH 10/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Baseline/frmBaseline.Designer.cs | 1 - PROMS/Baseline/frmBaseline.cs | 51 +------------------------- 2 files changed, 2 insertions(+), 50 deletions(-) diff --git a/PROMS/Baseline/frmBaseline.Designer.cs b/PROMS/Baseline/frmBaseline.Designer.cs index db6ba774..74adce49 100644 --- a/PROMS/Baseline/frmBaseline.Designer.cs +++ b/PROMS/Baseline/frmBaseline.Designer.cs @@ -99,7 +99,6 @@ this.cbUseTruncatedData.Text = "Use Truncated Data"; this.tt.SetToolTip(this.cbUseTruncatedData, "Set the Search to be Case Sensitive\r\nUppercase and Lowercase will not match"); this.cbUseTruncatedData.UseVisualStyleBackColor = true; - this.cbUseTruncatedData.Click += new System.EventHandler(this.cbUseTruncatedData_Click); // // btnUC // diff --git a/PROMS/Baseline/frmBaseline.cs b/PROMS/Baseline/frmBaseline.cs index f323ca6e..92660dc5 100644 --- a/PROMS/Baseline/frmBaseline.cs +++ b/PROMS/Baseline/frmBaseline.cs @@ -73,7 +73,7 @@ namespace Baseline public IgnoreLines MyIgnore { get; set; } = new IgnoreLines(); private LastWas myLast = LastWas.Search; private Settings MySettings; - public bool TruncatedDataFg { get; set; } = false; + //public bool TruncatedDataFg { get; set; } = false; public string MyStatus { get { return tsslStatus.Text; } @@ -203,13 +203,6 @@ namespace Baseline MyIgnore = IgnoreLines.Get(saveOriginal); } } - private void cbUseTruncatedData_Click(object sender, EventArgs e) - { - System.Windows.Forms.CheckBox item = (System.Windows.Forms.CheckBox)sender; - TruncatedDataFg = item.Checked; - - } - //} /// /// Process DebugPagination.txt in all sub-folders /// @@ -972,29 +965,12 @@ namespace Baseline } private void FillByCompare(DirectoryInfo di1, DirectoryInfo di2, string fileName, IgnoreLines myIgnore, bool isTruncatedChecked = false, bool foundFileFg = false) { - //if (isTruncatedChecked) // C2026-041 is the "Use Truncated Data" checked - //{ - // if (!foundFileFg) // flag to indicate if the correct DebugMeta file has been found. - // { - // fileName = getDebubMetaFile(di1, di2, ref foundFileFg); // C2026-041 Check if the DebugMeta_Truncate.txt file is found in the baseline bench mark and the new release being tested. - // } - //} - - foreach (DirectoryInfo diChild1 in di1.GetDirectories()) + foreach (DirectoryInfo diChild1 in di1.GetDirectories()) { DirectoryInfo diChild2 = new DirectoryInfo(Path.Combine(di2.FullName, diChild1.Name)); if (diChild2.Exists) FillByCompare(diChild1, diChild2, fileName,myIgnore, isTruncatedChecked, foundFileFg);// Recursively work on Sub-Folders } - //foreach (FileInfo fiChild1 in di1.GetFiles(fileName)) - //{ - // FileInfo fiChild2 = new FileInfo(Path.Combine(di2.FullName, fiChild1.Name)); - // if (fiChild2.Exists) - // { - // if (CompareFile(fiChild1, fiChild2, myIgnore)) - // Add(new FindFile(fiChild1.FullName, fiChild2.FullName));// Process Each File - // } - //} foreach (FileInfo fiChild1 in di1.GetFiles(fileName)) { FileInfo fiChild2 = new FileInfo(Path.Combine(di2.FullName, fiChild1.Name)); @@ -1027,29 +1003,6 @@ namespace Baseline } } } - private string getDebubMetaFile(DirectoryInfo di1, DirectoryInfo di2, ref bool foundFileFg) // C2026-041 - { - string flnm; - DirectoryInfo dr1 = di1.GetDirectories()[0]; // get first folder for test of which DebugMeta file to use. The DebugMeta files are found only ineach proc set folder. - if (!dr1.Name.Substring(0, 8).Contains("VEPROMS_") && !foundFileFg) - { - if (File.Exists(Path.Combine(dr1.FullName, "DebugMeta_Truncated.txt")) && File.Exists(Path.Combine(di2.FullName, dr1.Name, "DebugMeta_Truncated.txt"))) // if DebugMeta_Truncate.txt file is found. - { - flnm = "DebugMeta_Truncated.txt"; - foundFileFg = true; - } - else - { - flnm = "DebugMeta.txt"; - foundFileFg = true; - } - } - else - { - flnm = "DebugMeta.txt"; - } - return flnm; - } private bool CompareFile(FileInfo fiChild1, FileInfo fiChild2,IgnoreLines myIgnore) { if (fiChild1.Name == "DebugMeta.txt" || fiChild1.Name == "DebugMeta_Truncated.txt") From edc5bc611bca3ef3af94024df1b61afa3dc6580b Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 2 Sep 2026 16:27:59 -0400 Subject: [PATCH 11/12] C2026-041-invisible-position-changes-as-differences --- PROMS/Baseline/frmBaseline.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/PROMS/Baseline/frmBaseline.cs b/PROMS/Baseline/frmBaseline.cs index 92660dc5..fb09557e 100644 --- a/PROMS/Baseline/frmBaseline.cs +++ b/PROMS/Baseline/frmBaseline.cs @@ -73,7 +73,6 @@ namespace Baseline public IgnoreLines MyIgnore { get; set; } = new IgnoreLines(); private LastWas myLast = LastWas.Search; private Settings MySettings; - //public bool TruncatedDataFg { get; set; } = false; public string MyStatus { get { return tsslStatus.Text; } @@ -856,7 +855,7 @@ namespace Baseline DirectoryInfo di1 = new DirectoryInfo(path1); DirectoryInfo di2 = new DirectoryInfo(path2); _FileName = fileName; - FillByCompare(di1, di2, fileName, myIgnore, TruncatedDataFg, false); + FillByCompare(di1, di2, fileName, myIgnore, TruncatedDataFg); } /// /// Fill for a search @@ -963,13 +962,13 @@ namespace Baseline } return false; } - private void FillByCompare(DirectoryInfo di1, DirectoryInfo di2, string fileName, IgnoreLines myIgnore, bool isTruncatedChecked = false, bool foundFileFg = false) + private void FillByCompare(DirectoryInfo di1, DirectoryInfo di2, string fileName, IgnoreLines myIgnore, bool isTruncatedChecked = false) { foreach (DirectoryInfo diChild1 in di1.GetDirectories()) { DirectoryInfo diChild2 = new DirectoryInfo(Path.Combine(di2.FullName, diChild1.Name)); if (diChild2.Exists) - FillByCompare(diChild1, diChild2, fileName,myIgnore, isTruncatedChecked, foundFileFg);// Recursively work on Sub-Folders + FillByCompare(diChild1, diChild2, fileName,myIgnore, isTruncatedChecked);// Recursively work on Sub-Folders } foreach (FileInfo fiChild1 in di1.GetFiles(fileName)) { From 7333247b52e589914d41bdd5f84bd41464edb64a Mon Sep 17 00:00:00 2001 From: John Jenko Date: Fri, 4 Sep 2026 10:44:35 -0400 Subject: [PATCH 12/12] B2026-074 Fixed issue where PROMS would hang when opening multiple saved Word section tabs. Also, we now save and restore to the step location of saved procedure editor sections. --- PROMS/VEPROMS User Interface/frmVEPROMS.cs | 67 ++++++++----------- PROMS/Volian.Controls.Library/DSOTabPanel.cs | 8 +-- PROMS/Volian.Controls.Library/DisplayRO.cs | 5 +- .../DisplayTabControl.cs | 7 +- 4 files changed, 37 insertions(+), 50 deletions(-) diff --git a/PROMS/VEPROMS User Interface/frmVEPROMS.cs b/PROMS/VEPROMS User Interface/frmVEPROMS.cs index facb6027..99038aaa 100644 --- a/PROMS/VEPROMS User Interface/frmVEPROMS.cs +++ b/PROMS/VEPROMS User Interface/frmVEPROMS.cs @@ -1,23 +1,15 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.Collections.Specialized; -using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; -using System.Configuration; -using System.Reflection; using VEPROMS.CSLA.Library; -//using Csla; -using DevComponents; using DevComponents.DotNetBar; using DevComponents.DotNetBar.Rendering; using VEPROMS.Properties; using Volian.Controls.Library; -using DescriptiveEnum; using Volian.Base.Library; using Volian.Print.Library; using JR.Utils.GUI.Forms; @@ -1610,7 +1602,7 @@ namespace VEPROMS displayRO.MyROFST = SelectedROFst; // B2023-021: force Load of Step Prop/RO panel RO tree by passing in // true to LoadTree - if (!_WeAreExitingPROMS) displayRO.LoadTree(true); + if (!_WeAreExitingPROMS) displayRO.LoadTree(this,true); } } @@ -1846,7 +1838,7 @@ namespace VEPROMS // should be closed or if we should exit PROMS or just Cancel to continue working if (tc._MyDisplayTabItems.Count < 1) // If all thabs are closed in the editor will indicate that in the database. { - VEPROMS.CSLA.Library.Item.DeactivateStateDisplayTabTmp(MySessionInfo.UserID); + Item.DeactivateStateDisplayTabTmp(MySessionInfo.UserID); } if (!_WeAreExitingPROMS && !ClosingWithError && tc.SelectedDisplayTabItem != null && tc._MyDisplayTabItems.Count > 0) { @@ -1864,7 +1856,7 @@ namespace VEPROMS return; } - string stk = Volian.Base.Library.vlnStackTrace.StackToString(); + string stk = vlnStackTrace.StackToString(); if (!stk.Contains("Exception")) { @@ -1872,33 +1864,28 @@ namespace VEPROMS // B2019-071 we will now close one or all of the tabs (even step editor ones) if (_WeAreExitingPROMS) { - string DisplayTabID = ""; - int pos; - int TabItemID; - string DisplayTabName = ""; - int cnt = 0; // Deactivate previous procedure tab state by user - VEPROMS.CSLA.Library.Item.DeactivateStateDisplayTabTmp(MySessionInfo.UserID); + Item.DeactivateStateDisplayTabTmp(MySessionInfo.UserID); // Save current procedure tab state - //B2024-082 Remember Tabs Not opening in correct order + int cnt = 0; foreach (DisplayTabItem dti in tc.MyBar.Items) { cnt++; - DisplayTabID = dti.MyKey; - TabItemID = dti.MyItemInfo.ItemID; - DisplayTabName = dti.ToString(); - Item.AddDisplayTabsState(TabItemID, DisplayTabID, DisplayTabName, MySessionInfo.UserID, cnt); + ItemInfo itminfo = dti.MyItemInfo; + string DisplayTabID = dti.MyKey; + string DisplayTabName = dti.ToString(); + // B2026-074 if a Word section, save the ItemID of the entire Word section + // else if a Step Editor section, save the ItemID of the step part the user was on + int TabItemID = itminfo.HasWordContent ? itminfo.ItemID : dti.MyStepTabPanel.MyStepTabRibbon.MyEditItem.MyItemInfo.ItemID; + Item.AddDisplayTabsState(TabItemID, DisplayTabID, DisplayTabName, MySessionInfo.UserID, cnt); } } int n = tc._MyDisplayTabItems.Count; - while (n-- > 0 && tc._MyDisplayTabItems.Count > 0) { - tc.CloseTabItem(tc.SelectedDisplayTabItem); - // B2019-071 close just the current tab and continue working if (!dctoe.ExitPROMS) { @@ -2543,13 +2530,13 @@ namespace VEPROMS } // Add retrieve displaytabs state here. - openDisplaytabstate(); + OpenDisplaytabstate(); } - public void openDisplaytabstate() + private void OpenDisplaytabstate() { // Retrieve edit tab state from database. - DataTable DisPlayTabState = VEPROMS.CSLA.Library.Item.GetDisplayTabs(VlnSettings.UserID); + DataTable DisPlayTabState = Item.GetDisplayTabs(VlnSettings.UserID); //CSM - C2024-031 - Getting User Settings //and set checkboxes based on what they are set to @@ -2569,9 +2556,12 @@ namespace VEPROMS usersettings.SetUserSettings(true, result == DialogResult.Yes); } - if (result == DialogResult.Yes) { + // B2026-074 added flag (LoadingSavedProcTabs) to supress unnecessary event calls + // this will help prevent PROMS from getting stuck continuously looping through the same events + // when Word procedure tabs are restored. + tc.LoadingSavedProcTabs = true; foreach (DataRow TabState in DisPlayTabState.Rows) { int _ItemID = (int)TabState["ItemID"]; @@ -2579,7 +2569,7 @@ namespace VEPROMS // Open procedure in the editor. if (_Procedure == null) continue; //skip and continue with foreach OpenItem(_Procedure); - if (tc.MyEditItem == null) continue; // skip and continue with foreach + if (tc.MyEditItem == null) continue; // skip and continue with foreach // SelectedStepTabPanel needs to be set so the print buttons on the ribbon will work. SelectedStepTabPanel = tc.MyEditItem.MyStepPanel.MyStepTabPanel; @@ -2594,6 +2584,7 @@ namespace VEPROMS SpellChecker.MyEditItem = tc.MyEditItem; //B2025-043 Remember Tabs is not setting the EditItem for the active window causing a PROMS crash when Spell Check } } + tc.LoadingSavedProcTabs = false; } } } @@ -4374,7 +4365,7 @@ namespace VEPROMS displayRO.MyRTB = (SelectedStepTabPanel == null) ? null : SelectedStepTabPanel.MyStepPanel.SelectedEditItem == null ? null : SelectedStepTabPanel.MyStepPanel.SelectedEditItem.MyStepRTB; - displayRO.LoadTree(); //B2022-026 RO Memory reduction coding (Jakes Merge) + displayRO.LoadTree(this); //B2022-026 RO Memory reduction coding (Jakes Merge) } #endregion @@ -4528,7 +4519,7 @@ namespace VEPROMS // need this to update RO Tree after UpdateRofst (B2015-226) // B2022-026 RO Memory reduction coding (Jakes Merge) displayRO.MyROFST = SelectedROFst; - displayRO.LoadTree(); + displayRO.LoadTree(this); // resetting the MyROFSTLookup for the search & reports panels will refresh the RO trees after UpdateRofst in each of those panels (B2015-226) if (SelectedDVI != null) @@ -4603,7 +4594,7 @@ namespace VEPROMS //C2026-008 Re-Architect RO.FST to include RO Modification date/time // if ROFST got updated, // set the Selected FST so it is in sync - if (!_WeAreExitingPROMS && displayRO.LoadTree(true)) + if (!_WeAreExitingPROMS && displayRO.LoadTree(this,true)) { SelectedROFst = displayRO.MyROFST; } @@ -4723,7 +4714,7 @@ namespace VEPROMS // B2022-026 RO Memory reduction coding (Jakes Merge) displayRO.MyRTB = null; - displayRO.LoadTree(); + displayRO.LoadTree(this); } infotabTags.Visible = false; @@ -4810,7 +4801,7 @@ namespace VEPROMS //C2026-008 Re-Architect RO.FST to include RO Modification date/time // if ROFST got updated, // set the Selected FST so it is in sync - if (!_WeAreExitingPROMS && displayRO.LoadTree()) + if (!_WeAreExitingPROMS && displayRO.LoadTree(this)) { SelectedROFst = displayRO.MyROFST; } @@ -4843,7 +4834,7 @@ namespace VEPROMS // B2022-026 RO Memory reduction coding (Jakes Merge) displayRO.SetFindDocROButton(false); - if (!_WeAreExitingPROMS) displayRO.LoadTree(); + if (!_WeAreExitingPROMS) displayRO.LoadTree(this); //C2019-036 View Only mode work with Checked Out Procedures //In View Only Mode - Step Properties should be disabled @@ -4864,7 +4855,7 @@ namespace VEPROMS displayRO.ROTypeFilter = E_ROValueType.All; // allow all RO types for Word attachments (but fix) displayRO.SetFindDocROButton(true); - displayRO.LoadTree(); + displayRO.LoadTree(this); } } @@ -4996,7 +4987,7 @@ namespace VEPROMS //C2026-008 Re-Architect RO.FST to include RO Modification date/time // if ROFST got updated, // set the Selected FST so it is in sync - if (displayRO.LoadTree()) + if (displayRO.LoadTree(this)) { SelectedROFst = displayRO.MyROFST; } diff --git a/PROMS/Volian.Controls.Library/DSOTabPanel.cs b/PROMS/Volian.Controls.Library/DSOTabPanel.cs index f428da3e..c1c4cf70 100644 --- a/PROMS/Volian.Controls.Library/DSOTabPanel.cs +++ b/PROMS/Volian.Controls.Library/DSOTabPanel.cs @@ -1,12 +1,7 @@ using System; -using System.ComponentModel; -using System.Collections.Generic; -using System.Diagnostics; using System.Text; -using System.Drawing; using System.Windows.Forms; using VEPROMS.CSLA.Library; -using Volian.Controls.Library; using System.Reflection; using LBWordLibrary; using JR.Utils.GUI.Forms; @@ -607,7 +602,8 @@ namespace Volian.Controls.Library if (_In_DSOTabPanel_Enter) return; //vlnStackTrace.ShowStack("DSOTabPanel_Enter {0} DocID {1} Index {2} {3}",_In_DSOTabPanel_Enter, this._MyDocumentInfo.DocID, _MyDisplayTabControl.MyBar.SelectedDockTab, sender.GetType().FullName); _In_DSOTabPanel_Enter = true; - if (MyDisplayTabItem.MyItemInfo != null) + // B2026-074 only do this if we are not restoring save procedure tabs + if (MyDisplayTabItem.MyItemInfo != null && !_MyDisplayTabControl.LoadingSavedProcTabs) _MyDisplayTabControl.OnItemSelectedChanged(this,new ItemSelectedChangedEventArgs(MyDisplayTabItem.MyItemInfo)); _MyEdWord.Focus(); _In_DSOTabPanel_Enter = false; diff --git a/PROMS/Volian.Controls.Library/DisplayRO.cs b/PROMS/Volian.Controls.Library/DisplayRO.cs index d8b59abd..c4385cab 100644 --- a/PROMS/Volian.Controls.Library/DisplayRO.cs +++ b/PROMS/Volian.Controls.Library/DisplayRO.cs @@ -7,7 +7,6 @@ using System.Drawing; using System.IO; using System.Linq; using System.Text.RegularExpressions; -using System.Threading.Tasks; using System.Windows.Forms; using VEPROMS.CSLA.Library; using Volian.Base.Library; @@ -622,7 +621,7 @@ 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) + public bool LoadTree(IWin32Window mainForm, bool forceReload = false) { bool updatedROs = false; @@ -653,7 +652,7 @@ namespace Volian.Controls.Library } else if (changedDocVersion && !askedAboutchangedDocVersion && !ROWorkingDraftAsk.ContainsWorkingDraft(_docVersionInfo.VersionID)) { - if (MessageBox.Show($"There exists a newer ROFST for this RO database that was loaded for other sets.\r\n\r\nDo you want to update this set's ROs to be consistent/use the latest loaded ROFST?", "Load ROs", MessageBoxButtons.YesNo) == DialogResult.Yes) + if (MessageBox.Show(mainForm,$"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"; diff --git a/PROMS/Volian.Controls.Library/DisplayTabControl.cs b/PROMS/Volian.Controls.Library/DisplayTabControl.cs index c332a18a..9a1c61d2 100644 --- a/PROMS/Volian.Controls.Library/DisplayTabControl.cs +++ b/PROMS/Volian.Controls.Library/DisplayTabControl.cs @@ -1,12 +1,9 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Drawing; using System.Data; -using System.Text; using System.Windows.Forms; using VEPROMS.CSLA.Library; -using Volian.Controls.Library; using DevComponents.DotNetBar; using JR.Utils.GUI.Forms; using Volian.Base.Library; @@ -59,6 +56,9 @@ namespace Volian.Controls.Library private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endregion + // B2026-074 added flag to use when restoring saved procedure tabs + public bool LoadingSavedProcTabs { get; set; } = false; + private static bool _SyncronizeEnahnced = false; public static bool SyncronizeEnhanced { @@ -1282,6 +1282,7 @@ namespace Volian.Controls.Library get { return _SyncEnhancedDocuments; } set { _SyncEnhancedDocuments = value; } } + public void HandleChangeId(ItemInfo myItemInfo, DisplayTabItem pg) { if (myItemInfo.ActiveFormat.PlantFormat.FormatData.ProcData.ChangeBarData.ChangeIds)