diff --git a/PROMS/Baseline/frmBaseline.Designer.cs b/PROMS/Baseline/frmBaseline.Designer.cs index 88f69955..74adce49 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 // C2026-041 + // + 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))); @@ -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..fb09557e 100644 --- a/PROMS/Baseline/frmBaseline.cs +++ b/PROMS/Baseline/frmBaseline.cs @@ -43,15 +43,15 @@ 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.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; namespace Baseline { @@ -67,11 +67,11 @@ 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 string MyStatus { @@ -141,13 +141,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) @@ -218,7 +218,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,8 +708,9 @@ namespace Baseline lbResults1.Items.Clear(); lbResults2.Items.Clear(); MyStatus = "Searching..."; - // Perform code to find DebugMeta files with diffences - FindFiles 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); @@ -732,7 +733,7 @@ namespace Baseline lbResults2.Items.Clear(); MyStatus = "Searching..."; //Perform Search - FindFiles 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); @@ -814,6 +815,7 @@ namespace Baseline CompareOneFile(ff.File1, ff.File2); } } + } public enum SearchType { @@ -838,20 +840,22 @@ 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) + + 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, 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); } /// /// Fill for a search @@ -862,12 +866,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 @@ -878,13 +882,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)) { @@ -958,27 +962,49 @@ 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 isTruncatedChecked = false) { - foreach (DirectoryInfo diChild1 in di1.GetDirectories()) + 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, isTruncatedChecked);// Recursively work on Sub-Folders } foreach (FileInfo fiChild1 in di1.GetFiles(fileName)) { - FileInfo fiChild2 = new FileInfo(di2.FullName + "\\" + fiChild1.Name); - if (fiChild2.Exists) + FileInfo fiChild2 = new FileInfo(Path.Combine(di2.FullName, fiChild1.Name)); + 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 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/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/VEPROMS User Interface/frmVEPROMS.cs b/PROMS/VEPROMS User Interface/frmVEPROMS.cs index 1ee49687..326d6621 100644 --- a/PROMS/VEPROMS User Interface/frmVEPROMS.cs +++ b/PROMS/VEPROMS User Interface/frmVEPROMS.cs @@ -1539,7 +1539,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); } } @@ -1757,160 +1757,158 @@ namespace VEPROMS public bool ClosingWithError = false; // B2019-098: prevent looping between error & exit dialog private bool _WeAreExitingPROMS = false; // B2019-101 if exiting PROMS from main window don't prompt on each child window (separate windows) - private void frmVEPROMS_FormClosing(object sender, FormClosingEventArgs e) - { - // B2017-212 If the user uses the X button in Word to close the word attachment, PROMS thinks that the user wants to close out of PROMS as well - // trap for this and close only the Word tab in PROMS - // B2017-214 added a null reference check - // B2010-071 Since we cannot tell if the user click on the X in Word or the X in PROMS, ask if the current tab - // 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. - { + private void frmVEPROMS_FormClosing(object sender, FormClosingEventArgs e) + { + // B2017-212 If the user uses the X button in Word to close the word attachment, PROMS thinks that the user wants to close out of PROMS as well + // trap for this and close only the Word tab in PROMS + // B2017-214 added a null reference check + // B2010-071 Since we cannot tell if the user click on the X in Word or the X in PROMS, ask if the current tab + // 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. + { Item.DeactivateStateDisplayTabTmp(MySessionInfo.UserID); - } - if (!_WeAreExitingPROMS && !ClosingWithError && tc.SelectedDisplayTabItem != null && tc._MyDisplayTabItems.Count > 0) - { - // B2019-071 dialog to ask user if we are to close one tab or exit - DlgCloseTabsOrExit dctoe = new DlgCloseTabsOrExit(MyParent == null, PROMSWindowForms.Count > 0); - dctoe.ShowDialog(); + } + if (!_WeAreExitingPROMS && !ClosingWithError && tc.SelectedDisplayTabItem != null && tc._MyDisplayTabItems.Count > 0) + { + // B2019-071 dialog to ask user if we are to close one tab or exit + DlgCloseTabsOrExit dctoe = new DlgCloseTabsOrExit(MyParent == null, PROMSWindowForms.Count > 0); + dctoe.ShowDialog(); - // B2019-101 flag that we are exiting from PROMS main window (separate windows) - _WeAreExitingPROMS = (MyParent == null && dctoe.ExitPROMS); + // B2019-101 flag that we are exiting from PROMS main window (separate windows) + _WeAreExitingPROMS = (MyParent == null && dctoe.ExitPROMS); - if (dctoe.Cancel) // B2019-071 user decided to not close any tab and not exit PROMS - so do nothing and continue working - { - e.Cancel = true; - dctoe.Close(); - return; - } + if (dctoe.Cancel) // B2019-071 user decided to not close any tab and not exit PROMS - so do nothing and continue working + { + e.Cancel = true; + dctoe.Close(); + return; + } - string stk = vlnStackTrace.StackToString(); + string stk = vlnStackTrace.StackToString(); - if (!stk.Contains("Exception")) - { - // B2018-091 Allow PROMS to close if only MSWord sections have been opened. - // B2019-071 we will now close one or all of the tabs (even step editor ones) - if (_WeAreExitingPROMS) - { - int TabItemID; - int cnt = 0; + if (!stk.Contains("Exception")) + { + // B2018-091 Allow PROMS to close if only MSWord sections have been opened. + // B2019-071 we will now close one or all of the tabs (even step editor ones) + if (_WeAreExitingPROMS) + { // Deactivate previous procedure tab state by user Item.DeactivateStateDisplayTabTmp(MySessionInfo.UserID); - // Save current procedure tab state - - //B2024-082 Remember Tabs Not opening in correct order - foreach (DisplayTabItem dti in tc.MyBar.Items) - { - cnt++; + // 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++; + ItemInfo itminfo = dti.MyItemInfo; string DisplayTabID = dti.MyKey; - TabItemID = dti.MyItemInfo.ItemID; 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) - { + 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) + { e.Cancel = true; - dctoe.Close(); - return; - } - } + dctoe.Close(); + return; + } + } - if (tc.SelectedDisplayTabItem != null && tc._MyDisplayTabItems.Count > 0 && dctoe.ExitPROMS) - { - _MyLog.WarnFormat($"Stack Does not contain an Exception\r\nPROMS will Not Exit. Stack : \r\n{stk}"); - e.Cancel = true; // If Display Items still exist don't close. - } + if (tc.SelectedDisplayTabItem != null && tc._MyDisplayTabItems.Count > 0 && dctoe.ExitPROMS) + { + _MyLog.WarnFormat($"Stack Does not contain an Exception\r\nPROMS will Not Exit. Stack : \r\n{stk}"); + e.Cancel = true; // If Display Items still exist don't close. + } - dctoe.Close(); - } - } + dctoe.Close(); + } + } - //C2015-022 Separate Windows - if child windows are open and we are closing the main PROMS window, give user a chance to not close PROMS and that child windows - // B2019-101 if we are exiting from PROMS main window no need to prompt user about child windows. - if (MyParent == null && PROMSWindowForms != null && PROMSWindowForms.Count > 0 && !_WeAreExitingPROMS) - { - DialogResult dr = MessageBox.Show("Close all of the child windows and exit PROMS?", "Exit PROMS", MessageBoxButtons.YesNo); - if (dr == DialogResult.No) - { - e.Cancel = true; - return; - } - } + //C2015-022 Separate Windows - if child windows are open and we are closing the main PROMS window, give user a chance to not close PROMS and that child windows + // B2019-101 if we are exiting from PROMS main window no need to prompt user about child windows. + if (MyParent == null && PROMSWindowForms != null && PROMSWindowForms.Count > 0 && !_WeAreExitingPROMS) + { + DialogResult dr = MessageBox.Show("Close all of the child windows and exit PROMS?", "Exit PROMS", MessageBoxButtons.YesNo); + if (dr == DialogResult.No) + { + e.Cancel = true; + return; + } + } - // This keeps PROMS from Hanging under certain circumstances - tc.ShuttingDown = true; + // This keeps PROMS from Hanging under certain circumstances + tc.ShuttingDown = true; - // B2019-161 When shutting down output the timing information (to the error log) - if (VolianTimer.TimingsOn) - VolianTimer.ShowTimers(); + // B2019-161 When shutting down output the timing information (to the error log) + if (VolianTimer.TimingsOn) + VolianTimer.ShowTimers(); - foreach (DisplayTabItem dti in tc.MyBar.Items) - { - if (dti.MyDSOTabPanel != null) - dti.MyDSOTabPanel.CloseDSO(); - else - MySessionInfo.CheckInItem(dti.OwnerID); //C2015-022 Separate Windows closing child form only left procedure ownership active - } + foreach (DisplayTabItem dti in tc.MyBar.Items) + { + if (dti.MyDSOTabPanel != null) + dti.MyDSOTabPanel.CloseDSO(); + else + MySessionInfo.CheckInItem(dti.OwnerID); //C2015-022 Separate Windows closing child form only left procedure ownership active + } - if (MyParent == null) - { - if (MyActivityTimer != null) - { - MyActivityTimer.Dispose(); - _MyLog.Debug("VEPROMS FormClosing - dispose timer"); - } + if (MyParent == null) + { + if (MyActivityTimer != null) + { + MyActivityTimer.Dispose(); + _MyLog.Debug("VEPROMS FormClosing - dispose timer"); + } - // C2015-022: part of separate windows upgrade close all of the child windows before closing the main PROMS window - if (PROMSWindowForms != null && PROMSWindowForms.Count > 0) - { - foreach (int k in PROMSWindowForms.Keys) - { - frmVEPROMS child = PROMSWindowForms[k]; - _RemoveFromPROMSWindowForms = false; - child._RemoveFromPROMSWindowForms = false; - child._WeAreExitingPROMS = _WeAreExitingPROMS; - child.Close(); - child.MySessionInfo.EndSession(); - } - } + // C2015-022: part of separate windows upgrade close all of the child windows before closing the main PROMS window + if (PROMSWindowForms != null && PROMSWindowForms.Count > 0) + { + foreach (int k in PROMSWindowForms.Keys) + { + frmVEPROMS child = PROMSWindowForms[k]; + _RemoveFromPROMSWindowForms = false; + child._RemoveFromPROMSWindowForms = false; + child._WeAreExitingPROMS = _WeAreExitingPROMS; + child.Close(); + child.MySessionInfo.EndSession(); + } + } - MySessionInfo?.EndSession(); + MySessionInfo?.EndSession(); - // Save the location and size of the VE-PROMS application for this user - if (WindowState == FormWindowState.Normal) - { - Settings.Default.Location = Location; - Settings.Default.Size = Size; - } + // Save the location and size of the VE-PROMS application for this user + if (WindowState == FormWindowState.Normal) + { + Settings.Default.Location = Location; + Settings.Default.Size = Size; + } - if (MyVersionWindowList != null) - { - Settings.Default.VersionWindows = MyVersionWindowList.ToSettings(); - } + if (MyVersionWindowList != null) + { + Settings.Default.VersionWindows = MyVersionWindowList.ToSettings(); + } - Settings.Default.WindowState = WindowState; - Settings.Default.QATItems = ribbonControl1.QatLayout; + Settings.Default.WindowState = WindowState; + Settings.Default.QATItems = ribbonControl1.QatLayout; - SaveMRU(); + SaveMRU(); DebugPagination.Close(); DebugText.Close(); BaselineMetaFile.Close(); // C2018-004 create meta file for baseline compares - } - } + } + } - void frmVEPROMS_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e) + void frmVEPROMS_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e) { // Close any open documents tc.Dispose(); @@ -2423,10 +2421,10 @@ namespace VEPROMS } // Add retrieve displaytabs state here. - openDisplaytabstate(); + OpenDisplaytabstate(); } - public void openDisplaytabstate() + private void OpenDisplaytabstate() { // Retrieve edit tab state from database. DataTable DisPlayTabState = Item.GetDisplayTabs(VlnSettings.UserID); @@ -2449,9 +2447,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"]; @@ -2474,6 +2475,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; } } } @@ -4022,7 +4024,7 @@ namespace VEPROMS displayRO.MyRTB = 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 @@ -4168,7 +4170,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) @@ -4243,7 +4245,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; } @@ -4342,7 +4344,7 @@ namespace VEPROMS // B2022-026 RO Memory reduction coding (Jakes Merge) displayRO.MyRTB = null; - displayRO.LoadTree(); + displayRO.LoadTree(this); } infotabTags.Visible = false; @@ -4429,7 +4431,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; } @@ -4460,7 +4462,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 @@ -4481,7 +4483,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); } } @@ -4607,7 +4609,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.Base.Library/DebugPrint.cs b/PROMS/Volian.Base.Library/DebugPrint.cs index 8e870a37..bb204c84 100644 --- a/PROMS/Volian.Base.Library/DebugPrint.cs +++ b/PROMS/Volian.Base.Library/DebugPrint.cs @@ -104,16 +104,34 @@ namespace Volian.Base.Library public static bool IsOpen => _MyDebugPrint.IsOpen; } // C2018-004 create meta file for baseline compares - public static class BaselineMetaFile - { - private static readonly DebugPrint _MyDebugPrint = new DebugPrint(); - public static void Open(string fileName) => _MyDebugPrint.Open(fileName); - public static void Close() => _MyDebugPrint.Close(); - public static void Write(string format, params object[] args) => _MyDebugPrint.Write(format, args); - public static void WriteLine(string format, params object[] args) => _MyDebugPrint.WriteLine(format, args); - public static void Show() => _MyDebugPrint.Show(); - public static bool IsOpen => _MyDebugPrint.IsOpen; - - public static bool IncludeWordSecText { get; set; } = true; - } + public static class BaselineMetaFile + { + private static readonly DebugPrint _MyDebugPrint = new DebugPrint(); + private static readonly 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_Truncated.Close(); + } + public static void WriteLine(string format, params object[] args) + { + _MyDebugPrint_Truncated.WriteLine(format, args); + _MyDebugPrint.WriteLine(format, args); + } + public static void WriteLineTruncate(string format, params object[] args) => _MyDebugPrint_Truncated.WriteLine(format, args); + public static void WriteLineLegacy(string format, params object[] args) => _MyDebugPrint.WriteLine(format, args); + public static void Show() + { + _MyDebugPrint.Show(); + _MyDebugPrint_Truncated.Show(); + } + public static bool IsOpen => _MyDebugPrint.IsOpen; + + public static bool IncludeWordSecText { get; set; } = true; + } } diff --git a/PROMS/Volian.Controls.Library/DSOTabPanel.cs b/PROMS/Volian.Controls.Library/DSOTabPanel.cs index c558e671..73eaa25a 100644 --- a/PROMS/Volian.Controls.Library/DSOTabPanel.cs +++ b/PROMS/Volian.Controls.Library/DSOTabPanel.cs @@ -479,7 +479,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 9a839b60..584c8a83 100644 --- a/PROMS/Volian.Controls.Library/DisplayRO.cs +++ b/PROMS/Volian.Controls.Library/DisplayRO.cs @@ -609,7 +609,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; @@ -640,7 +640,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 0d70607b..a3af8bc0 100644 --- a/PROMS/Volian.Controls.Library/DisplayTabControl.cs +++ b/PROMS/Volian.Controls.Library/DisplayTabControl.cs @@ -56,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; + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0044:Add readonly modifier", Justification = "Keeping Collections Not ReadOnly")] private static Dictionary _AllDTCs = new Dictionary(); private int _VersionID = 0; @@ -1203,6 +1206,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) diff --git a/PROMS/Volian.Print.Library/PromsPrinter.cs b/PROMS/Volian.Print.Library/PromsPrinter.cs index 159bf433..0350a243 100644 --- a/PROMS/Volian.Print.Library/PromsPrinter.cs +++ b/PROMS/Volian.Print.Library/PromsPrinter.cs @@ -1186,7 +1186,11 @@ 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.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.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 if (ii == 0 && _MyHelper.MyPromsPrinter.SaveLinks) @@ -1299,6 +1303,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)