1375 lines
52 KiB
C#

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<TreeNode, ProcedureInfo> myProcedures = new Dictionary<TreeNode, ProcedureInfo>();
private Dictionary<TreeNode, DocVersionInfo> myDocVersions = new Dictionary<TreeNode, DocVersionInfo>();
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<string> myTreeNodePath;
private void ResetTV()
{
ResetTV(false);
}
private void ResetTV(bool noProcs)
{
btnFixLinks.Enabled = false;
this.Cursor = Cursors.WaitCursor;
//myTreeNodePath = new List<string>();
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<DocVersionInfo> dvil = new List<DocVersionInfo>();
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<DocVersionInfo> dviq = new Queue<DocVersionInfo>();
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<ProcedureInfo> pil = new List<ProcedureInfo>();
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<ProcedureInfo> piq = new Queue<ProcedureInfo>();
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<int> 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<ItemInfo> 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<string> roFstInfo_ROTableUpdate(object sender, ROFstInfoROTableUpdateEventArgs args)
{
return VlnFlexGrid.ROTableUpdate(sender, args);
}
private void PopulateTransitionInfoLists(List<ProcedureInfo> pil)
{
Dictionary<int, int> dic = new Dictionary<int, int>();
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();
}
}
}