using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using VEPROMS.CSLA.Library; using System.IO; using Volian.Controls.Library; using DevComponents.DotNetBar; using JR.Utils.GUI.Forms; namespace VEPROMS { public partial class frmBatchRefresh : Form { private SessionInfo _MySessionInfo; public SessionInfo MySessionInfo { get { return _MySessionInfo; } set { _MySessionInfo = value; } } private bool IsAdministratorUser = false; //C2020-035 used to control what Set Amins can do // C2017-030 - new Admin Tools user interface // pass in session info to constructor public frmBatchRefresh(SessionInfo sessionInfo) { InitializeComponent(); _MySessionInfo = sessionInfo; setupProgessSteps1(); // C2017-030 - new Admin Tools user interface UserInfo ui = UserInfo.GetByUserID(MySessionInfo.UserID); IsAdministratorUser = ui.IsAdministrator(); if (!IsAdministratorUser) { //C2020-035 if not full Admin disable repair tools // only full Admin users can run the repair tools btnRunRepair.Enabled = false; swRmObsoleteROData.Enabled = false; swRmOrphanDataRecs.Enabled = false; swRefreshWordAttmts.Enabled = false; swStandardHypenChars.Enabled = false; } } // NOTE: removed the Refresh ROs and Refresh Transitions and ROs options (now only Transitions can be refreshed) // the Update ROs and Refresh ROs logic was merged together. The Update ROs will functionally do both // also annotations will be placed on step elements that have RO changes // make all of the hyphen character consistant so they can all be found with the Search function private void FixHyphens() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Standardizing Hyphens"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); int affectedRows = ESP_FixHyphens.Execute("vesp_FixHyphens") / 2;// Two results for each change txtProcess.AppendText(string.Format("Fixed {0} Hyphens", affectedRows)); txtProcess.AppendText(Environment.NewLine); //txtProcess.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("{0} Hyphens were Fixed.", affectedRows)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; } private Dictionary myProcedures = new Dictionary(); private Dictionary myDocVersions = new Dictionary(); private void frmBatchRefresh_Load(object sender, EventArgs e) { IsClosing = false;//B2017-221 Allow the batch dialog to close when waiting to process. } private bool IsClosing = false;//B2017-221 Allow the batch dialog to close when waiting to process. private void frmBatchRefresh_FormClosing(object sender, EventArgs e) { IsClosing = true;//B2017-221 Allow the batch dialog to close when waiting to process. } // C2017-030 - new Admin Tools user interface // check to see if at least one tree node is checked. // Used to determin whether to make the process button active for // Refresh Transitions and for Update RO Values private bool AtLeastOneNodeChecked() { foreach (TreeNode tn in myTV.Nodes) if (NodeIsChecked(tn)) return true; return false; } private bool NodeIsChecked(TreeNode tn) { if (tn.Checked) return true; if (tn.GetNodeCount(true) > 0) foreach (TreeNode chnd in tn.Nodes) if (NodeIsChecked(chnd)) return true; return false; } private List myTreeNodePath; private void ResetTV() { ResetTV(false); } private void ResetTV(bool noProcs) { btnFixLinks.Enabled = false; this.Cursor = Cursors.WaitCursor; //myTreeNodePath = new List(); myTV.Nodes.Clear(); myDocVersions.Clear(); FolderInfo fi = FolderInfo.GetTop(); TreeNode tn = myTV.Nodes.Add(fi.Name); tn.Tag = fi; if (fi.ChildFolderCount > 0) LoadChildFolders(fi, tn, noProcs); if (myTV.SelectedNode != null) myTV.SelectedNode.Expand(); this.Cursor = Cursors.Default; } // B2021-060 Higher level folders where being removed from the tree even if there was a child folder that containe a working draft set private bool LoadChildFolders(FolderInfo fi, TreeNode tn, bool noProcs) { bool loadedWorkingDraft = false; bool loadedChildWorkingDraft = false; // B2021-060 flag when child folder working draft is loaded foreach (FolderInfo fic in fi.SortedChildFolders) { TreeNode tnc = tn.Nodes.Add(fic.Name); tnc.Tag = fic; if (fic.ChildFolderCount > 0) if(LoadChildFolders(fic, tnc, noProcs)) loadedChildWorkingDraft=true; // B2020-114 and C2020-035 only show folders the Set Admin can access if (fic.FolderDocVersionCount > 0) { if (!LoadDocVersions(fic, tnc, noProcs)) tnc.Remove(); else loadedWorkingDraft = true; } } if (loadedChildWorkingDraft) loadedWorkingDraft = true; // B2021-060 if child folder working draft loaded set loadedWorkingDraft if (tn.Parent != null && !loadedWorkingDraft) tn.Remove(); return loadedWorkingDraft; } private bool LoadDocVersions(FolderInfo fic, TreeNode tnc, bool noProcs) { bool rtnval = false; foreach (DocVersionInfo dvi in fic.FolderDocVersions) { UserInfo ui = UserInfo.GetByUserID(MySessionInfo.UserID); if (ui.IsAdministrator() || ui.IsSetAdministrator(dvi)) { tnc.Tag = dvi; myDocVersions.Add(tnc, dvi); if (!noProcs) { if (dvi.Procedures.Count > 0) LoadProcedures(dvi, tnc); } rtnval = true; } else { if (tnc != null && tnc.Text != "VEPROMS") // B2020-114 - mad if statement removed: && !IsUsedPath(tnc.FullPath)) { TreeNode tmp = tnc.Parent; tnc.Remove(); tnc = tmp; } } } return rtnval; } private void LoadProcedures(DocVersionInfo dvi, TreeNode tnc) { foreach (ProcedureInfo pi in dvi.Procedures) { TreeNode tn = tnc.Nodes.Add(string.Format("{0} {1}", pi.DisplayNumber, pi.DisplayText)); myProcedures.Add(tn, pi); tn.Tag = pi; } } private void LoadFolderInfo(FolderInfo f) { TreeNode tn = myTV.Nodes.Add(f.Name); tn.Tag = f; if (f.ChildFolderCount > 0) foreach (FolderInfo cf in f.SortedChildFolders) LoadFolderInfo(cf); } private void UpdateROValues() { this.Cursor = Cursors.WaitCursor; List dvil = new List(); foreach (TreeNode tn in myDocVersions.Keys) if (tn.Checked) dvil.Add(myDocVersions[tn]); DateTime pStart = DateTime.Now; txtProcess.AppendText("Update RO Values"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(pStart.ToString("MM/dd/yyyy @ HH:mm")); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); pbProcess.Minimum = 0; pbProcess.Maximum = dvil.Count; pbProcess.Step = 1; while (dvil.Count > 0) { StringBuilder sbDocVersions = new StringBuilder(); Queue dviq = new Queue(); foreach (DocVersionInfo dvi in dvil) dviq.Enqueue(dvi); dvil.Clear(); // if we are processing more than one procedure set, use MessageList to hold the summary results for each set if (dviq.Count > 1) ROFstInfo.MessageList = new StringBuilder(); while (dviq.Count > 0) { string msg = string.Empty; DocVersionInfo dq = dviq.Dequeue(); if (!MySessionInfo.CanCheckOutItem(dq.VersionID, CheckOutType.DocVersion, ref msg)) { dvil.Add(dq); sbDocVersions.AppendLine(msg); } else { ContentInfo.StaticContentInfoChange += new StaticContentInfoEvent(ContentInfo_StaticContentInfoChange); ProcessUpdateROValues(dq); ContentInfo.StaticContentInfoChange -= new StaticContentInfoEvent(ContentInfo_StaticContentInfoChange); pbProcess.PerformStep(); Application.DoEvents(); } } DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0} {1} Seconds Elapsed", pEnd.ToString("MM/dd/yyyy @ HH:mm"), TimeSpan.FromTicks(pEnd.Ticks - pStart.Ticks).TotalSeconds)); Application.DoEvents(); // when processing more than one procedure set, display only one completed message after all are processed if (ROFstInfo.MessageList != null) { FlexibleMessageBox.Show(ROFstInfo.MessageList.ToString(), "RO Update Complete"); ROFstInfo.MessageList = null; } if (dvil.Count > 0) { StringBuilder sb = new StringBuilder(); sb.AppendLine("The batch update process was not successful for all working drafts selected."); sb.AppendLine("The following working drafts were not able to be refreshed..."); sb.AppendLine(); sb.AppendLine(sbDocVersions.ToString()); sb.AppendLine(); sb.AppendLine("If you want to update these working drafts, please contact the respective users and have them close any procedures in the working draft."); sb.AppendLine("Once this is complete you can continue the process otherwise you may terminate the process immediately."); sb.AppendLine(); sb.AppendLine("Have you requested the users to close the procedures and do you want to continue the process?"); frmBatchRefreshCheckedOut frmCO = new frmBatchRefreshCheckedOut(); frmCO.MySessionInfo = MySessionInfo; //frmCO.CheckedOutProcedures = dvil; frmCO.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - frmCO.Width, Screen.PrimaryScreen.WorkingArea.Height - frmCO.Height); frmCO.Show(this); while (!this.Visible) Application.DoEvents(); } } this.Cursor = Cursors.Default; } // B2018-002 - Invalid Transitions - Define Transition Refresh Statistics private int numTransProcessed = 0; private int numTransFixed = 0; private int numTransConverted = 0; // B2018-002 - Invalid Transitions - Initialize Transition Refresh Statistics private void ResetTransNumbers() { numTransProcessed = 0; numTransFixed = 0; numTransConverted = 0; } private void RefreshTransitions() { // B2018-002 - Invalid Transitions - Initialize Transition Refresh Statistics ResetTransNumbers(); this.Cursor = Cursors.WaitCursor; List pil = new List(); foreach (TreeNode tn in myProcedures.Keys) if (tn.Checked) pil.Add(myProcedures[tn]); //PopulateTransitionInfoLists(pil); DateTime pStart = DateTime.Now; txtProcess.AppendText("Refresh Transitions"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText("Refresh Transitions"); txtResults.AppendText(Environment.NewLine); Application.DoEvents(); pbProcess.Minimum = 0; pbProcess.Maximum = pil.Count; pbProcess.Step = 1; while (pil.Count > 0) { ContentInfo.StaticContentInfoChange += new StaticContentInfoEvent(ContentInfo_StaticContentInfoChange); StringBuilder sbProcs = new StringBuilder(); Queue piq = new Queue(); foreach (ProcedureInfo pi in pil) piq.Enqueue(pi); pil.Clear(); while (piq.Count > 0) { string msg = string.Empty; ProcedureInfo pq = piq.Dequeue(); if (!MySessionInfo.CanCheckOutItem(pq.ItemID, CheckOutType.Procedure, ref msg)) { pil.Add(pq); sbProcs.AppendLine(msg); } else { myFixes = new StringBuilder(); RefreshProcedureTransitions(pq); // B2018-002 - Invalid Transitions - Update Transition Refresh Statistics numTransConverted += ProcedureInfo.TranConvertCount; numTransProcessed += ProcedureInfo.TranCheckCount; numTransFixed += ProcedureInfo.TranFixCount; pbProcess.PerformStep(); Application.DoEvents(); } } if (numTransFixed == 0 && numTransConverted ==0) { txtResults.AppendText("No Transitions Needed Updated."); txtResults.AppendText(Environment.NewLine); } ContentInfo.StaticContentInfoChange -= new StaticContentInfoEvent(ContentInfo_StaticContentInfoChange); DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Transitions Checked: {0}",numTransProcessed)); txtProcess.AppendText(Environment.NewLine); // B2018-002 - Invalid Transitions - Display Transition Refresh Statistics txtProcess.AppendText(string.Format("Transitions Correct As Is: {0}",numTransProcessed - (numTransConverted + numTransFixed))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Transitions Modified: {0}", numTransFixed)); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Transitions Converted to text: {0}", numTransConverted)); Application.DoEvents(); if (pil.Count > 0) { StringBuilder sb = new StringBuilder(); sb.AppendLine("The batch refresh process was not usccessful for all procedures selected."); sb.AppendLine("The following procedures were not able to be refreshed..."); sb.AppendLine(); sb.AppendLine(sbProcs.ToString()); sb.AppendLine(); sb.AppendLine("If you want to refresh these prcoedures, please contact the respective users and have them close the procedures."); sb.AppendLine("Once this is complete you can continue the process otherwise you may terminate the process immediately."); sb.AppendLine(); sb.AppendLine("Have you requested the users to close the procedures and do you want to continue the process?"); frmBatchRefreshCheckedOut frmCO = new frmBatchRefreshCheckedOut(); frmCO.MySessionInfo = MySessionInfo; frmCO.CheckedOutProcedures = pil; frmCO.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - frmCO.Width, Screen.PrimaryScreen.WorkingArea.Height - frmCO.Height); frmCO.Show(this); while (!this.Visible) Application.DoEvents(); } } this.Cursor = Cursors.Default; // B2018-002 - Invalid Transitions - Display Transition Refresh Statisitic if (numTransFixed == 0 && numTransConverted ==0) MessageBox.Show(string.Format("{0} Transitions Checked.\n\nNo Transitions Modified.",numTransProcessed), "Refresh Transitions Completed"); else MessageBox.Show(string.Format("{0} Transitions Checked.\n\n {1} Correct as is.\n\n {2} Transitions modified.\n\n {3} Transitions converted to text.", numTransProcessed, numTransProcessed - (numTransFixed + numTransConverted),numTransFixed, numTransConverted), "Refresh Transitions Completed"); } // C2017-030 - new Admin Tools user interface // tool renamed to Refresh Word Attachments // removes the saved attachment PDFs from the database to force PROMS to regenerate them // the next time the procedures are printed. This also forces ROs to be refreshed in the attachments private void DeletePDFs() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Refreshing Word Attachments"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); int affectedRows = ESP_DeletePDFs.Execute("vesp_DeletePDFs"); txtProcess.AppendText(string.Format("Word Attachments Refreshed: {0}", affectedRows)); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("{0} Word Attachments Refreshed.", affectedRows)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; } // B2022-047 - refresh the Content/Text field for table, i.e. Grid, Data so that search will find text in the Grid // NOTE that an out of memeory error occurs when having to process alot of tables. A config flag is used on the // grid record to flag that this operation has been run. And a message is placed in the result window stating to // rerun until all tables/text fields are completed. private void RefreshTablesForSearch() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Refreshing Tables for Search"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}", pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); int affectedRows = RefreshForSearch(); if (affectedRows < 0) { txtProcess.AppendText(string.Format("Error occurred in processing, completed {0} rows. Run again!", -affectedRows)); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("Error occurred in processing, completed {0} rows. Run again!", -affectedRows)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); affectedRows = -affectedRows; } txtProcess.AppendText(string.Format("Tables for Search Refreshed: {0}", affectedRows)); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("{0} Tables for Search Refreshed.", affectedRows)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}", pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; } private int RefreshForSearch() { int cntfix = 0; List gids = GridInfoList.GetIds(); // get all grids in database pbProcess.Minimum = 0; pbProcess.Maximum = gids.Count; pbProcess.Step = 1; foreach (int cid in gids) { using (Content cc = Content.Get(cid)) { StepConfig sc = new StepConfig(cc.Config); if (!sc.Step_FixedTblForSrch) // if not processed through this code already, get searchable text & save { try { using (VlnFlexGrid MyFlexGrid = new VlnFlexGrid(cc.ContentItems[0])) { using (StringReader sr = new StringReader(cc.MyGrid.Data)) { MyFlexGrid.ReadXml(sr); sr.Close(); } string srchtxt = MyFlexGrid.GetSearchableText(); if (cc.Text != srchtxt) { cntfix++; cc.UserID = Volian.Base.Library.VlnSettings.UserID; cc.DTS = DateTime.Now; cc.Text = srchtxt; } sc.Step_FixedTblForSrch = true; cc.Config = sc.ToString(); cc.Save(); } } catch (Exception ex) { this.Cursor = Cursors.Default; return -cntfix; } } pbProcess.PerformStep(); Application.DoEvents(); } } return cntfix; } // C2017-030 - new Admin Tools user interface // tool renamed to Identify Orphan Items private void IdentifyDisconnectedItems() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Identifing Orphan Items"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); int rowCount = ESP_IdentifyDisconnectedItems.Execute("vesp_GetDisconnectedItemsCount"); txtProcess.AppendText(string.Format("Orphan Items Count: {0}", rowCount)); txtProcess.AppendText(Environment.NewLine); if (rowCount > 0) { txtResults.AppendText(string.Format("The database contains {0} Orphan items.", rowCount)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText("These can be removed via the Remove Orphan Data Records in the Repair tools"); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } else { txtResults.AppendText("No Orphan Records Found");// B2017-108 Always output results even if there isn't any txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; //MessageBox.Show(string.Format("{0} Completed", "Orphan Items Check"), "Orphan Items"); } // C2017-030 - new Admin Tools user interface // tool renamed to Remove Orphan Items private void PurgeDisconnectedItems() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Purging Orphan Items"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); int rowCount = ESP_IdentifyDisconnectedItems.Execute("vesp_GetDisconnectedItemsCount"); if (rowCount > 0) { ESP_PurgeDisconnectedItems.Execute("vesp_PurgeDisconnectedData"); int rowCount2 = ESP_IdentifyDisconnectedItems.Execute("vesp_GetDisconnectedItemsCount"); txtProcess.AppendText(string.Format("Orphan Items Purged: {0}", rowCount)); txtProcess.AppendText(Environment.NewLine); //txtProcess.AppendText(Environment.NewLine); //txtResults.Clear(); txtResults.AppendText(string.Format("The database contained {0} Orphan items.", rowCount)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("The database now contains {0} Orphan items.", rowCount2)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); if (rowCount2 > 0) { txtResults.AppendText("** Some or all Orphan items could not be purged.**"); txtResults.AppendText("** It is recommended you contact Volian to assist in resolving this condition.**"); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } } else { //txtResults.Clear(); txtResults.AppendText(string.Format("The database contained {0} Orphan items.", rowCount)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("No Orpan Items to Purge!")); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; } // C2017-030 - new Admin Tools user interface // is one of two tools run from Check Obsolete RO Data private void IdentifyUnusedRoFstsAndFigures() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Identifing Unused RoFsts and Figures"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); int rowCountRoFst = ESP_GetUnusedRoFsts.Execute("vesp_GetUnusedRoFstsCount"); int rowCountFigures = ESP_GetUnusedFigures.Execute("vesp_GetUnusedFiguresCount"); txtProcess.AppendText(string.Format("Unused RoFsts Count: {0}, Unused Figures Count: {1}", rowCountRoFst, rowCountFigures)); txtProcess.AppendText(Environment.NewLine); if (rowCountRoFst > 0 || rowCountFigures > 0) { txtResults.AppendText(string.Format("The database contains {0} unused RoFsts.", rowCountRoFst)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("The database contains {0} unused Figures items.", rowCountFigures)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } else { txtResults.AppendText("No Unused RoFsts or Figures Found"); // B2017-108 Always output results even if there isn't any txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; } // C2017-030 - new Admin Tools user interface is one of two tools run from Remove Obsolete RO Data private void RemoveUnusedRoFstsAndFigures() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Purging Unused RoFSTs and Figures Items"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); int rowCountRoFst = ESP_GetUnusedRoFsts.Execute("vesp_GetUnusedRoFstsCount"); int rowCountFigures = ESP_GetUnusedFigures.Execute("vesp_GetUnusedFiguresCount"); if (rowCountRoFst > 0 || rowCountFigures > 0) { ESP_PurgeUnusedRoFstsAndFigures.Execute("vesp_RemoveUnusedRoFstsAndFigures"); int rowCountRoFst2 = ESP_GetUnusedRoFsts.Execute("vesp_GetUnusedRoFstsCount"); int rowCountFigures2 = ESP_GetUnusedFigures.Execute("vesp_GetUnusedFiguresCount"); txtProcess.AppendText(string.Format("{0} Unsed ROFSTs Purged", rowCountRoFst)); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("{0} Unsed Figures Purged", rowCountFigures)); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("The database contained {0} unused ROFSTs.", rowCountRoFst)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("The database contained {0} unused Figures items.", rowCountFigures)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("The database now contains {0} unused ROFSTs.", rowCountRoFst2)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("The database now contains {0} unused Figures.", rowCountFigures2)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); if (rowCountRoFst2 > 0 || rowCountFigures2 > 0) { txtResults.AppendText("** Could not purge all or some of the unsed ROFSTs and Figures.** "); txtResults.AppendText("** It is recommended you contact Volian to assist in resolving this condition. **"); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } } else { txtProcess.AppendText(string.Format("The database contained {0} unused RoFSTs or Figures.", rowCountRoFst + rowCountFigures)); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("No Unused ROFSTs To Remove.")); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; } // C2017-030 - new Admin Tools user interface // is one of two tools run from Check Obsolete RO Data private void IdentifyROAssociations() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Identifing Unused RO Associations"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); int rowCount = ESP_GetROAssoc.Execute("vesp_GetUnusedROAssociationsCount"); txtProcess.AppendText(string.Format("Unused RO Associations Count: {0}", rowCount)); txtProcess.AppendText(Environment.NewLine); if (rowCount > 0) { txtResults.AppendText(string.Format("The database contains {0} unused RO Associations.", rowCount)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } else { txtResults.AppendText("No unused RO Associations Found");// B2017-108 Always output results even if there isn't any txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; } // C2017-030 - new Admin Tools user interface // is one of two tools run from Remove Obsolete RO Data private void CleanUpROAssociations() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Purging Unused Referenced Object Associations"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); int rowCount = ESP_GetROAssoc.Execute("vesp_GetUnusedROAssociationsCount"); if (rowCount > 0) { ESP_CleanupROAssoc.Execute("vesp_GetUnusedROAssociationsCount"); int rowCount2 = ESP_GetROAssoc.Execute("vesp_GetUnusedROAssociationsCount"); txtProcess.AppendText(string.Format("{0} Unused Referenced Object Associations Purged", rowCount)); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("The database contained {0} Unused RO Associations.", rowCount)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("The database now contains {0} Unused RO Associations.", rowCount2)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); if (rowCount2 > 0) { txtResults.AppendText("** Could not purge all or some of the Unused RO Associations.** "); txtResults.AppendText("** It is recommended you contact Volian to assist in resolving this condition.**"); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } } else { txtResults.AppendText(string.Format("The database contained {0} Unused RO Associations.", rowCount)); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(string.Format("No Unused RO Associations to Purge.")); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; } // C2017-030 - new Admin Tools user interface // tool was renamed to Hidden Data Locations (on Check list) private void IdentifyNonEditableItems() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Identifing Hidden Item Locations"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); List myItems = ESP_IdentifyNonEditableItems.Execute("vesp_GetNonEditableItems"); txtProcess.AppendText(string.Format("Hidden Items Count: {0}",myItems.Count)); txtProcess.AppendText(Environment.NewLine); if (myItems.Count > 0) { txtResults.AppendText("The following items are hidden (non-editable)..."); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); foreach (ItemInfo ii in myItems) { txtResults.AppendText(ii.Path); txtResults.AppendText(Environment.NewLine); } txtResults.AppendText(Environment.NewLine); } else { txtResults.AppendText("No Hidden Data Found");// B2017-108 Always output results even if there isn't any txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); } DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); this.Cursor = Cursors.Default; } // C2017-030 - new Admin Tools user interface // tool was renamed to Show Users private void GetDatabaseSessions() { this.Cursor = Cursors.WaitCursor; DateTime pStart = DateTime.Now; txtProcess.AppendText("Show Users in PROMS"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(string.Format("Started: {0}",pStart.ToString("MM/dd/yyyy @ HH:mm"))); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); txtResults.Clear(); txtResults.AppendText(ESP_GetDatabaseSessions.Execute("vesp_GetDatabaseSessions")); DateTime pEnd = DateTime.Now; txtProcess.AppendText(string.Format("Completed: {0}",pEnd.ToString("MM/dd/yyyy @ HH:mm"))); Application.DoEvents(); this.Cursor = Cursors.Default; MessageBox.Show( "Show Users Completed", "Show Users"); } private void ProcessUpdateROValues(DocVersionInfo dq) { string statmsg = string.Format("Updating ROs for {0}", dq.MyFolder.Name); InitialProgressBarMessage = statmsg; txtProcess.AppendText(statmsg); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText(statmsg); txtResults.AppendText(Environment.NewLine); Application.DoEvents(); if (dq.DocVersionAssociationCount < 1) { ProgressBar.ColorTable = eProgressBarItemColor.Error; FinalProgressBarMessage = "No ROs associated"; txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText("Error Updating ro.fst. No associated ro.fst"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText("Error Updating ro.fst. No associated ro.fst"); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); return; } ROFstInfo roFstInfo = dq.DocVersionAssociations[0].MyROFst; string rofstPath = roFstInfo.MyRODb.FolderPath + @"\ro.fst"; //if (!pathExists(rofstPath)) if (!File.Exists(rofstPath)) { ProgressBar.ColorTable = eProgressBarItemColor.Error; FinalProgressBarMessage = "No existing RO.FST"; txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText("No existing ro.fst in path " + roFstInfo.MyRODb.FolderPath + ". Check for invalid path"); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText("No existing ro.fst in path " + roFstInfo.MyRODb.FolderPath + ". Check for invalid path"); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); return; } //FileInfo fiRofst = new FileInfo(rofstPath); Cursor = Cursors.WaitCursor; using (DocVersion dv = DocVersion.Get(dq.VersionID)) { // B2022-026 RO Memory Reduction code - first load the new ro.fst so that we can assign the ROTableUpdate event to the correct roFstInfo if (dv.ROfstLoadingFigures || dv.NewerRoFst) // B2017-125 see if loading figures was completed { // only load the RO.fst ROFstInfo.UpdateRoFst(roFstInfo.MyRODb, dv, roFstInfo, DoProgressBarRefresh); roFstInfo = dq.DocVersionAssociations[0].MyROFst; } roFstInfo.ROTableUpdate += new ROFstInfoROTableUpdateEvent(roFstInfo_ROTableUpdate); ROFst newrofst = ROFstInfo.RefreshROFst(dv, roFstInfo, DoProgressBarRefresh, txtProcess); roFstInfo.ROTableUpdate -= new ROFstInfoROTableUpdateEvent(roFstInfo_ROTableUpdate); } Cursor = Cursors.Default; ProgressBar.ColorTable = eProgressBarItemColor.Normal; FinalProgressBarMessage = "ROs values updated"; txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); txtResults.AppendText("ROs values updated"); txtResults.AppendText(Environment.NewLine); txtResults.AppendText(Environment.NewLine); return; } private void RefreshProcedureTransitions(ProcedureInfo pq) { DateTime start = DateTime.Now; ProcedureInfo.ResetTranCounters(); ProcedureInfo.RefreshTransitions(pq);//, transitionsToDisconnected, transitionsToNonEditable); TimeSpan ts = DateTime.Now - start; // B2018-002 - Invalid Transitions - Display Transition Refresh Statistics txtProcess.AppendText(string.Format("Procedure: {1}{0}Checked {2} Transitions{0}Fixed {3} Transitions{0}Converted to Text {4} Transitions{0}Elapsed Seconds:{5}{0}{0}", Environment.NewLine, pq.DisplayNumber, ProcedureInfo.TranCheckCount, ProcedureInfo.TranFixCount, ProcedureInfo.TranConvertCount, ts.TotalSeconds)); //Console.WriteLine("\"{0}\"\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}", pq.DisplayNumber, ProcedureInfo.TranCheckCount, ProcedureInfo.TranFixCount, ProcedureInfo.TranConvertCount, ts.TotalSeconds, numTransProcessed, numTransFixed, numTransConverted); if (myFixes.Length > 0) { txtResults.AppendText(myFixes.ToString()); txtResults.AppendText(Environment.NewLine); } } public List roFstInfo_ROTableUpdate(object sender, ROFstInfoROTableUpdateEventArgs args) { return VlnFlexGrid.ROTableUpdate(sender, args); } private void PopulateTransitionInfoLists(List pil) { Dictionary dic = new Dictionary(); StringBuilder sb = new StringBuilder(); foreach (ProcedureInfo pi in pil) if (!dic.ContainsKey(pi.MyDocVersion.VersionID)) { dic.Add(pi.MyDocVersion.VersionID, pi.MyDocVersion.VersionID); sb.Append(sb.Length == 0 ? pi.MyDocVersion.VersionID.ToString() : "," + pi.MyDocVersion.VersionID.ToString()); } txtProcess.AppendText("Preparing to process..."); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); //transitionsToDisconnected = TransitionInfoList.GetTransitionsToDisconnected(sb.ToString()); //transitionsToNonEditable = TransitionInfoList.GetTransitionsToNonEditable(sb.ToString()); } private void ProgressBarShowText() { pbProcess.Refresh(); int percent = (int)(((double)(pbProcess.Value - pbProcess.Minimum) / (double)(pbProcess.Maximum - pbProcess.Minimum)) * 100); using (Graphics gr = pbProcess.CreateGraphics()) { gr.DrawString(percent.ToString() + "%", SystemFonts.DefaultFont, Brushes.Black, new PointF(pbProcess.Width / 2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Width / 2.0F), pbProcess.Height / 2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Height / 2.0F))); } Application.DoEvents(); } StringBuilder myFixes; int myFixesCount = 0; int myConvertCount = 0; // show the changes made in the Results pannel, include the ItemId of the step element void ContentInfo_StaticContentInfoChange(object sender, StaticContentInfoEventArgs args) { if (args.Type == "TX") { myFixesCount++; if (args.NewValue.StartsWith("Reason for Change:")) myFixes.AppendLine(string.Format("Fixed Transition for {1}({4}){0}Old Text: {2}{0}{3}{0}", Environment.NewLine, (sender as ItemInfo).ShortPath, args.OldValue, args.NewValue, (sender as ItemInfo).ItemID)); else myFixes.AppendLine(string.Format("Fixed Transition for {1}({4}){0}Old Text: {2}{0}New Text: {3}{0}", Environment.NewLine, (sender as ItemInfo).ShortPath, args.OldValue, args.NewValue, (sender as ItemInfo).ItemID)); } else if (args.Type == "RO") { txtResults.AppendText(string.Format("Fixed Referenced Object for {1}({4}){0}Old Text: {2}{0}New Text: {3}{0}{0}", Environment.NewLine, (sender as ItemInfo).ShortPath, args.OldValue, args.NewValue, (sender as ItemInfo).ItemID)); Application.DoEvents(); //myFixes.AppendLine(string.Format("Fixed Referenced Object for {1}{0}Old Text: {2}{0}New Text: {3}{0}", Environment.NewLine, (sender as ItemInfo).ShortPath, args.OldValue, args.NewValue)); } else // B2018-002 - Invalid Transitions - Display Transition Cconversion Statistics { myFixes.AppendLine(string.Format("Converted Transition to text for {0}({1})", (sender as ItemInfo).ShortPath, (sender as ItemInfo).ItemID)); } } private void btnClear_Click(object sender, EventArgs e) { txtResults.Clear(); } private void btnSave_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.DefaultExt = "txt"; sfd.AddExtension = true; sfd.Filter = "Text Files (*.txt)|*.txt"; sfd.FileName = string.Format("BatchRefreshResults_{0}", DateTime.Now.ToString("yyyyMMdd_HHmm")); sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\VEPROMS"; DialogResult dr = sfd.ShowDialog(); if (dr == DialogResult.OK) { System.IO.StreamWriter sw = new System.IO.StreamWriter(sfd.FileName); sw.Write(txtResults.Text); sw.Close(); } } private void myTV_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action != TreeViewAction.Unknown) { if (e.Node.Nodes.Count > 0) { CheckChildNodes(e.Node, e.Node.Checked); } } btnFixLinks.Enabled = AtLeastOneNodeChecked(); // C2017-030 support for Refresh Transitions/Update RO Values } private void CheckChildNodes(TreeNode treeNode, bool ischecked) { foreach (TreeNode tn in treeNode.Nodes) { tn.Checked = ischecked; if (tn.Nodes.Count > 0) { CheckChildNodes(tn, ischecked); } } } private ProgressBarItem _ProgressBar = null; public ProgressBarItem ProgressBar { get { return _ProgressBar; } set { _ProgressBar = value; _ProgressBar.TextVisible = true; } } private void DoProgressBarRefresh(int value, int max, string text) { if (ProgressBar == null) return; ProgressBar.Maximum = max; ProgressBar.Value = value; ProgressBar.Text = text; Application.DoEvents(); } private string InitialProgressBarMessage { set { if (ProgressBar == null) return; ProgressBar.Maximum = 100; ProgressBar.Value = 0; ProgressBar.Text = value; txtProcess.AppendText(value); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); } } private string FinalProgressBarMessage { set { if (ProgressBar == null) return; ProgressBar.Value = 100; ProgressBar.Maximum = 100; ProgressBar.Text = value; txtProcess.AppendText(value); txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine); Application.DoEvents(); } } private void chkLater_CheckedChanged(object sender, EventArgs e) { pnlLater.Enabled = chkLater.Checked; } // C2017-030 new Admin Tools user interface private void sideNavItmCheck_Click(object sender, EventArgs e) { AdminToolType = E_AdminToolType.Check; lblAdmToolProgressType.Text = "Checking:"; setupProgessSteps1(); } // C2017-030 new Admin Tools user interface private void sideNavItmRepair_Click(object sender, EventArgs e) { AdminToolType = E_AdminToolType.Repair; lblAdmToolProgressType.Text = "Repairing:"; setupProgessSteps1(); if (!IsAdministratorUser) // C2020-035 notify Set Amin user that only Full Admins can run repair tools { MessageBox.Show("Only Full PROMS Administrator Users can run these data repair tools", "Data Repair Tools", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } // C2017-030 new Admin Tools user interface private void sideNavItmLinks_Click(object sender, EventArgs e) { AdminToolType = E_AdminToolType.Links; setupProgessSteps1(); if (swUpdateROVals.Value) ResetTV(true); else ResetTV(false); } // C2017-030 new Admin Tools user interface private void sideNavItmUsers_Click(object sender, EventArgs e) { AdminToolType = E_AdminToolType.Users; setupProgessSteps1(); } // C2017-030 new Admin Tools user interface private void sideNavItmExit_Click(object sender, EventArgs e) { this.Close(); } #region On/Off Swiches // C2017-030 new Admin Tools user interface private enum E_AdminToolType : int { Check = 0, Repair = 1, Links = 2, Users = 3 }; private E_AdminToolType AdminToolType = 0; DevComponents.DotNetBar.StepItem siOrphDatRecs = new DevComponents.DotNetBar.StepItem("siOrphDatRecs", "Orphan Data Records"); DevComponents.DotNetBar.StepItem siHiddenDataLocs = new DevComponents.DotNetBar.StepItem("siHiddenDataLocs", "Hidden Data"); DevComponents.DotNetBar.StepItem siObsoleteROData = new DevComponents.DotNetBar.StepItem("siObsoleteROData", "Obsolete RO Data"); DevComponents.DotNetBar.StepItem siStandardHyphens = new DevComponents.DotNetBar.StepItem("siStandardHyphens", "Standardize Hyphens"); DevComponents.DotNetBar.StepItem siRefreshAttmts = new DevComponents.DotNetBar.StepItem("siRefreshAttmts", "Refresh Word Attachments"); DevComponents.DotNetBar.StepItem siRefreshTblsSrchTxt = new DevComponents.DotNetBar.StepItem("siRefreshTblsSrchTxt", "Refresh Tables For Search"); // this will update/rebuild the progress bar in the bottom panel of Admin Tools private void setupProgessSteps1() { progressSteps1.Visible = false; progressSteps1.Items.Clear(); switch (AdminToolType) { case E_AdminToolType.Check: if (swCkOrphanDataRecs.Value) progressSteps1.Items.Add(siOrphDatRecs); if (swHiddenDataLocs.Value) progressSteps1.Items.Add(siHiddenDataLocs); if (swCkObsoleteROData.Value) progressSteps1.Items.Add(siObsoleteROData); splitContainer3.Panel2Collapsed = false; progressSteps1.Visible = true; progressSteps1.Refresh(); break; case E_AdminToolType.Repair: if (swRmOrphanDataRecs.Value) progressSteps1.Items.Add(siOrphDatRecs); if (swRmObsoleteROData.Value) progressSteps1.Items.Add(siObsoleteROData); if (swStandardHypenChars.Value) progressSteps1.Items.Add(siStandardHyphens); if (swRefreshWordAttmts.Value) progressSteps1.Items.Add(siRefreshAttmts); if (swRefreshTblsForSrch.Value) progressSteps1.Items.Add(siRefreshTblsSrchTxt); splitContainer3.Panel2Collapsed = false; progressSteps1.Visible = true; progressSteps1.Refresh(); break; case E_AdminToolType.Links: case E_AdminToolType.Users: splitContainer3.Panel2Collapsed = true; progressSteps1.Visible = false; break; } } // used for all of the Switch buttons (ON/OFF buttons) private void swCk_ValueChanged(object sender, EventArgs e) { setupProgessSteps1(); } private void swUpdateROVals_ValueChanged(object sender, EventArgs e) { if (swUpdateROVals.Value) { swRefreshTrans.Value = false; ResetTV(true); } } private void swRefreshTrans_ValueChanged(object sender, EventArgs e) { if (swRefreshTrans.Value) { swUpdateROVals.Value = false; ResetTV(false); } } #endregion // C2017-030 New Admin Tools user interface // functions to handle the progress bar in the bottom panel of Admin Tools private void StepProgress(int prgStpIdx, int val) { ((DevComponents.DotNetBar.StepItem)progressSteps1.Items[prgStpIdx]).Value = val; return; } private void ClearStepProgress() { for (int i = 0; i < progressSteps1.Items.Count; i++) { ((DevComponents.DotNetBar.StepItem)progressSteps1.Items[i]).Value = 0; } } // C2017-030 New Admin Tools user interface // button clicks for processing selected tools //B2017-221 Allow the batch dialog to close when waiting to process. private bool CheckProcessLater() // see if we should delay processing until later { if (chkLater.Checked) { long later = long.Parse(dtpDate.Value.ToString("yyyyMMdd") + dtpTime.Value.ToString("HHmm")); long now = long.Parse(DateTime.Now.ToString("yyyyMMddHHmm")); while (now < later) { txtProcess.Clear(); txtProcess.AppendText("Waiting..."); System.Threading.Thread.Sleep(1000);//Check each second if (IsClosing) return false;//B2017-221 Allow the batch dialog to close when waiting to process. Application.DoEvents();// Allow user interface to react now = long.Parse(DateTime.Now.ToString("yyyyMMddHHmm")); } } return true;// Close after complete } // C2017-030 new Admin Tools user interface private void btn_ShowUsers_Click(object sender, EventArgs e) { if (!CheckProcessLater()) return; // delay processing if set//B2017-221 Allow the batch dialog to close when waiting to process. txtProcess.Clear(); txtResults.Clear(); GetDatabaseSessions(); } private void btnFixLinks_Click(object sender, EventArgs e) { if (!CheckProcessLater()) return; // delay processing if set//B2017-221 Allow the batch dialog to close when waiting to process. txtProcess.Clear(); txtResults.Clear(); if (swRefreshTrans.Value) RefreshTransitions(); if (swUpdateROVals.Value) UpdateROValues(); } private void btnRunCheck_Click(object sender, EventArgs e) { if (!CheckProcessLater()) return; // delay processing if set//B2017-221 Allow the batch dialog to close when waiting to process. int prgStpIdx = -1; txtResults.Clear(); txtProcess.Clear(); if (swCkOrphanDataRecs.Value) { StepProgress(++prgStpIdx, 50); IdentifyDisconnectedItems(); // orphan items StepProgress(prgStpIdx, 100); } if (swHiddenDataLocs.Value) { StepProgress(++prgStpIdx, 50); IdentifyNonEditableItems(); // hidden items StepProgress(prgStpIdx, 100); } if (swCkObsoleteROData.Value) { StepProgress(++prgStpIdx, 25); IdentifyROAssociations(); StepProgress(prgStpIdx, 50); IdentifyUnusedRoFstsAndFigures(); StepProgress(prgStpIdx, 100); } MessageBox.Show("Check Functions Completed", "Check"); ClearStepProgress(); } private void btnRunRepair_Click(object sender, EventArgs e) { if (!CheckProcessLater()) return; // delay processing if set//B2017-221 Allow the batch dialog to close when waiting to process. int prgStpIdx = -1; txtResults.Clear(); txtProcess.Clear(); if (swRmOrphanDataRecs.Value) { StepProgress(++prgStpIdx, 50); PurgeDisconnectedItems(); // Orphan Items StepProgress(prgStpIdx, 100); } if (swRmObsoleteROData.Value) { StepProgress(++prgStpIdx, 25); CleanUpROAssociations(); StepProgress(prgStpIdx, 50); RemoveUnusedRoFstsAndFigures(); StepProgress(prgStpIdx, 100); } if (swStandardHypenChars.Value) { StepProgress(++prgStpIdx, 50); FixHyphens(); StepProgress(prgStpIdx, 100); } if (swRefreshWordAttmts.Value) { StepProgress(++prgStpIdx, 50); DeletePDFs(); // refresh word attachments StepProgress(prgStpIdx, 100); } if (swRefreshTblsForSrch.Value) { StepProgress(++prgStpIdx, 50); RefreshTablesForSearch(); StepProgress(prgStpIdx, 100); } MessageBox.Show("Repair Functions Completed", "Repair"); ClearStepProgress(); } } }