diff --git a/PROMS/Volian.Controls.Library/AnnotationDetails.cs b/PROMS/Volian.Controls.Library/AnnotationDetails.cs index e9f11f14..6436666b 100644 --- a/PROMS/Volian.Controls.Library/AnnotationDetails.cs +++ b/PROMS/Volian.Controls.Library/AnnotationDetails.cs @@ -109,16 +109,17 @@ namespace Volian.Controls.Library private void btnRemoveAnnotation_Click(object sender, EventArgs e) { - using (Annotation annotation = CurrentAnnotation.Get()) - { - annotation.Delete(); + //using (Annotation annotation = CurrentAnnotation.Get()) + //{ +// annotation.Delete(); _AnnotationSearch.LoadingList = true; - annotation.Save(); + Annotation.DeleteAnnotation(CurrentAnnotation); +// annotation.Save(); _AnnotationSearch.LoadingList = false; CurrentAnnotation = null; UpdateAnnotationGrid(); //_AnnotationSearch.UpdateAnnotationSearchResults(); // update the search results - } + //} } private void btnSaveAnnotation_Click(object sender, EventArgs e) @@ -286,8 +287,8 @@ namespace Volian.Controls.Library using (Annotation annotation = Annotation.MakeAnnotation(myItem, annotationType, rtxbComment.Rtf, rtxbComment.Text, "")) { CurrentAnnotation = AnnotationInfo.Get(annotation.AnnotationID); - annotation.DTS = DateTime.Now; - annotation.Save(); + //annotation.DTS = DateTime.Now; + //annotation.Save(); } } } diff --git a/PROMS/Volian.Controls.Library/DisplayHistory.cs b/PROMS/Volian.Controls.Library/DisplayHistory.cs new file mode 100644 index 00000000..72732a8d --- /dev/null +++ b/PROMS/Volian.Controls.Library/DisplayHistory.cs @@ -0,0 +1,875 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using VEPROMS.CSLA.Library; +using System.IO; +using System.Text.RegularExpressions; + +namespace Volian.Controls.Library +{ + public partial class DisplayHistory : UserControl + { + #region Events + public event DisplayHistoryReportEvent ChronologyPrintRequest; + public event DisplayHistoryReportEvent SummaryPrintRequest; + private void OnChronologyPrintRequest(DisplayHistoryReportEventArgs args) + { + if (ChronologyPrintRequest != null) + ChronologyPrintRequest(this, args); + } + private void OnSummaryPrintRequest(DisplayHistoryReportEventArgs args) + { + if (SummaryPrintRequest != null) + SummaryPrintRequest(this, args); + } + public event DisplayHistoryEvent HistorySelectionChanged; + private void OnHistorySelectionChanged(DisplayHistoryEventArgs args) + { + if (HistorySelectionChanged != null) + HistorySelectionChanged(this, args); + } + public event ItemRestoredHandler ItemRestored; + private void OnItemRestored(ItemInfo restoredItemInfo) + { + if (ItemRestored != null) ItemRestored(restoredItemInfo); + } + #endregion + private ContentAuditInfoList _ChronologyAuditList; + private ContentAuditInfoList _SummaryAuditList; + private AnnotationAuditInfoList _AnnotationList; + private ProcedureInfo _MyProcedureInfo; + public ProcedureInfo MyProcedureInfo + { + get { return _MyProcedureInfo; } + set + { + if (value is ProcedureInfo && _MyProcedureInfo is ProcedureInfo && value.ItemID == _MyProcedureInfo.ItemID) + return; + _MyProcedureInfo = value; + if (_MyProcedureInfo != null && this.Visible) + WalkProcedure(); + } + } + private ItemInfo _MyItemInfo; + public ItemInfo MyItemInfo + { + get { return _MyItemInfo; } + set + { + if (value is ItemInfo && _MyItemInfo is ItemInfo && value.ItemID == _MyItemInfo.ItemID) + return; + _MyItemInfo = value; + if (_MyItemInfo != null) + { + MyProcedureInfo = _MyItemInfo.MyProcedure; + if(this.Visible) + UpdateHistory(); + } + } + } + private EditItem _MyEditItem; + + public EditItem MyEditItem + { + get { return _MyEditItem; } + set + { + _MyEditItem = value; + if (value != null) + MyItemInfo = value.MyItemInfo; + else + MyItemInfo = null; + } + } + public void RefreshList() + { + if (this.Visible) + { + WalkProcedure(); + UpdateHistory(); + } + } + + public DisplayHistory() + { + InitializeComponent(); + myRTB.FormatFont = null; + } + + private void lbChanges_SelectedIndexChanged(object sender, EventArgs e) + { + if (lbChanges.SelectedIndex > -1) + { + if (lbChanges.SelectedIndex < _ChronologyAuditList.Count) + { + ContentAuditInfo cai = _ChronologyAuditList[lbChanges.SelectedIndex]; + OnHistorySelectionChanged(new DisplayHistoryEventArgs(cai.ItemID)); + } + else + { + AnnotationAuditInfo aai = _AnnotationList[lbChanges.SelectedIndex - _ChronologyAuditList.Count]; + OnHistorySelectionChanged(new DisplayHistoryEventArgs(aai.ItemID)); + } + } + } + private void UpdateHistory() + { + this.Cursor = Cursors.WaitCursor; + DateTime start = DateTime.Now; + Console.WriteLine(start); + #region setup + btnRestore.Enabled = false; + myRTB.Clear(); + myVFG.Clear(); + tvAudits.Nodes.Clear(); + if (MyItemInfo == null) return; + MyItemInfo.RefreshItemAnnotations(); + #endregion + //if (AnnotationOnly) + //{ + #region annotation deleted + //annotation deleted by itemid + TreeNode annotationDeleted = null; + AnnotationAuditInfoList aail = AnnotationAuditInfoList.GetByItemID(MyItemInfo.ItemID); + foreach (AnnotationAuditInfo aai in aail) + { + TreeNode tn = null; + if (aai.DeleteStatus > 0) + { + if (annotationDeleted == null) + annotationDeleted = tvAudits.Nodes.Add("Deleted Annotations"); + if (tn == null) + { + AnnotationTypeInfo ati = AnnotationTypeInfo.Get(aai.TypeID); + tn = annotationDeleted.Nodes.Add(ati.Name); + } + TreeNode cn = tn.Nodes.Add(aai.ToString()); + cn.Tag = aai; + } + } + //end annotation deleted + #endregion + #region annotation changes + //annotation change by annotationid + TreeNode annotationHistory = null; + if (MyItemInfo.ItemAnnotationCount > 0) + { + foreach (AnnotationInfo ai in MyItemInfo.ItemAnnotations) + { + TreeNode tn = null; + aail = AnnotationAuditInfoList.GetByAnnotationID(ai.AnnotationID); + foreach (AnnotationAuditInfo aai in aail) + { + if (aai.DTS != ai.DTS) + { + if (annotationHistory == null) + annotationHistory = tvAudits.Nodes.Add("Annotation History"); + if (tn == null) + tn = annotationHistory.Nodes.Add(string.Format("{0} - {1}", ai.MyAnnotationType.Name, ai.SearchText)); + TreeNode cn = tn.Nodes.Add(aai.ToString()); + cn.Tag = aai; + } + } + } + } + //end annotation change + #endregion + // return; + //} + #region content changes + //content changes + TreeNode contentHistory = null; + if (MyItemInfo == null) return; + ContentAuditInfoList cail = ContentAuditInfoList.Get(MyItemInfo.ContentID); + // ContentAuditInfoList cail = ContentAuditInfoList.GetChronology(MyItemInfo.MyProcedure.ItemID, MyItemInfo.ItemID, false); + ContentInfo ci = ContentInfo.Get(MyItemInfo.ContentID); + foreach (ContentAuditInfo cai in cail) + { + if (cai.DeleteStatus == 0) + { + if (cai.Type == 20008) + { + GridAuditInfoList gail = GridAuditInfoList.Get(cai.ContentID); + foreach (GridAuditInfo gai in gail) + { + if (gai.DeleteStatus == 0) + { + if (contentHistory == null) + contentHistory = tvAudits.Nodes.Add("Content Changes"); //contentHistory = tvAudits.Nodes.Add("Content History"); + TreeNode tn = contentHistory.Nodes.Add(gai.ToString()); + tn.Tag = gai; + } + } + break; + } + else if (cai.DTS != ci.DTS) + { + if (contentHistory == null) + contentHistory = tvAudits.Nodes.Add("Content Changes"); //contentHistory = tvAudits.Nodes.Add("Content History"); + TreeNode tn = contentHistory.Nodes.Add(cai.ToString()); + tn.Tag = cai; + } + } + } + //end content changes + #endregion + #region items + TreeNode deletedItems = null; + TreeNode previousItem = null; + TreeNode nextItem = null; + TreeNode procedurePart = null; + TreeNode sectionPart = null; + TreeNode cautionPart = null; + TreeNode notePart = null; + TreeNode rnoPart = null; + TreeNode stepPart = null; + TreeNode tablePart = null; + #endregion + ItemAuditInfoList iail = ItemAuditInfoList.Get(MyItemInfo.ItemID); + foreach (ItemAuditInfo iai in iail) + { + #region old style + // switch (iai.Level) + // { + // #region previous item + // case 0: //previous item + // { + // #region old style + // //if (previousItem == null) + // // previousItem = tvAudits.Nodes.Add("Deleted Previous Item"); //previousItem = tvAudits.Nodes.Add("Previous Item"); + // //TreeNode tn = previousItem.Nodes.Add(iai.ToString()); + // //tn.Tag = iai; + // #endregion + // #region new style + // if (deletedItems == null) + // deletedItems = tvAudits.Nodes.Add("Deleted Items"); + // TreeNode tnn = deletedItems.Nodes.Add(iai.ToString()); + // tnn.Tag = iai; + // #endregion + // break; + // } + // #endregion + // #region next item + // case 1: //next item + // { + // #region old style + // //if (nextItem == null) + // // nextItem = tvAudits.Nodes.Add("Deleted Next Item"); //nextItem = tvAudits.Nodes.Add("Next Item"); + // //TreeNode tn = nextItem.Nodes.Add(iai.ToString()); + // //tn.Tag = iai; + // #endregion + // #region new style + // if (deletedItems == null) + // deletedItems = tvAudits.Nodes.Add("Deleted Items"); + // TreeNode tnn = deletedItems.Nodes.Add(iai.ToString()); + // tnn.Tag = iai; + // #endregion + // break; + // } + // #endregion + // case 2: //parts + // { + // #region old style + // //PartAuditInfoList pail = null; + // //pail = PartAuditInfoList.GetByDeleteStatus(iai.DeleteStatus); + // //if (pail.Count == 0) + // // pail = PartAuditInfoList.GetByItemID(iai.ItemID); + // //foreach (PartAuditInfo pai in pail) + // //{ + // // if (pai.ContentID == MyItemInfo.ContentID) + // // { + // // switch (pai.FromType) + // // { + // // #region procedure part + // // case 1: //procedures + // // { + // // if (procedurePart == null) + // // procedurePart = tvAudits.Nodes.Add("Deleted Procedures"); //procedurePart = tvAudits.Nodes.Add("Procedures"); + // // TreeNode tn = procedurePart.Nodes.Add(iai.ToString()); + // // tn.Tag = iai; + // // break; + // // } + // // #endregion + // // #region section part + // // case 2: //sections + // // { + // // if (sectionPart == null) + // // sectionPart = tvAudits.Nodes.Add("Deleted Sections"); //sectionPart = tvAudits.Nodes.Add("Sections"); + // // TreeNode tn = sectionPart.Nodes.Add(iai.ToString()); + // // tn.Tag = iai; + // // break; + // // } + // // #endregion + // // #region caution part + // // case 3: //cautions + // // { + // // if (cautionPart == null) + // // cautionPart = tvAudits.Nodes.Add("Deleted Cautions"); //cautionPart = tvAudits.Nodes.Add("Cautions"); + // // TreeNode tn = cautionPart.Nodes.Add(iai.ToString()); + // // tn.Tag = iai; + // // break; + // // } + // // #endregion + // // #region note part + // // case 4: //notes + // // { + // // if (notePart == null) + // // notePart = tvAudits.Nodes.Add("Deleted Notes"); //notePart = tvAudits.Nodes.Add("Notes"); + // // TreeNode tn = notePart.Nodes.Add(iai.ToString()); + // // tn.Tag = iai; + // // break; + // // } + // // #endregion + // // #region rno part + // // case 5: //rnos + // // { + // // if (rnoPart == null) + // // rnoPart = tvAudits.Nodes.Add("Deleted RNOs"); //rnoPart = tvAudits.Nodes.Add("RNOs"); + // // TreeNode tn = rnoPart.Nodes.Add(iai.ToString()); + // // tn.Tag = iai; + // // break; + // // } + // // #endregion + // // #region step part + // // case 6: //steps + // // { + // // if (stepPart == null) + // // stepPart = tvAudits.Nodes.Add("Deleted Steps"); //stepPart = tvAudits.Nodes.Add("Steps"); + // // TreeNode tn = stepPart.Nodes.Add(iai.ToString()); + // // tn.Tag = iai; + // // break; + // // } + // // #endregion + // // #region table part + // // case 7: //tables + // // { + // // if (tablePart == null) + // // tablePart = tvAudits.Nodes.Add("Deleted Tables"); //tablePart = tvAudits.Nodes.Add("Tables"); + // // TreeNode tn = tablePart.Nodes.Add(iai.ToString()); + // // tn.Tag = iai; + // // break; + // // } + // // #endregion + // // } + // // } + // //} + // #endregion + // #region new style + // if (deletedItems == null) + // deletedItems = tvAudits.Nodes.Add("Deleted Items"); + // TreeNode tnn = deletedItems.Nodes.Add(iai.ToString()); + // tnn.Tag = iai; + // #endregion + // break; + // } + //} + #endregion + #region new style + if (deletedItems == null) + deletedItems = tvAudits.Nodes.Add("Deleted Items"); + TreeNode tnn = deletedItems.Nodes.Add(iai.ToString()); + tnn.Tag = iai; + #endregion + } + Console.WriteLine("UpdateHistory: {0} seconds",TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalSeconds); + this.Cursor = Cursors.Default; + } + private void WalkProcedure() + { + //return; + this.Cursor = Cursors.WaitCursor; + DateTime start = DateTime.Now; + Console.WriteLine(start); + lbChanges.Items.Clear(); + ContentAuditInfoList cail2 = ContentAuditInfoList.GetChronology(MyProcedureInfo.ItemID, MyProcedureInfo.ItemID, false); + Console.WriteLine("WalkProcedure cail2: {0} seconds", TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalSeconds); + _ChronologyAuditList = cail2; + ContentAuditInfoList cail3 = ContentAuditInfoList.GetSummary(MyProcedureInfo.ItemID, MyProcedureInfo.ItemID, false); + _SummaryAuditList = cail3; + AnnotationAuditInfoList aail2 = AnnotationAuditInfoList.GetChronology(MyProcedureInfo.ItemID, MyProcedureInfo.ItemID); + Console.WriteLine("WalkProcedure aail2: {0} seconds", TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalSeconds); + _AnnotationList = aail2; + foreach (ContentAuditInfo cai in cail2) + { + string itemTitle = Regex.Replace(cai.Path, "^..+?\\u0007", ""); + itemTitle = itemTitle.Replace("\x11", itemTitle[0]=='\x11' ? "" : " - "); + lbChanges.Items.Add(string.Format("{4} item {0} by {1} on {2} @ {3}", cai.ActionWhat, cai.UserID, cai.ActionWhen == DateTime.MinValue ? cai.DTS.ToShortDateString() : cai.ActionWhen.ToShortDateString(), cai.ActionWhen == DateTime.MinValue ? cai.DTS.ToShortTimeString() : cai.ActionWhen.ToShortTimeString(), itemTitle)); + } + foreach (AnnotationAuditInfo aai in aail2) + { + string stepnum = string.Empty; + foreach (ContentAuditInfo cai in cail2) + { + if (cai.ContentID == aai.IContentID) + { + stepnum = Regex.Replace(cai.Path, "^..+?\\u0007.", ""); + break; + } + } + lbChanges.Items.Add(string.Format("{4} Annotation {0} by {1} on {2} @ {3}", aai.ActionWhat, aai.UserID, aai.ActionWhen.ToShortDateString(), aai.ActionWhen.ToShortTimeString(), stepnum)); + } + Console.WriteLine("WalkProcedure fini: {0} seconds", TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalSeconds); + this.Cursor = Cursors.Default; + btnViewSummaryReport.Enabled = btnViewChronologyReport.Enabled = lbChanges.Items.Count > 0; + return; + + string itemType = string.Empty; + lbChanges.Items.Clear(); + ItemInfo myproc = _MyItemInfo.MyProcedure; + ItemInfo ii = myproc; + int lenNumber = myproc.DisplayNumber.Length + 2; + if (ii == null) return; + while (ii != null && ii.MyProcedure.ItemID == myproc.ItemID) + { + itemType = ii.IsCaution ? "Caution for" : ii.IsNote ? "Note for" : ii.IsStep ? "Step" : "Item"; + //items + if (ii.IsItemNew) + { + lbChanges.Items.Add(string.Format("{4} {0} added by {1} on {2} @ {3}", ii.ShortPath.Substring(lenNumber), ii.UserID, ii.DTS.ToShortDateString(), ii.DTS.ToShortTimeString(), itemType)); + //int k = lbChanges.Items.Add(string.Format("{0} @ {1} - {2}", "Item Added", ii.DTS.ToString(), ii.DisplayText)); + //ListViewItem lvi = new ListViewItem("Item Added"); + //lvi.SubItems.Add(ii.ItemID.ToString()); + //lvi.SubItems.Add(ii.DTS.ToString()); + //lvi.SubItems.Add(ii.DisplayText); + //lvi.SubItems.Add(ii.ShortPath.Substring(lenNumber)); + //listView1.Items.Add(lvi); + if (ii.IsItemChanged) + { + ContentAuditInfoList cail = ContentAuditInfoList.Get(ii.ContentID); + if (cail.Count > 0) + { + foreach (ContentAuditInfo cai in cail) + { + if (cai.Text != string.Empty) + { + lbChanges.Items.Add(string.Format("{4} {0} changed by {1} on {2} @ {3}", ii.ShortPath.Substring(lenNumber), ii.MyContent.UserID, ii.MyContent.DTS.ToShortDateString(), ii.MyContent.DTS.ToShortTimeString(), itemType)); + } + } + } + } + } + else if (ii.IsItemChanged) + { + //Results.Add(ii); + lbChanges.Items.Add(string.Format("{4} {0} changed by {1} on {2} @ {3}", ii.ShortPath.Substring(lenNumber), ii.MyContent.UserID, ii.MyContent.DTS.ToShortDateString(), ii.MyContent.DTS.ToShortTimeString(), itemType)); + //int k = lbChanges.Items.Add(string.Format("{0} @ {1} - {2}", "Content Changed", ii.DTS.ToString(), ii.DisplayText)); + //ListViewItem lvi = new ListViewItem("Item Changed"); + //lvi.SubItems.Add(ii.ItemID.ToString()); + //lvi.SubItems.Add(ii.MyContent.DTS.ToString()); + //lvi.SubItems.Add(ii.DisplayText); + //lvi.SubItems.Add(ii.ShortPath.Substring(lenNumber)); + //listView1.Items.Add(lvi); + } + ItemAuditInfoList iail = ItemAuditInfoList.Get(ii.ItemID); + foreach (ItemAuditInfo iai in iail) + { + if (iai.DeleteStatus > 0 && iai.Level == 1) + { + lbChanges.Items.Add(string.Format("{4} after {0} deleted by {1} on {2} @ {3}", ii.ShortPath.Substring(lenNumber), iai.UserID, iai.DTS.ToShortDateString(), iai.DTS.ToShortTimeString(), itemType)); + //int k = lbChanges.Items.Add(string.Format("{0} @ {1} - {2}", "Item Deleted", ii.DTS.ToString(), "TODO: figure out how to get iai.DisplayText")); + //ListViewItem lvi = new ListViewItem("Item Deleted"); + //lvi.SubItems.Add(iai.ItemID.ToString()); + //lvi.SubItems.Add(iai.DTS.ToString()); //iai.MyContent.DTS.ToString() + //lvi.SubItems.Add("TODO: figure out how to get iai.DisplayText"); //TODO: figure out how to get iai.DisplayText + //lvi.SubItems.Add("After " + ii.ShortPath.Substring(lenNumber)); + } + else + { + PartAuditInfoList pail = null; + pail = PartAuditInfoList.GetByItemID(iai.ItemID); + if (pail.Count > 0) + { + foreach (PartAuditInfo pai in pail) + { + itemType = pai.FromType == 3 ? "Caution for" : pai.FromType == 4 ? "Note for" : pai.FromType == 6 ? "Step" : "Item" + pai.FromType.ToString(); + lbChanges.Items.Add(string.Format("{4} {0} deleted by {1} on {2} @ {3}", ii.ShortPath.Substring(lenNumber), iai.UserID, iai.DTS.ToShortDateString(), iai.DTS.ToShortTimeString(), itemType)); + } + } + } + } + //annotations + if (ii.ItemAnnotations != null) + { + foreach (AnnotationInfo ai in ii.ItemAnnotations) + { + if (ai.IsAnnotationNew) + { + int k = lbChanges.Items.Add(string.Format("{0} @ {1} - {2}", "Annotation Added", ai.DTS.ToString(), ai.SearchText)); + //ListViewItem lvi = new ListViewItem("Annotation Added"); + //lvi.SubItems.Add(ai.AnnotationID.ToString()); + //lvi.SubItems.Add(ai.DTS.ToString()); + //lvi.SubItems.Add(ai.SearchText); + //lvi.SubItems.Add(ii.ShortPath.Substring(lenNumber)); + //listView1.Items.Add(lvi); + } + else + { + int k = lbChanges.Items.Add(string.Format("{0} @ {1} - {2}", "Annotation Changed", ai.DTS.ToString(), ai.SearchText)); + //ListViewItem lvi = new ListViewItem("Annotation Changed"); + //lvi.SubItems.Add(ai.AnnotationID.ToString()); + //lvi.SubItems.Add(ai.DTS.ToString()); + //lvi.SubItems.Add(ai.SearchText); + //lvi.SubItems.Add(ii.ShortPath.Substring(lenNumber)); + //listView1.Items.Add(lvi); + } + } + AnnotationAuditInfoList aail = AnnotationAuditInfoList.GetByItemID(ii.ItemID); + foreach (AnnotationAuditInfo aai in aail) + { + if (aai.DeleteStatus > 0) + { + int k = lbChanges.Items.Add(string.Format("{0} @ {1} - {2}", "Annotation Deleted", aai.DTS.ToString(), aai.SearchText)); + //ListViewItem lvi = new ListViewItem("Annotation Deleted"); + //lvi.SubItems.Add(aai.AnnotationID.ToString()); + //lvi.SubItems.Add(aai.DTS.ToString()); + //lvi.SubItems.Add(aai.SearchText); + //lvi.SubItems.Add(ii.ShortPath.Substring(lenNumber)); + //listView1.Items.Add(lvi); + } + } + } + //content changes + //ContentAuditInfoList cail = ContentAuditInfoList.Get(ii.MyContent.ContentID); + //foreach (ContentAuditInfo cai in cail) + //{ + // int k = lbChanges.Items.Add(string.Format("{0} @ {1} - {2}", "Content Changed", cai.DTS.ToString(), cai.Text)); + //ListViewItem lvi = new ListViewItem("Content Changed"); + //lvi.SubItems.Add(cai.ContentID.ToString()); + //lvi.SubItems.Add(cai.DTS.ToString()); + //lvi.SubItems.Add(cai.Text); + //lvi.SubItems.Add(ii.ShortPath.Substring(lenNumber)); + //listView1.Items.Add(lvi); + //} + ii = ii.SearchNext; + } + btnViewSummaryReport.Enabled = btnViewChronologyReport.Enabled = lbChanges.Items.Count > 0; + } + private void btnViewChronologyReport_Click(object sender, EventArgs e) + { + //if (lbChanges.Items.Count > 0) + //{ + OnChronologyPrintRequest(new DisplayHistoryReportEventArgs(Volian.Base.Library.VlnSettings.TemporaryFolder + @"\MyChronology.pdf", MyItemInfo.MyProcedure, _ChronologyAuditList, _AnnotationList)); + //} + } + private void btnViewSummaryReport_Click(object sender, EventArgs e) + { + //if (lbChanges.Items.Count > 0) + //{ + OnSummaryPrintRequest(new DisplayHistoryReportEventArgs(Volian.Base.Library.VlnSettings.TemporaryFolder + @"\MySummary.pdf", MyItemInfo.MyProcedure, _SummaryAuditList, _AnnotationList)); + //} + } + private void btnRefresh_Click(object sender, EventArgs e) + { + RefreshList(); + } + private void btnRestore_Click(object sender, EventArgs e) + { + TreeNode tn = tvAudits.SelectedNode; + if (tn.Tag is ContentAuditInfo) + { + ContentAuditInfo cai = tn.Tag as ContentAuditInfo; + if (MessageBox.Show(this, "Do you want to restore this content change?", "Confirm Content Change Restore", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) + { + ContentInfo ci = ContentInfo.RestoreContent(cai); + UpdateHistory(); + myRTB.Clear(); + myVFG.Clear(); + } + } + if (tn.Tag is ItemAuditInfo) + { + ItemAuditInfo iai = tn.Tag as ItemAuditInfo; + if (MessageBox.Show(this, string.Format("Do you want to restore this {0}?",iai.ItemType), string.Format("Confirm {0} Restore",iai.ItemType), MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) + { + Console.WriteLine("DisplayHistory.btnRestore_Click @ {0}", DateTime.Now); + ItemInfo ii = null; + if (iai.Level == 2) + { + ii = MyItemInfo.RestoreItem(iai); + + //_MyEditItem.AddChild((E_FromType)fromtype, contenttype); + //ii.ItemParts[0].FromType + //ii.MyContent.Type + EditItem nextItem = MyEditItem.GetNextItem((E_FromType)ii.ItemParts[0].FromType, ii); + //MyEditItem.AddChild(ii.MyContent.Text, (E_FromType)ii.ItemParts[0].FromType, (int)ii.MyContent.Type, null); + if (ii.IsStep) + ii = StepInfo.Get(ii.ItemID); + else if (ii.IsSection) + ii = SectionInfo.Get(ii.ItemID); + else if (ii.IsProcedure) + ii = ProcedureInfo.Get(ii.ItemID); + if (nextItem != null) + { + switch (nextItem.MyChildRelation) + { + case ChildRelation.None: + break; + case ChildRelation.After: + MyEditItem.AddChildAfter(ii, nextItem); + break; + case ChildRelation.Before: + MyEditItem.AddChildBefore(ii, nextItem); + break; + case ChildRelation.RNO: + MyEditItem.AddChildRNO(ii, nextItem); + break; + default: + break; + } + } + else + { + switch ((E_FromType)ii.ItemParts[0].FromType) + { + case E_FromType.Caution: + MyEditItem.AddChildBefore(ii, nextItem); + break; + case E_FromType.Note: + MyEditItem.AddChildBefore(ii, nextItem); + break; + case E_FromType.Procedure: + MyEditItem.AddChildAfter(ii, nextItem); + break; + case E_FromType.RNO: + MyEditItem.AddChildRNO(ii, nextItem); + break; + case E_FromType.Section: + MyEditItem.AddChildAfter(ii, nextItem); + break; + case E_FromType.Step: + MyEditItem.AddChildAfter(ii, nextItem); + break; + case E_FromType.Table: + MyEditItem.AddChildAfter(ii, nextItem); + break; + default: + MyEditItem.AddChildAfter(ii, nextItem); + break; + } + } + } + else + { + ii = MyItemInfo.RestoreSibling(iai); + if (ii.IsStep) + ii = StepInfo.Get(ii.ItemID); + else if (ii.IsSection) + ii = SectionInfo.Get(ii.ItemID); + else if (ii.IsProcedure) + ii = ProcedureInfo.Get(ii.ItemID); + EditItem nextItem = iai.Level == 0 ? MyEditItem : MyEditItem.MyNextEditItem; + switch (MyEditItem.MyChildRelation) + { + case ChildRelation.None: + break; + case ChildRelation.After: + MyEditItem.ActiveParent.AddChildAfter(ii, nextItem); + break; + case ChildRelation.Before: + MyEditItem.ActiveParent.AddChildBefore(ii, nextItem); + break; + case ChildRelation.RNO: + MyEditItem.ActiveParent.AddChildRNO(ii, nextItem); + break; + default: + break; + } + } + if(MyEditItem.MyPreviousEditItem != null) + MyEditItem.MyPreviousEditItem.SetAllTabs(); + else + MyEditItem.SetAllTabs(); + UpdateHistory(); + myRTB.Clear(); + myVFG.Clear(); + } + } + if (tn.Tag is AnnotationAuditInfo) + { + AnnotationAuditInfo aai = tn.Tag as AnnotationAuditInfo; + if (MessageBox.Show(this, "Do you want to restore this annotation?", "Confirm Annotation Restore", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) + { + AnnotationInfo ai = AnnotationInfo.RestoreAnnotation(aai); + UpdateHistory(); + myRTB.Clear(); + myVFG.Clear(); + } + } + if (tn.Tag is GridAuditInfo) + { + GridAuditInfo gai = tn.Tag as GridAuditInfo; + if (MessageBox.Show(this, "Do you want to restore this table?", "Confirm Table Restore", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) + { + ContentAuditInfo cai = ContentAuditInfo.Get(gai.ContentAuditID); + ContentInfo ci = ContentInfo.RestoreContent(cai); + UpdateHistory(); + myRTB.Clear(); + myVFG.Clear(); + } + } + } + private void DisplayTagRTF(TreeNode tn) + { + if (tn.Tag != null) + { + if (tn.Tag is GridAuditInfo) + { + btnRestore.Enabled = true; + GridAuditInfo gai = tn.Tag as GridAuditInfo; + myVFG.Visible = true; + myVFG.BringToFront(); + panel1.Invalidate(new Rectangle(0, 0, myVFG.Width + 4, 4)); + panel1.Invalidate(new Rectangle(0, 0, 4, myVFG.Height + 4)); + myRTB.Visible = false; + panel1.Visible = false; + using (StringReader sr = new StringReader(gai.Data)) + { + myVFG.ReadXml(sr); + sr.Close(); + } + panel1.Visible = true; + return; + } + if (tn.Tag is ContentAuditInfo) + { + btnRestore.Enabled = true; + myVFG.Clear(); + ContentAuditInfo cai = tn.Tag as ContentAuditInfo; + GridAuditInfoList gail = GridAuditInfoList.Get(cai.ContentID); + if (gail.Count > 0) + { + foreach (GridAuditInfo gai in gail) + { + if (gai.DTS == cai.DTS) + { + myVFG.Visible = true; + myVFG.BringToFront(); + myRTB.Visible = false; + using (StringReader sr = new StringReader(gai.Data)) + { + myVFG.ReadXml(sr); + sr.Close(); + } + return; + } + } + } + else + { + myRTB.Visible = true; + myRTB.BringToFront(); + myVFG.Visible = false; +// myRTB.Font = new Font("Arial", 12, FontStyle.Regular); +// myRTB.Text = cai.Text; + myRTB.SetupRichText(cai.Text, MyItemInfo.FormatStepData.Font); + } + } + if (tn.Tag is ItemAuditInfo) + { + btnRestore.Enabled = true; + ItemAuditInfo iai = tn.Tag as ItemAuditInfo; + ContentAuditInfoList cail = ContentAuditInfoList.Get(iai.ContentID); + foreach (ContentAuditInfo cai in cail) + { + if (cai.DeleteStatus == iai.DeleteStatus) + { + //myRTB.Font = new Font("Arial", 12, FontStyle.Regular); + //myRTB.Text = cai.Text; + if (MyItemInfo.FormatStepData != null) + myRTB.SetupRichText(cai.Text, MyItemInfo.FormatStepData.Font); + else + { + myRTB.SetupRichText(cai.Text, new VE_Font(StepRTB.MyFontFamily != null ? StepRTB.MyFontFamily.Name : "arial", 12, E_Style.None, 8)); + } + + } + } + } + if (tn.Tag is AnnotationAuditInfo) + { + btnRestore.Enabled = true; + AnnotationAuditInfo iai = tn.Tag as AnnotationAuditInfo; + myRTB.Font = new Font("Arial", 12, FontStyle.Regular); + myRTB.Rtf = iai.RtfText; + //myRTB.Rtf = iai.RtfText; + } + } + else + { + btnRestore.Enabled = false; + myRTB.Clear(); + myVFG.Clear(); + } + } + private void tvAudits_AfterSelect(object sender, TreeViewEventArgs e) + { + DisplayTagRTF(e.Node); + } + private void DisplayHistory_Resize(object sender, EventArgs e) + { + tvAudits.Height = ((tcpDetail.Height - btnRestore.Height) / 4) * 3; + } + + private void DisplayHistory_VisibleChanged(object sender, EventArgs e) + { + this.RefreshList(); + } + } + + public delegate void ItemRestoredHandler(ItemInfo restoredItemInfo); + public delegate void DisplayHistoryReportEvent(object sender, DisplayHistoryReportEventArgs args); + public delegate void DisplayHistoryEvent(object sender, DisplayHistoryEventArgs args); + public class DisplayHistoryReportEventArgs + { + private string _ReportName; + public string ReportTitle + { + get { return _ReportName; } + set { _ReportName = value; } + } + private ProcedureInfo _ProcedureInfo; + public ProcedureInfo ProcedureInfo + { + get { return _ProcedureInfo; } + set { _ProcedureInfo = value; } + } + private ContentAuditInfoList _AuditList; + public ContentAuditInfoList AuditList + { + get { return _AuditList; } + set { _AuditList = value; } + } + private AnnotationAuditInfoList _AnnotationList; + public AnnotationAuditInfoList AnnotationList + { + get { return _AnnotationList; } + set { _AnnotationList = value; } + } + + public DisplayHistoryReportEventArgs(string reportName, ProcedureInfo procedureInfo, ContentAuditInfoList auditList, AnnotationAuditInfoList annotationList) + { + _ReportName = reportName; + _ProcedureInfo = procedureInfo; + _AuditList = auditList; + _AnnotationList = annotationList; + } + } + public class DisplayHistoryEventArgs + { + private int _ItemID; + public int ItemID + { + get { return _ItemID; } + set { _ItemID = value; } + } + public DisplayHistoryEventArgs(int itemID) + { + _ItemID = itemID; + } + } +} + diff --git a/PROMS/Volian.Controls.Library/DisplayHistory.designer.cs b/PROMS/Volian.Controls.Library/DisplayHistory.designer.cs new file mode 100644 index 00000000..7ffbb180 Binary files /dev/null and b/PROMS/Volian.Controls.Library/DisplayHistory.designer.cs differ diff --git a/PROMS/Volian.Controls.Library/DisplayTabControl.cs b/PROMS/Volian.Controls.Library/DisplayTabControl.cs index d338150f..1621babc 100644 --- a/PROMS/Volian.Controls.Library/DisplayTabControl.cs +++ b/PROMS/Volian.Controls.Library/DisplayTabControl.cs @@ -319,6 +319,7 @@ namespace Volian.Controls.Library public DisplayTabItem OpenItem(ItemInfo myItemInfo) { CleanUpClosedItems(); + if (myItemInfo == null) return null; _MyBar = GetParentBar(myItemInfo); // Get the docking bar associated with this item. if (myItemInfo.MyContent.MyEntry == null) // If it is a Word document open in step editor return OpenStepTabPage(myItemInfo); diff --git a/PROMS/Volian.Controls.Library/DisplayText.cs b/PROMS/Volian.Controls.Library/DisplayText.cs index da376000..e98f2b50 100644 --- a/PROMS/Volian.Controls.Library/DisplayText.cs +++ b/PROMS/Volian.Controls.Library/DisplayText.cs @@ -465,8 +465,9 @@ namespace Volian.Controls.Library { Console.WriteLine("{0} - {1}", br.Property, br.Description); } - _MyItem.DTS = DateTime.Now; - _MyItem.UserID = Volian.Base.Library.VlnSettings.UserID; + // Don't update the DTS or User for Text Changes + //_MyItem.DTS = DateTime.Now; + //_MyItem.UserID = Volian.Base.Library.VlnSettings.UserID; _MyItem.Save(); } _MyItem = null; diff --git a/PROMS/Volian.Controls.Library/EditItem.cs b/PROMS/Volian.Controls.Library/EditItem.cs index 666e490a..6e3ef415 100644 --- a/PROMS/Volian.Controls.Library/EditItem.cs +++ b/PROMS/Volian.Controls.Library/EditItem.cs @@ -66,6 +66,11 @@ namespace Volian.Controls.Library } protected static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); protected ChildRelation _MyChildRelation; + public ChildRelation MyChildRelation + { + get { return _MyChildRelation; } + set { _MyChildRelation = value; } + } protected bool _Loading = true; protected EditItem _MyParentEditItem = null; protected EditItem _MySectionRTBItem; @@ -556,6 +561,7 @@ namespace Volian.Controls.Library } public EditItem DeleteItem() { + MyStepPanel._LookupEditItems.Remove(MyID); EditItem newFocus = null; int? TopMostParentY = (MyParentEditItem == null ? null : (int?)(MyParentEditItem.TopMostEditItem.Top)); int? ParentY = (MyParentEditItem == null ? null : (int?)(MyParentEditItem.Top)); @@ -731,7 +737,8 @@ namespace Volian.Controls.Library public EditItem AddChildAfter(ItemInfo MyItemInfo, bool expand) { EditItem child = null; - if (MyItemInfo.MyContent.ContentGridCount != 0) + //if (MyItemInfo.MyContent.ContentGridCount != 0) + if (MyItemInfo.MyContent.MyGrid != null) child = new GridItem(MyItemInfo, MyStepPanel, this, ChildRelation.After, expand); else child = new RTBItem(MyItemInfo, MyStepPanel, this, ChildRelation.After, expand); @@ -740,7 +747,8 @@ namespace Volian.Controls.Library public EditItem AddChildAfter(ItemInfo MyItemInfo, EditItem nextEditItem) { EditItem child = null; - if (MyItemInfo.MyContent.ContentGridCount != 0) + //if (MyItemInfo.MyContent.ContentGridCount != 0) + if (MyItemInfo.MyContent.MyGrid != null) child = new GridItem(MyItemInfo, MyStepPanel, this, ChildRelation.After, true, nextEditItem); else child = new RTBItem(MyItemInfo, MyStepPanel, this, ChildRelation.After, true, nextEditItem); @@ -760,7 +768,8 @@ namespace Volian.Controls.Library { // not sure about this, i.e. whether a grid can be added here. EditItem child = null; - if (MyItemInfo.MyContent.ContentGridCount != 0) + //if (MyItemInfo.MyContent.ContentGridCount != 0) + if (MyItemInfo.MyContent.MyGrid != null) child = new GridItem(MyItemInfo, MyStepPanel, this, ChildRelation.RNO, true, nextEditItem); else child = new RTBItem(MyItemInfo, MyStepPanel, this, ChildRelation.RNO, true, nextEditItem); @@ -865,15 +874,7 @@ namespace Volian.Controls.Library } } // TODO: We need to determine where this will go in the stack of children - EditItem nextItem = null; - if (newItemInfo.NextItem != null) - nextItem = MyStepPanel.FindItem(newItemInfo.NextItem); - else if (fromType == E_FromType.Table && MyAfterEditItems != null) - nextItem = MyAfterEditItems[0]; - // Cautions come before notes, so if this is a Caution and there are Notes, put this first - else if (fromType == E_FromType.Caution && ((ItemInfo)newItemInfo.ActiveParent).Notes != null - && ((ItemInfo)newItemInfo.ActiveParent).Notes.Count > 0) - nextItem = MyStepPanel.FindItem(((ItemInfo)newItemInfo.ActiveParent).Notes[0]); + EditItem nextItem = GetNextItem(fromType, newItemInfo); // TODO: May need similar logic if a Table is being added to a step that has substeps // else if (fromType == E_FromType.Table && ((ItemInfo)newItemInfo.ActiveParent).Steps != null //&& ((ItemInfo)newItemInfo.ActiveParent).Steps.Count > 0) @@ -908,6 +909,19 @@ namespace Volian.Controls.Library } MyStepPanel.SelectedEditItem = newEditItem;//Update Screen } + public EditItem GetNextItem(E_FromType fromType, ItemInfo newItemInfo) + { + EditItem nextItem = null; + if (newItemInfo.NextItem != null) + nextItem = MyStepPanel.FindItem(newItemInfo.NextItem); + else if (fromType == E_FromType.Table && MyAfterEditItems != null) + nextItem = MyAfterEditItems[0]; + // Cautions come before notes, so if this is a Caution and there are Notes, put this first + else if (fromType == E_FromType.Caution && ((ItemInfo)newItemInfo.ActiveParent).Notes != null + && ((ItemInfo)newItemInfo.ActiveParent).Notes.Count > 0) + nextItem = MyStepPanel.FindItem(((ItemInfo)newItemInfo.ActiveParent).Notes[0]); + return nextItem; + } /// /// Add a list of children after /// @@ -1970,7 +1984,7 @@ namespace Volian.Controls.Library } if (expand) ShowExpanded(); MyStepPanel = myStepPanel; - if (itemInfo != null) myStepPanel._LookupEditItems.Add(itemInfo.ItemID, this); + if (itemInfo != null && !myStepPanel._LookupEditItems.ContainsKey(itemInfo.ItemID)) myStepPanel._LookupEditItems.Add(itemInfo.ItemID, this); _MyChildRelation = myChildRelation; if (myParentEditItem != null) RNOLevel = myParentEditItem.RNOLevel; if (itemInfo != null) diff --git a/PROMS/Volian.Controls.Library/GridItem.cs b/PROMS/Volian.Controls.Library/GridItem.cs index c9f31ea5..5d30741c 100644 --- a/PROMS/Volian.Controls.Library/GridItem.cs +++ b/PROMS/Volian.Controls.Library/GridItem.cs @@ -564,16 +564,21 @@ namespace Volian.Controls.Library // create the usage for it. this code gets run on modify of the ro table and also // on exit of the griditem. We don't want to save the ro usage again, if it's already // been saved. - if (MyFlexGrid.IsRoTable && MyFlexGrid.ROID != null && itm.MyContent.ContentRoUsageCount < 1) - { - searchableText = string.Format(@"\v\v0 ", searchableText, DoLinkForRoTable()); - //if (itm.MyContent.Text != searchableText) - //{ + if (MyFlexGrid.IsRoTable && MyFlexGrid.ROID != null && itm.MyContent.ContentRoUsageCount < 1) + { + searchableText = string.Format(@"\v\v0 ", searchableText, DoLinkForRoTable()); + //if (itm.MyContent.Text != searchableText) + //{ itm.MyContent.Text = searchableText; itm.MyContent.DTS = DateTime.Now; - //} - } - if (!MyFlexGrid.IsRoTable)itm.MyContent.Text = searchableText; + //} + } + else + { + itm.MyContent.Text = searchableText; + itm.MyContent.DTS = DateTime.Now; + } + if (!MyFlexGrid.IsRoTable)itm.MyContent.Text = searchableText; itm.Save(); MyItemInfo.MyContent.MyGrid.ResetContent(itm.MyContent.MyGrid); } diff --git a/PROMS/Volian.Controls.Library/RTBItem.cs b/PROMS/Volian.Controls.Library/RTBItem.cs index 7b4a45b9..5e667f2a 100644 --- a/PROMS/Volian.Controls.Library/RTBItem.cs +++ b/PROMS/Volian.Controls.Library/RTBItem.cs @@ -598,7 +598,7 @@ namespace Volian.Controls.Library { if (MyStepRTB.ReadOnly) return; if (!MyStepRTB.ActiveMode) return; - if (!MyStepRTB.IsDirty && MyStepRTB.Text.Contains("(Resolved Transition Text)") == false) return; + if (MyStepRTB.MyItemInfo.MyContent.Number != null && !MyStepRTB.IsDirty && MyStepRTB.Text.Contains("(Resolved Transition Text)") == false) return; bool success = MyStepRTB.OrigDisplayText.Save((RichTextBox)MyStepRTB); if (success) { @@ -707,7 +707,15 @@ namespace Volian.Controls.Library } public override bool Empty { - get { return MyStepRTB.Text == ""; } + get + { +// Console.WriteLine("step rtb is dirty {0} and rtf is {1}", MyStepRTB.IsDirty, MyStepRTB.Rtf); +// string txt = MyStepRTB.Text; +// Console.WriteLine("step rtb is dirty {0} and rtf is {1}", MyStepRTB.IsDirty, MyStepRTB.Rtf); +// return txt == ""; + //return MyStepRTB.IsEmpty; + return MyStepRTB.Text == ""; + } set { MyStepRTB.Text = value ? "" : " "; } } //public override bool IsEmpty() // this becomes 'Empty' property, i.e. get/set. diff --git a/PROMS/Volian.Controls.Library/StepRTB.cs b/PROMS/Volian.Controls.Library/StepRTB.cs index 3b8ec90a..1246e592 100644 --- a/PROMS/Volian.Controls.Library/StepRTB.cs +++ b/PROMS/Volian.Controls.Library/StepRTB.cs @@ -342,8 +342,12 @@ namespace Volian.Controls.Library { if (_FormatFont == null) { - Font formatFont = MyItemInfo.GetItemFont().WindowsFont; // OrigDisplayText.TextFont.WindowsFont; - if (MyItemInfo.IsTable || MyItemInfo.IsFigure) + Font formatFont; + if (MyItemInfo != null) + formatFont = MyItemInfo.GetItemFont().WindowsFont; // OrigDisplayText.TextFont.WindowsFont; + else + formatFont = Font; + if (MyItemInfo != null && (MyItemInfo.IsTable || MyItemInfo.IsFigure)) _FormatFont = formatFont; else { @@ -357,9 +361,18 @@ namespace Volian.Controls.Library } return _FormatFont; } + set { _FormatFont = value; } + } + public void SetupRichText(string rtf, VE_Font vFont) + { + //FormatFont = vFont.WindowsFont; + DisplayText vlnText = new DisplayText(rtf, vFont, true); + AddRtfText(vlnText.StartText); + ReadOnly = true; } public void RefreshDisplay() { + if (Disposing) return; RefreshDisplay(ActiveMode); } // RefreshDisplay is used to update the rtb for an entire Item as defined by MyItemInfo. diff --git a/PROMS/Volian.Controls.Library/StepTabPanel.cs b/PROMS/Volian.Controls.Library/StepTabPanel.cs index 77eae63c..eae6057e 100644 --- a/PROMS/Volian.Controls.Library/StepTabPanel.cs +++ b/PROMS/Volian.Controls.Library/StepTabPanel.cs @@ -274,7 +274,7 @@ namespace Volian.Controls.Library if (args.MyLinkText.LinkInfoText.IndexOf("Transition") > -1) { ItemInfo item = args.MyLinkText.MyTranToItemInfo; - if (item.PreviousID == null && item.ItemPartCount == 0 && item.ItemDocVersionCount == 0) + if (item == null || (item.PreviousID == null && item.ItemPartCount == 0 && item.ItemDocVersionCount == 0)) { MessageBox.Show("This transition is invalid", "Invalid Transition", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; // Not a valid transition diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.cs index bfeb62b0..7846bca3 100644 --- a/PROMS/Volian.Controls.Library/StepTabRibbon.cs +++ b/PROMS/Volian.Controls.Library/StepTabRibbon.cs @@ -1444,7 +1444,7 @@ namespace Volian.Controls.Library StepInfo stpi = MyEditItem.MyItemInfo as StepInfo; if (stpi == null) // not sure that it will every get here! { - MessageBox.Show("Unknown type, cannot delete!"); + MessageBox.Show("Unknown type {0}, cannot delete!",MyEditItem.MyItemInfo.GetType().Name); return; } if (!surpressMessageBox) diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs index 7464db5e..10fd5226 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs @@ -976,10 +976,11 @@ namespace Volian.Controls.Library int x2 = bounds.Right - 1; int y2 = bounds.Bottom - 1; GridItem myGridItem = Parent as GridItem; - if (myGridItem == null) return; + Panel myPanel = Parent as Panel; + if (myGridItem == null && myPanel == null) return; if (row == 0 || col == 0) // Top or Left Edge - Draw on parent { - using (Graphics grParent = myGridItem.CreateGraphics()) + using (Graphics grParent = myGridItem != null ? myGridItem.CreateGraphics() : myPanel.CreateGraphics()) { if (row == 0) { diff --git a/PROMS/Volian.Print.Library/PDFChronologyReport.cs b/PROMS/Volian.Print.Library/PDFChronologyReport.cs new file mode 100644 index 00000000..1e5450d7 --- /dev/null +++ b/PROMS/Volian.Print.Library/PDFChronologyReport.cs @@ -0,0 +1,1368 @@ +using System; +using System.Collections.Generic; +using System.Text; +using VEPROMS.CSLA.Library; +using iTextSharp.text.pdf; +using iTextSharp.text; +using System.IO; +using System.Text.RegularExpressions; + +namespace Volian.Print.Library +{ + public class PDFChronologyReport + { + private string _FileName; + public string FileName + { + get { return _FileName; } + set { _FileName = value; } + } + private ProcedureInfo _MyProc; + public ProcedureInfo MyProc + { + get { return _MyProc; } + set { _MyProc = value; } + } + private ContentAuditInfoList _AuditList; + public ContentAuditInfoList AuditList + { + get { return _AuditList; } + set { _AuditList = value; } + } + private AnnotationAuditInfoList _AnnotationList; + public AnnotationAuditInfoList AnnotationList + { + get { return _AnnotationList; } + set { _AnnotationList = value; } + } + public PDFChronologyReport(string fileName, ProcedureInfo myProc, ContentAuditInfoList auditList, AnnotationAuditInfoList annotationList) + { + _FileName = fileName; + _MyProc = myProc; + _AuditList = auditList; + _AnnotationList = annotationList; + } + public void BuildChronology() + { + iTextSharp.text.Document document = new iTextSharp.text.Document(PageSize.LETTER, 36, 36, 36, 36); + if (!CreateResultsPDF(document)) return; + try + { + BuildChronologyReport(document); + } + catch (Exception ex) + { + StringBuilder msg = new StringBuilder(); + document.Add(new Paragraph("Error:")); + while (ex != null) + { + document.Add(new Paragraph(ex.GetType().Name)); + document.Add(new Paragraph(ex.Message)); + ex = ex.InnerException; + } + } + finally + { + if (document.IsOpen()) + { + document.Close(); + System.Diagnostics.Process.Start(_FileName); + } + } + } + public void BuildSummary() + { + bool hasData = false; + iTextSharp.text.Document document = new iTextSharp.text.Document(PageSize.LETTER, 36, 36, 36, 36); + if (!CreateResultsPDF(document)) return; + try + { + BuildSummaryReport(document); + } + catch (Exception ex) + { + StringBuilder msg = new StringBuilder(); + document.Add(new Paragraph("Error:")); + while (ex != null) + { + document.Add(new Paragraph(ex.GetType().Name)); + document.Add(new Paragraph(ex.Message)); + ex = ex.InnerException; + } + } + finally + { + if (document.IsOpen()) + { + document.Close(); + System.Diagnostics.Process.Start(_FileName); + } + } + } + private bool CreateResultsPDF(iTextSharp.text.Document document) + { + bool result = false; + string suffix = ""; + int i = 0; + // Try to open a file for creating the PDF. + while (result == false) + { + string fileName = _FileName.ToLower().Replace(".pdf", suffix + ".pdf"); + try + { + PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(fileName, FileMode.Create)); + document.SetMargins(36, 36, 36, 36); + document.Open(); + _FileName = fileName; + result = true; + } + catch (System.IO.IOException exIO) + { + + if (exIO.Message.Contains("because it is being used by another process")) + suffix = string.Format("_{0}", ++i);// If this file is in use, increment the suffix and try again + else // If some other error, display a message and don't print the results + { + ShowException(exIO); + return false; + } + } + catch (Exception ex) + { + ShowException(ex); + return false; // Could not open the output file + } + } + return true; + } + private static void ShowException(Exception ex) + { + Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message); + StringBuilder msg = new StringBuilder(); + string sep = ""; + string indent = ""; + while (ex != null) + { + msg.Append(string.Format("{0}{1}{2}:\r\n{1}{3}", sep, indent, ex.GetType().Name, ex.Message)); + ex = ex.InnerException; + sep = "\r\n"; + indent += " "; + } + System.Windows.Forms.MessageBox.Show(msg.ToString(), "Error during PDF creation for search:", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation); + } + private PdfPCell BlankCell(int colSpan) + { + PdfPCell c = new PdfPCell(); + c.Colspan = colSpan; + c.Border = 0; + return c; + } + private void BuildChronologyReport(iTextSharp.text.Document doc) + { + int cols = 5; + int borders = 0; + int paddingBottom = 6; + PdfPTable t = new PdfPTable(cols); + t.HeaderRows = 4; + t.DefaultCell.Padding = 4; + t.WidthPercentage = 100; + float[] widths = new float[] { 1f, 1f, 1f, 1f, 4f }; + t.SetWidths(widths); + //t.HorizontalAlignment = 0; + iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 14, 1, Color.BLACK); + iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK); + iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 9, 0, Color.BLACK); + iTextSharp.text.Font f4 = pdf.GetFont("Arial Unicode MS", 9, 1, Color.BLACK); + //report title + Phrase h = new Phrase(); + h.Font = f1; + h.Add("Chronology of Changes Report"); + PdfPCell c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + //procedure title + h = new Phrase(); + h.Font = f2; + h.Add(string.Format("{0} - {1}", MyProc.DisplayNumber, MyProc.DisplayText)); + c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + string section = string.Empty; + string stepnum = string.Empty; + DateTime maxDTS = DateTime.MinValue; + int lastID = 0; + ContentAuditInfo oldCAI = null; +// Dictionary processedAAI = new Dictionary(); + Dictionary processedAAI = new Dictionary(); + foreach (ContentAuditInfo cai in AuditList) + { + //raw path + string[] NewPath = Regex.Replace(cai.Path, "^..+?\\u0007.", "").Split("\x7".ToCharArray()); + if (NewPath[0] != section) + { + section = NewPath[0]; + h = new Phrase(); + h.Font = f4; + h.Add(section); + c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + } + //step + if (NewPath[1] != stepnum) + { + //see if any annotations for old stepnum here and add them + foreach (AnnotationAuditInfo aai in AnnotationList) + { + if (oldCAI != null && aai.IContentID == oldCAI.ContentID) + { + //add annotation to minilist +// processedAAI.Add(aai.AnnotationID, aai); + processedAAI.Add(aai, aai); + //write row to table + t.AddCell(BlankCell(1)); + h = new Phrase(); + h.Font = f3; + h.Add("Annotation " + aai.ActionWhat); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(aai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhen.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + h = new Phrase(); + h.Font = f4; + //h.Add(cai.Text); + h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + } + oldCAI = cai; + stepnum = NewPath[1]; + string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); + stepnum2 = stepnum2.Replace("RNO.", "RNO"); + h = new Phrase(); + h.Font = f3; + h.Add(string.Format("Step {0}", stepnum2)); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_RIGHT; + c.PaddingBottom = paddingBottom; + c.PaddingRight = 10; + //c.Border = borders; + t.AddCell(c); + } + else + t.AddCell(BlankCell(1)); + //what + if (cai.ContentID != lastID) maxDTS = DateTime.MinValue; + h = new Phrase(); + h.Font = f3; + string actionWhat = (cai.ActionWhat == "Added" && cai.DTS <= MyProc.DTS) ? "Original" : cai.ActionWhat != "Changed" ? cai.ActionWhat : cai.DTS <= maxDTS ? "Restored" : cai.DTS > MyProc.DTS ? cai.ActionWhat : "Original"; + if (actionWhat == "Deleted" || actionWhat == "Restored") + h.Add(actionWhat + "\r\n" + cai.ActionWhen.ToString()); + else + h.Add(actionWhat); + if (cai.DTS > maxDTS) + maxDTS = cai.DTS; + lastID = cai.ContentID; + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(cai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(cai.DTS.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + //h.Add(cai.Text); + if (cai.Type == 20008) + { + GridAuditInfoList gail = GridAuditInfoList.Get(cai.ContentID); + if (gail.Count > 0) + { + GridAuditInfo gai = gail[0]; + System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); + xd.LoadXml(gai.Data); + //int grows = int.Parse(xd.SelectSingleNode("C1FlexGrid/RowInfo/Count").InnerText); + int gcols = int.Parse(xd.SelectSingleNode("C1FlexGrid/ColumnInfo/Count").InnerText); + string data = ItemInfo.ConvertToDisplayText(cai.Text); + PdfPTable gtbl = new PdfPTable(gcols); + while (data.Length > 0) + { + string val = data.Substring(0, data.IndexOf(";")); + data = data.Substring(data.IndexOf(";") + 1); + Phrase hh = new Phrase(); + hh.Font = f4; + hh.Add(val); + PdfPCell cc = new PdfPCell(hh); + gtbl.AddCell(cc); + } + c = new PdfPCell(gtbl); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + //c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + } + else + { + h = new Phrase(); + h.Font = f4; + h.Add(ItemInfo.ConvertToDisplayText(cai.Text)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + ////old text + //t.AddCell(BlankCell(3)); + //h = new Phrase(); + //h.Font = f4; + //h.Add("Old text: " + cai.OldText); + //c = new PdfPCell(h); + //c.Colspan = 7; + //c.Border = 0; + //t.AddCell(c); + } + //see if any annotations for old stepnum here and add them + foreach (AnnotationAuditInfo aai in AnnotationList) + { + if (oldCAI != null && aai.IContentID == oldCAI.ContentID) + { + //add annotation to minilist +// processedAAI.Add(aai.AnnotationID, aai); + processedAAI.Add(aai, aai); + //write row to table + t.AddCell(BlankCell(1)); + h = new Phrase(); + h.Font = f3; + h.Add("Annotation " + aai.ActionWhat); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(aai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhen.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + h = new Phrase(); + h.Font = f4; + //h.Add(cai.Text); + h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + } + bool annotationHeader = false; + stepnum = string.Empty; + foreach (AnnotationAuditInfo aai in AnnotationList) + { +// if (!processedAAI.ContainsKey(aai.AnnotationID)) + if (!processedAAI.ContainsKey(aai)) + { + if (!annotationHeader) + { + t.AddCell(BlankCell(cols)); + h = new Phrase(); + h.Font = f4; + h.Add("ANNOTATIONS"); + c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + annotationHeader = true; + } + string[] NewPath = GetNewPath(AuditList, aai.IContentID); + if (NewPath[1] != stepnum) + { + stepnum = NewPath[1]; + string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); + stepnum2 = stepnum2.Replace("RNO.", "RNO"); + h = new Phrase(); + h.Font = f3; + h.Add(string.Format("Step {0}", stepnum2)); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_RIGHT; + c.PaddingBottom = paddingBottom; + c.PaddingRight = 10; + //c.Border = borders; + t.AddCell(c); + } + else + { + t.AddCell(BlankCell(1)); + } + //what + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhat); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(aai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhen.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + h = new Phrase(); + h.Font = f4; + //h.Add(cai.Text); + h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + } + if (t.Rows.Count == t.HeaderRows) + { + c = new PdfPCell(new Phrase("No changes to report")); + c.Colspan = cols; + t.AddCell(c); + } + doc.Add(t); + } + + private string[] GetNewPath(ContentAuditInfoList AuditList, int contentID) + { + foreach (ContentAuditInfo cai in AuditList) + { + if(cai.ContentID == contentID) + return Regex.Replace(cai.Path, "^..+?\\u0007.", "").Split("\x7".ToCharArray()); + } + ItemInfoList iil = ItemInfoList.GetByContentID(contentID); + if (iil.Count > 0) + { + return Regex.Replace(iil[0].SearchPath, "^..+?\\u0007.", "").Split("\x7".ToCharArray()); + } + return "obozo\x7obiden".Split("\x7".ToCharArray()); + } + private void BuildSummaryReport2(iTextSharp.text.Document doc) + { + string section = string.Empty; + string stepnum = string.Empty; + ContentAuditInfo firstCAI = null; + ContentAuditInfo nextCAI = null; + ContentAuditInfo lastCAI = null; + List auditList = new List(); + foreach (ContentAuditInfo cai in AuditList) + { + string[] NewPath = Regex.Replace(cai.Path, "^..+?\\u0007.", "").Split("\x7".ToCharArray()); + if (NewPath[1] != stepnum) + { + stepnum = NewPath[1]; + if (firstCAI != null) + { + if (lastCAI == null) + { + auditList.Add(firstCAI); + } + else if (lastCAI.ActionWhat == "Deleted" && firstCAI.DTS < MyProc.DTS) + { + auditList.Add(lastCAI); + } + else if (lastCAI.ActionWhat == "Changed" && lastCAI.Text != firstCAI.Text) + { + auditList.Add(firstCAI); + auditList.Add(lastCAI); + } + else if (lastCAI.ActionWhat == "Changed" && firstCAI.ActionWhat == "Added" && lastCAI.Text == firstCAI.Text) + { + auditList.Add(firstCAI); + } + else if (lastCAI == null && firstCAI.ActionWhat == "Added") + { + auditList.Add(firstCAI); + } + lastCAI = null; + } + firstCAI = cai; + } + else + { + lastCAI = cai; + } + } + if (firstCAI != null) + auditList.Add(firstCAI); + if (lastCAI != null) + auditList.Add(lastCAI); + #region annotations + AnnotationAuditInfo firstAAI = null; + AnnotationAuditInfo nextAAI = null; + AnnotationAuditInfo lastAAI = null; + int icontentID = 0; + List annotationList = new List(); + foreach (AnnotationAuditInfo aai in AnnotationList) + { + if (aai.IContentID != icontentID) + { + icontentID = aai.IContentID; + if (firstAAI != null) + { + if (lastAAI == null) + { + annotationList.Add(firstAAI); + } + else if (lastAAI.ActionWhat == "Deleted" && firstAAI.DTS < MyProc.DTS) + { + annotationList.Add(lastAAI); + } + else if (lastAAI.ActionWhat == "Changed" && lastAAI.SearchText != firstAAI.SearchText) + { + annotationList.Add(firstAAI); + annotationList.Add(lastAAI); + } + else if (lastAAI.ActionWhat == "Changed" && firstAAI.ActionWhat == "Added" && lastAAI.SearchText == firstAAI.SearchText) + { + annotationList.Add(firstAAI); + } + else if (lastAAI == null && firstAAI.ActionWhat == "Added") + { + annotationList.Add(firstAAI); + } + lastAAI = null; + } + firstAAI = aai; + } + else + lastAAI = aai; + } + if (firstAAI != null) + annotationList.Add(firstAAI); + if (lastAAI != null) + annotationList.Add(lastAAI); + #endregion + int cols = 5; + int borders = 0; + int paddingBottom = 6; + PdfPTable t = new PdfPTable(cols); + t.HeaderRows = 4; + t.DefaultCell.Padding = 4; + t.WidthPercentage = 100; + float[] widths = new float[] { 1f, 1f, 1f, 1f, 4f }; + t.SetWidths(widths); + //t.HorizontalAlignment = 0; + iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 14, 1, Color.BLACK); + iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK); + iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 9, 0, Color.BLACK); + iTextSharp.text.Font f4 = pdf.GetFont("Arial Unicode MS", 9, 1, Color.BLACK); + //report title + Phrase h = new Phrase(); + h.Font = f1; + h.Add("Summary of Changes Report"); + PdfPCell c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + //procedure title + h = new Phrase(); + h.Font = f2; + h.Add(string.Format("{0} - {1}", MyProc.DisplayNumber, MyProc.DisplayText)); + c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + foreach (ContentAuditInfo cai in auditList) + { + //raw path + string[] NewPath = Regex.Replace(cai.Path, "^..+?\\u0007.", "").Split("\x7".ToCharArray()); + if (NewPath[0] != section) + { + section = NewPath[0]; + h = new Phrase(); + h.Font = f4; + h.Add(section); + c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + } + //step + if (NewPath[1] != stepnum) + { + firstCAI = cai; + stepnum = NewPath[1]; + string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); + stepnum2 = stepnum2.Replace("RNO.", "RNO"); + h = new Phrase(); + h.Font = f3; + h.Add(string.Format("Step {0}", stepnum2)); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_RIGHT; + c.PaddingBottom = paddingBottom; + c.PaddingRight = 10; + //c.Border = borders; + t.AddCell(c); + } + else + { + t.AddCell(BlankCell(1)); + nextCAI = cai; + } + //what + h = new Phrase(); + h.Font = f3; + h.Add(cai.ActionWhen > MyProc.DTS ? cai.ActionWhat : "Original"); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(cai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(cai.ActionWhen.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + h = new Phrase(); + h.Font = f4; + //h.Add(cai.Text); + h.Add(ItemInfo.ConvertToDisplayText(cai.Text)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + ////old text + //t.AddCell(BlankCell(3)); + //h = new Phrase(); + //h.Font = f4; + //h.Add("Old text: " + cai.OldText); + //c = new PdfPCell(h); + //c.Colspan = 7; + //c.Border = 0; + //t.AddCell(c); + } + t.AddCell(BlankCell(cols)); + h = new Phrase(); + h.Font = f4; + h.Add("ANNOTATIONS"); + c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + stepnum = string.Empty; + foreach (AnnotationAuditInfo aai in annotationList) + { + foreach (ContentAuditInfo cai in auditList) + { + if (cai.ContentID == aai.IContentID) + { + string[] NewPath = Regex.Replace(cai.Path, "^..+?\\u0007.", "").Split("\x7".ToCharArray()); + if (NewPath[1] != stepnum) + { + stepnum = NewPath[1]; + string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); + stepnum2 = stepnum2.Replace("RNO.", "RNO"); + h = new Phrase(); + h.Font = f3; + h.Add(string.Format("Step {0}", stepnum2)); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_RIGHT; + c.PaddingBottom = paddingBottom; + c.PaddingRight = 10; + //c.Border = borders; + t.AddCell(c); + break; + } + else + { + t.AddCell(BlankCell(1)); + break; + } + } + } + //what + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhat); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(aai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhen.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + h = new Phrase(); + h.Font = f4; + //h.Add(cai.Text); + h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + doc.Add(t); + } + private void BuildSummaryReport(iTextSharp.text.Document doc) + { + string section = string.Empty; + string stepnum = string.Empty; + int contentID = 0; + ContentAuditInfo firstCAI = null; + ContentAuditInfo nextCAI = null; + ContentAuditInfo lastCAI = null; + List auditList = new List(); + foreach (ContentAuditInfo cai in AuditList) + { + if (cai.ContentID != contentID) //new content + { + if (firstCAI != null) //not first row + { + if (lastCAI == null) + { + auditList.Add(firstCAI); + firstCAI = null; + } + else + { + if (lastCAI.DTS > firstCAI.DTS) + { + if (firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat != "Deleted") + { + if (firstCAI.DTS > MyProc.DTS) + lastCAI.ActionWhat = firstCAI.ActionWhat; + auditList.Add(lastCAI); + firstCAI = null; + lastCAI = null; + } + } + else if (firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat == "Deleted" && firstCAI.DTS == lastCAI.DTS) + { + auditList.Add(lastCAI); + firstCAI = null; + lastCAI = null; + } + } + } + firstCAI = cai; + contentID = cai.ContentID; + } + else + lastCAI = cai; + } + if (lastCAI == null) + { + if (firstCAI != null) + auditList.Add(firstCAI); + firstCAI = null; + } + else + { + if (lastCAI.DTS > firstCAI.DTS) + { + if (firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat != "Deleted") + { + if (firstCAI.DTS > MyProc.DTS) + lastCAI.ActionWhat = firstCAI.ActionWhat; + auditList.Add(lastCAI); + firstCAI = null; + lastCAI = null; + } + } + else if (firstCAI.ActionWhat == "Added" && lastCAI.ActionWhat == "Deleted" && firstCAI.DTS == lastCAI.DTS) + { + auditList.Add(lastCAI); + firstCAI = null; + lastCAI = null; + } + } + #region annotations commented out + //AnnotationAuditInfo firstAAI = null; + //AnnotationAuditInfo nextAAI = null; + //AnnotationAuditInfo lastAAI = null; + //int icontentID = 0; + //List annotationList = new List(); + //foreach (AnnotationAuditInfo aai in AnnotationList) + //{ + // if (aai.IContentID != icontentID) + // { + // icontentID = aai.IContentID; + // if (firstAAI != null) + // { + // if (lastAAI == null) + // { + // annotationList.Add(firstAAI); + // } + // else if (lastAAI.ActionWhat == "Deleted" && firstAAI.DTS < MyProc.DTS) + // { + // annotationList.Add(lastAAI); + // } + // else if (lastAAI.ActionWhat == "Changed" && lastAAI.SearchText != firstAAI.SearchText) + // { + // annotationList.Add(firstAAI); + // annotationList.Add(lastAAI); + // } + // else if (lastAAI.ActionWhat == "Changed" && firstAAI.ActionWhat == "Added" && lastAAI.SearchText == firstAAI.SearchText) + // { + // annotationList.Add(firstAAI); + // } + // else if (lastAAI == null && firstAAI.ActionWhat == "Added") + // { + // annotationList.Add(firstAAI); + // } + // lastAAI = null; + // } + // firstAAI = aai; + // } + // else + // lastAAI = aai; + //} + //if (firstAAI != null) + // annotationList.Add(firstAAI); + //if (lastAAI != null) + // annotationList.Add(lastAAI); + #endregion + int cols = 5; + int borders = 0; + int paddingBottom = 6; + PdfPTable t = new PdfPTable(cols); + t.HeaderRows = 4; + t.DefaultCell.Padding = 4; + t.WidthPercentage = 100; + float[] widths = new float[] { 1f, 1f, 1f, 1f, 4f }; + t.SetWidths(widths); + //t.HorizontalAlignment = 0; + iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 14, 1, Color.BLACK); + iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK); + iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 9, 0, Color.BLACK); + iTextSharp.text.Font f4 = pdf.GetFont("Arial Unicode MS", 9, 1, Color.BLACK); + //report title + Phrase h = new Phrase(); + h.Font = f1; + h.Add("Summary of Changes Report"); + PdfPCell c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + //procedure title + h = new Phrase(); + h.Font = f2; + h.Add(string.Format("{0} - {1}", MyProc.DisplayNumber, MyProc.DisplayText)); + c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + ContentAuditInfo oldCAI = null; + // Dictionary processedAAI = new Dictionary(); + Dictionary processedAAI = new Dictionary(); + foreach (ContentAuditInfo cai in auditList) + { + //raw path + string[] NewPath = Regex.Replace(cai.Path, "^..+?\\u0007.", "").Split("\x7".ToCharArray()); + if (NewPath[0] != section) + { + section = NewPath[0]; + h = new Phrase(); + h.Font = f4; + h.Add(section); + c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + } + //step + if (NewPath[1] != stepnum) + { + //see if any annotations for old stepnum here and add them + foreach (AnnotationAuditInfo aai in AnnotationList) + { + if (oldCAI != null && aai.IContentID == oldCAI.ContentID) + { + //add annotation to minilist + // processedAAI.Add(aai.AnnotationID, aai); + processedAAI.Add(aai, aai); + //write row to table + t.AddCell(BlankCell(1)); + h = new Phrase(); + h.Font = f3; + h.Add("Annotation " + aai.ActionWhat); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(aai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhen.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + h = new Phrase(); + h.Font = f4; + //h.Add(cai.Text); + h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + } + oldCAI = cai; + firstCAI = cai; + stepnum = NewPath[1]; + string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); + stepnum2 = stepnum2.Replace("RNO.", "RNO"); + h = new Phrase(); + h.Font = f3; + h.Add(string.Format("Step {0}", stepnum2)); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_RIGHT; + c.PaddingBottom = paddingBottom; + c.PaddingRight = 10; + //c.Border = borders; + t.AddCell(c); + } + else + { + t.AddCell(BlankCell(1)); + nextCAI = cai; + } + //what + h = new Phrase(); + h.Font = f3; + // h.Add(cai.ActionWhen > MyProc.DTS ? cai.ActionWhat : "Original"); + string actionWhat = cai.ActionWhat; //(cai.ActionWhat == "Added" && cai.DTS <= MyProc.DTS) ? "Original" : cai.ActionWhat != "Changed" ? cai.ActionWhat : cai.DTS <= maxDTS ? "Restored" : cai.DTS > MyProc.DTS ? cai.ActionWhat : "Original"; + if (actionWhat == "Deleted" || actionWhat == "Restored") + h.Add(actionWhat + "\r\n" + cai.ActionWhen.ToString()); + else + h.Add(actionWhat); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(cai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(cai.DTS.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + h = new Phrase(); + h.Font = f4; + //h.Add(cai.Text); + //h.Add(ItemInfo.ConvertToDisplayText(cai.Text)); + if (cai.Type == 20008) + { + GridAuditInfoList gail = GridAuditInfoList.Get(cai.ContentID); + if (gail.Count > 0) + { + GridAuditInfo gai = gail[0]; + System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); + xd.LoadXml(gai.Data); + //int grows = int.Parse(xd.SelectSingleNode("C1FlexGrid/RowInfo/Count").InnerText); + int gcols = int.Parse(xd.SelectSingleNode("C1FlexGrid/ColumnInfo/Count").InnerText); + string data = ItemInfo.ConvertToDisplayText(cai.Text); + PdfPTable gtbl = new PdfPTable(gcols); + while (data.Length > 0) + { + string val = data.Substring(0, data.IndexOf(";")); + data = data.Substring(data.IndexOf(";") + 1); + Phrase hh = new Phrase(); + hh.Font = f4; + hh.Add(val); + PdfPCell cc = new PdfPCell(hh); + gtbl.AddCell(cc); + } + c = new PdfPCell(gtbl); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + //c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + } + else + { + h = new Phrase(); + h.Font = f4; + h.Add(ItemInfo.ConvertToDisplayText(cai.Text)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + + //c = new PdfPCell(h); + //c.Colspan = cols - 4; + //c.HorizontalAlignment = Element.ALIGN_LEFT; + //c.PaddingBottom = paddingBottom; + ////c.Border = borders; + //t.AddCell(c); + ////old text + //t.AddCell(BlankCell(3)); + //h = new Phrase(); + //h.Font = f4; + //h.Add("Old text: " + cai.OldText); + //c = new PdfPCell(h); + //c.Colspan = 7; + //c.Border = 0; + //t.AddCell(c); + } + //see if any annotations for old stepnum here and add them + foreach (AnnotationAuditInfo aai in AnnotationList) + { + if (oldCAI != null && aai.IContentID == oldCAI.ContentID) + { + //add annotation to minilist + // processedAAI.Add(aai.AnnotationID, aai); + processedAAI.Add(aai, aai); + //write row to table + t.AddCell(BlankCell(1)); + h = new Phrase(); + h.Font = f3; + h.Add("Annotation " + aai.ActionWhat); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(aai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhen.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + h = new Phrase(); + h.Font = f4; + //h.Add(cai.Text); + h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + } + bool annotationHeader = false; + //t.AddCell(BlankCell(cols)); + //h = new Phrase(); + //h.Font = f4; + //h.Add("ANNOTATIONS"); + //c = new PdfPCell(h); + //c.Colspan = cols; + //c.HorizontalAlignment = Element.ALIGN_LEFT; + //c.PaddingBottom = paddingBottom; + ////c.Border = borders; + //t.AddCell(c); + //t.AddCell(BlankCell(cols)); + stepnum = string.Empty; + foreach (AnnotationAuditInfo aai in AnnotationList) + { + // if (!processedAAI.ContainsKey(aai.AnnotationID)) + if (!processedAAI.ContainsKey(aai)) + { + if (!annotationHeader) + { + t.AddCell(BlankCell(cols)); + h = new Phrase(); + h.Font = f4; + h.Add("ANNOTATIONS"); + c = new PdfPCell(h); + c.Colspan = cols; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + t.AddCell(BlankCell(cols)); + annotationHeader = true; + } + string[] NewPath = GetNewPath(AuditList, aai.IContentID); + if (NewPath[1] != stepnum) + { + stepnum = NewPath[1]; + string stepnum2 = Regex.Replace(stepnum, "([0-9])[.]([A-Za-z])", "$1 $2"); + stepnum2 = stepnum2.Replace("RNO.", "RNO"); + h = new Phrase(); + h.Font = f3; + h.Add(string.Format("Step {0}", stepnum2)); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_RIGHT; + c.PaddingBottom = paddingBottom; + c.PaddingRight = 10; + //c.Border = borders; + t.AddCell(c); + } + else + { + t.AddCell(BlankCell(1)); + } + //what + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhat); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //who + h = new Phrase(); + h.Font = f3; + h.Add(aai.UserID); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //when + h = new Phrase(); + h.Font = f3; + h.Add(aai.ActionWhen.ToString()); + c = new PdfPCell(h); + c.Colspan = 1; + c.HorizontalAlignment = Element.ALIGN_CENTER; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + //new text + h = new Phrase(); + h.Font = f4; + //h.Add(cai.Text); + h.Add(ItemInfo.ConvertToDisplayText(aai.SearchText)); + c = new PdfPCell(h); + c.Colspan = cols - 4; + c.HorizontalAlignment = Element.ALIGN_LEFT; + c.PaddingBottom = paddingBottom; + //c.Border = borders; + t.AddCell(c); + } + } + if (t.Rows.Count == t.HeaderRows) + { + c = new PdfPCell(new Phrase("No changes to report")); + c.Colspan = cols; + t.AddCell(c); + } + doc.Add(t); + } + } +} diff --git a/PROMS/Volian.Print.Library/PDFReport.cs b/PROMS/Volian.Print.Library/PDFReport.cs index 00f98d19..3af74491 100644 --- a/PROMS/Volian.Print.Library/PDFReport.cs +++ b/PROMS/Volian.Print.Library/PDFReport.cs @@ -455,7 +455,7 @@ namespace Volian.Print.Library //AddCell(datatable, "Step", f2, subHeaderColor); //AddCell(datatable, "Text", f2, subHeaderColor); datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT; - string lastDvPath = ""; + //string lastDvPath = ""; string lastPath = ""; Color AnnoColor = new Color(0xFF, 0xFF, 0xC0); Color TextColor = Color.WHITE; @@ -475,11 +475,11 @@ namespace Volian.Print.Library // AddGroup(datatable, item.SearchDVPath, lastDvPath, f2, false, Color.LIGHT_GRAY, true); //AddGroup(datatable, item.SearchDVPath, lastDvPath, f2, false, new Color(0xC0, 0xFF, 0xC0), true); - lastDvPath = item.SearchDVPath; + //lastDvPath = item.SearchDVPath; //string stepPath = AddGroup(datatable, item.SearchPath, lastPath, f2, true, new Color(0xE0, 0xFF, 0xE0), true); //string stepPath = AddGroup(datatable, item.SearchPath, lastPath, f2, true, new Color(0xC0, 0xFF, 0xC0), true); - string stepPath = AddGroup(subTable, item.SearchPath, lastPath, f2, true, new Color(0xC0, 0xFF, 0xC0), true); - lastPath = item.SearchPath; + string stepPath = AddGroup(subTable, item.SearchPath ?? item.ShortPath, lastPath, f2, true, new Color(0xC0, 0xFF, 0xC0), true); + lastPath = item.SearchPath ?? item.ShortPath; //AddCell(datatable, stepPath, f2, (item.IsSection ? SectColor : TextColor)); AddCell(subTable, stepPath, f2, (item.IsSection ? SectColor : TextColor)); // This was for the old 16-bit style of table - jsj 7/7/2011