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; } } // 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 } // 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) { } // 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; } private void LoadChildFolders(FolderInfo fi, TreeNode tn, bool noProcs) { foreach (FolderInfo fic in fi.SortedChildFolders) { TreeNode tnc = tn.Nodes.Add(fic.Name); tnc.Tag = fic; if (fic.ChildFolderCount > 0) LoadChildFolders(fic, tnc, noProcs); if (fic.FolderDocVersionCount > 0) LoadDocVersions(fic, tnc, noProcs); } } private void LoadDocVersions(FolderInfo fic, TreeNode tnc, bool noProcs) { 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); } myTreeNodePath.Add(tnc.FullPath); } else { while (tnc != null && tnc.Text != "VEPROMS" && !IsUsedPath(tnc.FullPath)) { TreeNode tmp = tnc.Parent; tnc.Remove(); tnc = tmp; } } } } private bool IsUsedPath(string path) { foreach (string s in myTreeNodePath) { if (s.StartsWith(path)) return true; } return false; } 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 usccessful 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; } private void RefreshTransitions() { int numTransProcessed = 0; int numTransFixed = 0; 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(); myFixesCount = 0; int lastFixedCount = myFixesCount; RefreshProcedureTransitions(pq); numTransProcessed += ProcedureInfo.TranCheckCount; numTransFixed += ProcedureInfo.TranFixCount = myFixesCount - lastFixedCount; pbProcess.PerformStep(); Application.DoEvents(); } } if (numTransFixed == 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); txtProcess.AppendText(string.Format("Transitions Fixed: {0}",numTransFixed)); 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; if (numTransFixed == 0) MessageBox.Show(string.Format("{0} Transitions Checked.\n\nNo Transitions needed fixed.",numTransProcessed), "Refresh Transitions Completed"); else MessageBox.Show(string.Format("{0} Transitions Checked.\n\n {1} Transitions needed fixed.", numTransProcessed, numTransFixed), "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; } // 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(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 (!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)) { roFstInfo.ROTableUpdate += new ROFstInfoROTableUpdateEvent(roFstInfo_ROTableUpdate); ROFst newrofst = ROFstInfo.RefreshROFst(roFstInfo.MyRODb, dv.DocVersionAssociations[0], 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; int lastFixesCount = myFixesCount; ProcedureInfo.ResetTranCounters(); ProcedureInfo.RefreshTransitions(pq);//, transitionsToDisconnected, transitionsToNonEditable); TimeSpan ts = DateTime.Now - start; txtProcess.AppendText(string.Format("Procedure: {1}{0}Checked {2} Transitions{0}Fixed {3} Transitions{0}Elapsed Seconds:{4}{0}{0}", Environment.NewLine, pq.DisplayNumber, ProcedureInfo.TranCheckCount,myFixesCount - lastFixesCount, ts.TotalSeconds)); 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; // 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)); } } 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(); } // 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"); // 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); 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 private void 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(60000); now = long.Parse(DateTime.Now.ToString("yyyyMMddHHmm")); } } } // C2017-030 new Admin Tools user interface private void btn_ShowUsers_Click(object sender, EventArgs e) { CheckProcessLater(); // delay processing if set txtProcess.Clear(); txtResults.Clear(); GetDatabaseSessions(); } private void btnFixLinks_Click(object sender, EventArgs e) { CheckProcessLater(); // delay processing if set txtProcess.Clear(); txtResults.Clear(); if (swRefreshTrans.Value) RefreshTransitions(); if (swUpdateROVals.Value) UpdateROValues(); } private void btnRunCheck_Click(object sender, EventArgs e) { CheckProcessLater(); // delay processing if set 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) { CheckProcessLater(); // delay processing if set 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); } MessageBox.Show("Repair Functions Completed", "Repair"); ClearStepProgress(); } } }