From 92522b1229791c3335b9d71c5b6971b56e083130 Mon Sep 17 00:00:00 2001 From: mschill Date: Mon, 30 Jun 2025 14:32:24 -0400 Subject: [PATCH] C2025-024 Electronic Procedures - Phase 2 (PROMS XML output) Initial check-in / adding ui options / base for export --- .../VEPROMS User Interface/VEPROMS_UI.csproj | 3 + .../VEPROMS User Interface/dlgExportImport.cs | 23 +- .../dlgExportImportEP.cs | 202 +++++++++ PROMS/VEPROMS User Interface/frmVEPROMS.cs | 97 ++++- PROMS/Volian.Controls.Library/vlnTreeView.cs | 412 +++++++++++------- PROMS/Volian.Print.Library/PDFReport.cs | 2 +- 6 files changed, 552 insertions(+), 187 deletions(-) create mode 100644 PROMS/VEPROMS User Interface/dlgExportImportEP.cs diff --git a/PROMS/VEPROMS User Interface/VEPROMS_UI.csproj b/PROMS/VEPROMS User Interface/VEPROMS_UI.csproj index 856bf9c4..eb1a7ffd 100644 --- a/PROMS/VEPROMS User Interface/VEPROMS_UI.csproj +++ b/PROMS/VEPROMS User Interface/VEPROMS_UI.csproj @@ -164,6 +164,9 @@ dlgCheckedOutProcedure.cs + + Form + Form diff --git a/PROMS/VEPROMS User Interface/dlgExportImport.cs b/PROMS/VEPROMS User Interface/dlgExportImport.cs index 47b85a1b..e0496b3a 100644 --- a/PROMS/VEPROMS User Interface/dlgExportImport.cs +++ b/PROMS/VEPROMS User Interface/dlgExportImport.cs @@ -29,6 +29,7 @@ namespace VEPROMS } private bool _ConvertROsToTextDuringImport = false; private bool _ConvertROsAndTransitionsToText = false; // set to true when Approval creates an Export file + protected bool _ExportBothConvertedandNot = false; // set to true when Electronic Procedure export // B2016-225 notify user when Transitions and/or ROs are converted to text private bool _DidConvertTransitionsToText = false; @@ -64,7 +65,7 @@ namespace VEPROMS private FolderInfo MyFolder = null; private DocVersionInfo MyDocVersion = null; private ProcedureInfo MyProcedure = null; - private XmlAttribute AddAttribute(XmlDocument xd, string name, string value) + protected XmlAttribute AddAttribute(XmlDocument xd, string name, string value) { XmlAttribute xa = xd.CreateAttribute(name); xa.InnerText = value; @@ -2423,9 +2424,17 @@ namespace VEPROMS if (ii.ItemAnnotationCount > 0) foreach (AnnotationInfo ai in ii.ItemAnnotations) ExportAnnotation(xe, ai, "annotation"); + + ExportEPAnnotationInfo(xe, ii); } - private void ExportItemAudits(XmlElement xn, ItemInfo ii) + protected virtual void ExportEPAnnotationInfo(XmlElement xe, ItemInfo ii) + { + //do nothing - this will be for Electronic procedures only + //and handled/overridden in dlgExportEP.cs + } + + private void ExportItemAudits(XmlElement xn, ItemInfo ii) { if (cbxExportAudits.Checked) { @@ -2566,6 +2575,7 @@ namespace VEPROMS xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "dts", ci.DTS.ToString("MM/dd/yyyy HH:mm:ss.fff"))); xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "userid", ci.UserID.ToString())); xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "formatfilename", formatFileName)); + if (_ExportBothConvertedandNot) xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "textwithlinks", ci.Text)); //content audits ExportContentAudits(xe, ci); @@ -2652,6 +2662,7 @@ namespace VEPROMS MyWriter.WriteAttributeString("dts", ci.DTS.ToString("MM/dd/yyyy HH:mm:ss.fff")); MyWriter.WriteAttributeString("userid", ci.UserID.ToString()); MyWriter.WriteAttributeString("formatfilename", formatFileName); + if (_ExportBothConvertedandNot) MyWriter.WriteAttributeString("textwithlinks", ci.Text); if (ci.ContentTransitionCount > 0) foreach (TransitionInfo ti in ci.ContentTransitions) @@ -2699,7 +2710,8 @@ namespace VEPROMS xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "config", gi.Config)); xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "dts", gi.DTS.ToString("MM/dd/yyyy HH:mm:ss.fff"))); xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "userid", gi.UserID.ToString())); - + if (_ExportBothConvertedandNot) xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "datawithlinks", gi.Data)); + //grid audits ExportGridAudits(xe, gi); xn.AppendChild(xe); @@ -2758,6 +2770,7 @@ namespace VEPROMS MyWriter.WriteAttributeString("config", gi.Config); MyWriter.WriteAttributeString("dts", gi.DTS.ToString("MM/dd/yyyy HH:mm:ss.fff")); MyWriter.WriteAttributeString("userid", gi.UserID.ToString()); + if (_ExportBothConvertedandNot) MyWriter.WriteAttributeString("datawithlinks", gi.Data); MyWriter.WriteEndElement(); } @@ -2932,7 +2945,8 @@ namespace VEPROMS xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "dts", di.DTS.ToString("MM/dd/yyyy HH:mm:ss.fff"))); xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "userid", di.UserID.ToString())); xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "fileextension", di.FileExtension)); - + if (_ExportBothConvertedandNot) xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "doccontentwithlinks", Convert.ToBase64String(di.DocContent))); + //document audits ExportDocumentAudits(xe, di); xn.AppendChild(xe); @@ -2998,6 +3012,7 @@ namespace VEPROMS MyWriter.WriteAttributeString("dts", di.DTS.ToString("MM/dd/yyyy HH:mm:ss.fff")); MyWriter.WriteAttributeString("userid", di.UserID.ToString()); MyWriter.WriteAttributeString("fileextension", di.FileExtension); + if (_ExportBothConvertedandNot) MyWriter.WriteAttributeString("doccontentwithlinks", Convert.ToBase64String(di.DocContent)); MyWriter.WriteEndElement(); } diff --git a/PROMS/VEPROMS User Interface/dlgExportImportEP.cs b/PROMS/VEPROMS User Interface/dlgExportImportEP.cs new file mode 100644 index 00000000..7918e448 --- /dev/null +++ b/PROMS/VEPROMS User Interface/dlgExportImportEP.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml; +using VEPROMS.CSLA.Library; + +namespace VEPROMS +{ + //C2025-024 Electronic Procedures - Phase 2 (PROMS XML output) + //class inherits from normal import/export form + //then adds additional functionality + public partial class dlgExportImportEP : dlgExportImport + { + private readonly AnnotationTypeInfo _AnnotationType; + + private string multiseparator = ","; + + private static Regex _ROAccPageTokenPattern = new Regex("[<][^<>-]+-[^<>]+[>]"); + + public dlgExportImportEP(string mode, FolderInfo folderInfo, frmVEPROMS myFrmVEPROMS, int annotationTypeId) : base(mode, folderInfo, myFrmVEPROMS, (E_UCFImportOptions) 0) + { + _AnnotationType = AnnotationTypeInfo.Get(annotationTypeId); + _ExportBothConvertedandNot = true; + DocReplace = new Dictionary(); + FormClosed += OnClose; + Text = $"{mode} Electronic Procedure ({_AnnotationType.Name}) Dialog for {folderInfo.Name}"; + } + + public dlgExportImportEP(string mode, DocVersionInfo docVersionInfo, frmVEPROMS myFrmVEPROMS, int annotationTypeId) : base(mode, docVersionInfo, myFrmVEPROMS, (E_UCFImportOptions)0) + { + _AnnotationType = AnnotationTypeInfo.Get(annotationTypeId); + _ExportBothConvertedandNot = true; + DocReplace = new Dictionary(); + FormClosed += OnClose; + Text = $"{mode} Electronic Procedure ({_AnnotationType.Name}) Dialog for {docVersionInfo.Name} of {docVersionInfo.MyFolder.Name}"; + } + public dlgExportImportEP(string mode, ProcedureInfo procedureInfo, frmVEPROMS myFrmVEPROMS, int annotationTypeId) : base(mode, procedureInfo, myFrmVEPROMS, (E_UCFImportOptions)0) + { + _AnnotationType = AnnotationTypeInfo.Get(annotationTypeId); + _ExportBothConvertedandNot = true; + DocReplace = new Dictionary(); + FormClosed += OnClose; + Text = $"{mode} Electronic Procedure ({_AnnotationType.Name}) Dialog for {procedureInfo.DisplayNumber}"; + } + + //Overridden function to handle export of EP data + protected override void ExportEPAnnotationInfo(XmlElement xe, ItemInfo ii) + { + //switch to handle customizations for different formats + switch (ii.ActiveFormat.PlantFormat.EPFormatFiles.Find(x => x.AnnotationTypeID == _AnnotationType.TypeID)?.Name) + { + default: + ExportEPAnnotationInfo_Default(xe, ii); + break; + } + + } + + //default export of EP Data + private void ExportEPAnnotationInfo_Default(XmlElement xe, ItemInfo ii) + { + //Add tab text to item + string steptab = Volian.Print.Library.PDFReport.BuildStepTab(ii); + xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "StepTab", steptab)); + + //get first transition in item and add it as an xml element + if (ii.MyContent.ContentTransitionCount > 0) + { + TransitionInfo ct = ii.MyContent.ContentTransitions[0]; + xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "TransitionToItemID", ct.ToID.ToString())); + } + + //export EP annotation details under an EPInfo node + if (ii.ItemAnnotations != null) + { + XmlElement xepinfo = xe.OwnerDocument.CreateElement("EPInfo"); + + EPFields myEPFields = ii.GetValidEPFields(_AnnotationType.TypeID); + + ROFSTLookup lookup = ii.MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(ii.MyDocVersion); + + //For each annotation in the item that is of the current EP Annotation type + foreach (var EPAnnotation in ii.ItemAnnotations.Where(x => x.TypeID == _AnnotationType.TypeID)) + { + var EPAnnotationConfig = new AnnotationConfig(EPAnnotation.Config); + + XmlElement xepdetails = xe.OwnerDocument.CreateElement("Details"); + //include the annotation ID for reference + xepdetails.Attributes.SetNamedItem(AddAttribute(xepdetails.OwnerDocument, "AnnotationID", EPAnnotation.AnnotationID.ToString())); + + //loop through each EP Field - name the xml elements the EP.name + foreach (EPField EP in myEPFields) + { + string val = EPAnnotationConfig.GetValue("EP", EP.name); + + XmlElement xindivid = xe.OwnerDocument.CreateElement(EP.name); + + //need to resolve ROs ROSingle, ROMulti, in text + //get values + //should we export blank? + // + switch (EP.type.ToLower()) + { + case "text": + + //for text, check if any embedded ROs + //if none, set the xml element to the text + //otherwise resolve the Ros + MatchCollection matches = _ROAccPageTokenPattern.Matches(val); + if (matches.Count == 0) + { + xindivid.InnerText = val; + } + else + { + //resolve ROs + //text ROs will replace the AccID key in the text + //for binary objects like images, + //we will keep the AccID in the text and output the binary as a separate child + //XML element with the same xml name as the AccID + foreach (Match m in matches) + { + ROFSTLookup.rochild roc = lookup.GetROChildByAccPageID(m.Groups[1].Value); + + + if (roc.type == 8) // Exclude replacing Images since are binary - for those, add a sub item + { + XmlElement xroid = xindivid.OwnerDocument.CreateElement(m.Groups[1].Value); + xroid.InnerText = roc.value; + xindivid.AppendChild(xroid); + } + else if (!string.IsNullOrEmpty(roc.value)) + { + bool convertCaretToDeltaSymbol = (ii.ActiveSection != null) && ii.ActiveSection.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta; + + string rocvalue = roc.value.Replace("`", "\xB0"); + rocvalue = rocvalue.Replace("\xF8", "\xB0"); + rocvalue = rocvalue.Replace("\x7F", "\x394"); //delta + if (convertCaretToDeltaSymbol) rocvalue = rocvalue.Replace("^", "\x394"); // delta + val = val.Replace($"<{m.Groups[1].Value}>", rocvalue); + } + + } + + xindivid.InnerText = val; + } + break; + case "rosingle": + //Get the output columns from the EPFormatFile + //set the "Item" nodes value = to those resolved items + //separated by multiseparator + XmlElement xindivid_rosingle = xindivid.OwnerDocument.CreateElement("Item"); + xindivid_rosingle.Attributes.SetNamedItem(AddAttribute(xindivid_rosingle.OwnerDocument, "ROID", val)); + List ro_single_tmp = EP.getROValuesList(EPAnnotation, val); + xindivid_rosingle.InnerText = String.Join(multiseparator, ro_single_tmp.ToArray()); + xindivid.AppendChild(xindivid_rosingle); + break; + case "romulti": + //Get the output columns from the EPFormatFile + //create an "Item" subnode for each selected RO + //set the nodes value = to those resolved items + //separated by multiseparator + foreach (string ival in val.Split(multiseparator.ToCharArray())) + { + XmlElement xindivid_romulti = xindivid.OwnerDocument.CreateElement("Item"); + xindivid_romulti.Attributes.SetNamedItem(AddAttribute(xindivid_romulti.OwnerDocument, "ROID", ival)); + List ro_multi_tmp = EP.getROValuesList(EPAnnotation, ival); + xindivid_romulti.InnerText = String.Join(multiseparator, ro_multi_tmp.ToArray()); + xindivid.AppendChild(xindivid_romulti); + } + break; + case "tableinput": + xindivid.InnerText = val; + break; + default: + xindivid.InnerText = val; + break; + } + xepdetails.AppendChild(xindivid); + } + + xepinfo.AppendChild(xepdetails); + } + + xe.AppendChild(xepinfo); + } + + } + + //clear objects to release memory + private void OnClose(object sender, EventArgs e) + { + DocReplace.Clear(); + DocReplace = null; + } + + + } +} diff --git a/PROMS/VEPROMS User Interface/frmVEPROMS.cs b/PROMS/VEPROMS User Interface/frmVEPROMS.cs index 840dbd6e..0ab8be76 100644 --- a/PROMS/VEPROMS User Interface/frmVEPROMS.cs +++ b/PROMS/VEPROMS User Interface/frmVEPROMS.cs @@ -708,15 +708,32 @@ namespace VEPROMS else { int ownerid = MySessionInfo.CheckOutItem(fi.FolderID, CheckOutType.Session); - - dlgExportImport dlg = new dlgExportImport(args.Index == 0 ? "Export" : "Import", fi, this, (E_UCFImportOptions)Properties.Settings.Default.UCFImportOpt);//Added frmVEPROMS Parameter - dlg.ShowDialog(this); - MySessionInfo.CheckInItem(ownerid); - - if (args.Index == 1 && dlg.MyNewFolder != null) + //C2025-024 Electronic Procedures - Phase 2 (PROMS XML output) + //form for exporting Electronic Procedures from FolderInfo + if (args.AnnotationTypeId > 0) { - tv.AddNewNode(dlg.MyNewFolder); + dlgExportImportEP dlg = new dlgExportImportEP(args.Index == 0 ? "Export" : "Import", fi, this, args.AnnotationTypeId); + dlg.ShowDialog(this); + + MySessionInfo.CheckInItem(ownerid); + + if (args.Index == 1 && dlg.MyNewFolder != null) + { + tv.AddNewNode(dlg.MyNewFolder); + } + } + else + { + dlgExportImport dlg = new dlgExportImport(args.Index == 0 ? "Export" : "Import", fi, this, (E_UCFImportOptions)Properties.Settings.Default.UCFImportOpt);//Added frmVEPROMS Parameter + dlg.ShowDialog(this); + + MySessionInfo.CheckInItem(ownerid); + + if (args.Index == 1 && dlg.MyNewFolder != null) + { + tv.AddNewNode(dlg.MyNewFolder); + } } } } @@ -742,18 +759,40 @@ namespace VEPROMS int ownerid = MySessionInfo.CheckOutItem(dvi.VersionID, CheckOutType.DocVersion); - dlgExportImport dlg = new dlgExportImport("Import", dvi, this, (E_UCFImportOptions)Properties.Settings.Default.UCFImportOpt);//Added frmVEPROMS Parameter - dlg.MyNewProcedure = null; - dlg.ExternalTransitionItem = null; - dlg.ShowDialog(this); + //C2025-024 Electronic Procedures - Phase 2 (PROMS XML output) + //form for exporting Electronic Procedures from DocVersionInfo + if (args.AnnotationTypeId > 0) + { + dlgExportImportEP dlg = new dlgExportImportEP(args.Index == 0 ? "Export" : "Import", dvi, this, args.AnnotationTypeId); + dlg.MyNewProcedure = null; + dlg.ExternalTransitionItem = null; + dlg.ShowDialog(this); - MySessionInfo.CheckInItem(ownerid); + MySessionInfo.CheckInItem(ownerid); - if (dlg.MyNewProcedure != null) - tv.AddNewNode(dlg.MyNewProcedure); + if (dlg.MyNewProcedure != null) + tv.AddNewNode(dlg.MyNewProcedure); + + if (dlg.ExternalTransitionItem != null) + tc.OpenItem(dlg.ExternalTransitionItem); + } + else + { + + dlgExportImport dlg = new dlgExportImport("Import", dvi, this, (E_UCFImportOptions)Properties.Settings.Default.UCFImportOpt);//Added frmVEPROMS Parameter + dlg.MyNewProcedure = null; + dlg.ExternalTransitionItem = null; + dlg.ShowDialog(this); + + MySessionInfo.CheckInItem(ownerid); + + if (dlg.MyNewProcedure != null) + tv.AddNewNode(dlg.MyNewProcedure); + + if (dlg.ExternalTransitionItem != null) + tc.OpenItem(dlg.ExternalTransitionItem); + } - if (dlg.ExternalTransitionItem != null) - tc.OpenItem(dlg.ExternalTransitionItem); } } @@ -769,10 +808,24 @@ namespace VEPROMS else { int ownerid = MySessionInfo.CheckOutItem(pi.ItemID, CheckOutType.Procedure); - dlgExportImport dlg = new dlgExportImport("Export", pi, this, (E_UCFImportOptions)0);//Added frmVEPROMS Parameter - dlg.ShowDialog(this); - MySessionInfo.CheckInItem(ownerid); + //C2025-024 Electronic Procedures - Phase 2 (PROMS XML output) + //form for exporting Electronic Procedures from ProcedureInfo + if (args.AnnotationTypeId > 0) + { + dlgExportImportEP dlg = new dlgExportImportEP("Export", pi, this, args.AnnotationTypeId); + dlg.ShowDialog(this); + + MySessionInfo.CheckInItem(ownerid); + } + else + { + + dlgExportImport dlg = new dlgExportImport("Export", pi, this, (E_UCFImportOptions)0);//Added frmVEPROMS Parameter + dlg.ShowDialog(this); + + MySessionInfo.CheckInItem(ownerid); + } } } } @@ -1216,7 +1269,7 @@ namespace VEPROMS //Print Section //C2025-028 Add a Quick Print Section option - + void tv_PrintSection(object sender, vlnTreeEventArgs args) { PrintSection(sender, args, false); @@ -1226,7 +1279,7 @@ namespace VEPROMS PrintSection(sender, args, true); } - void PrintSection(object sender, vlnTreeEventArgs args, bool quickprint) + void PrintSection(object sender, vlnTreeEventArgs args, bool quickprint) { try { @@ -2195,7 +2248,7 @@ namespace VEPROMS this.superTooltip1.SetSuperTooltip(btnResetSecurity, new SuperTooltipInfo("Reset Security", "", "WARNING this will \nREMOVE ALL PROMS USERS and Reset to the\nOriginal Volian Defaults", null, null, eTooltipColor.Gray)); this.superTooltip1.SetSuperTooltip(btnAdministrativeTools, new SuperTooltipInfo("Administrative Tools", "", "Open the PROMS Adminstration Tools Window", null, null, eTooltipColor.Gray)); this.superTooltip1.SetSuperTooltip(btnUpdateFormats, new SuperTooltipInfo("Update Formats", "", "Install New Formats \n or Re-Install Formats", null, null, eTooltipColor.Gray)); - + try { MyUserInfo = UserInfo.GetByUserID(VlnSettings.UserID); diff --git a/PROMS/Volian.Controls.Library/vlnTreeView.cs b/PROMS/Volian.Controls.Library/vlnTreeView.cs index bdd75d47..95beb6f2 100644 --- a/PROMS/Volian.Controls.Library/vlnTreeView.cs +++ b/PROMS/Volian.Controls.Library/vlnTreeView.cs @@ -22,11 +22,11 @@ namespace Volian.Controls.Library public delegate void vlnTreeViewEvent(object sender, vlnTreeEventArgs args); public delegate void vlnTreeViewTimeEvent(object sender, vlnTreeTimeEventArgs args); public delegate void vlnTreeViewStatusEvent(object sender, vlnTreeStatusEventArgs args); - public delegate ItemInfo vlnTreeViewClipboardStatusEvent(object sender, vlnTreeEventArgs args); - public delegate void vlnTreeViewItemInfoEvent(object sender, vlnTreeItemInfoEventArgs args); + public delegate ItemInfo vlnTreeViewClipboardStatusEvent(object sender, vlnTreeEventArgs args); + public delegate void vlnTreeViewItemInfoEvent(object sender, vlnTreeItemInfoEventArgs args); public delegate bool vlnTreeViewBoolEvent(object sender, vlnTreeEventArgs args); public delegate bool vlnTreeViewItemInfoDeleteEvent(object sender, vlnTreeItemInfoEventArgs args); - + public delegate bool vlnTreeViewItemInfoInsertEvent(object sender, vlnTreeItemInfoInsertEventArgs args); public delegate bool vlnTreeViewItemInfoDeleteFolderEvent(object sender, vlnTreeFolderDeleteEventArgs args); public delegate bool vlnTreeViewItemInfoPasteEvent(object sender, vlnTreeItemInfoPasteEventArgs args); @@ -152,6 +152,15 @@ namespace Volian.Controls.Library get { return _Index; } set { _Index = value; } } + + //C2025-024 Electronic Procedures - Phase 2 (PROMS XML output) + //AnnotationType that would be doing an export for + private int _AnnotationTypeId = -1; + public int AnnotationTypeId + { + get { return _AnnotationTypeId; } + set { _AnnotationTypeId = value; } + } //jcb multiunit private string _Unit; public string Unit @@ -179,6 +188,13 @@ namespace Volian.Controls.Library _Destination = destination; _Index = index; } + public vlnTreeEventArgs(TreeNode node, TreeNode destination, int index, int annTypeId) + { + _Node = node; + _Destination = destination; + _Index = index; + _AnnotationTypeId = annTypeId; + } //jcb multiunit public vlnTreeEventArgs(TreeNode node, TreeNode destination, int index, string unit, int unitIndex) { @@ -188,11 +204,20 @@ namespace Volian.Controls.Library _Unit = unit; _UnitIndex = unitIndex; } + public vlnTreeEventArgs(TreeNode node, TreeNode destination, int index, string unit, int unitIndex, int annTypeId) + { + _Node = node; + _Destination = destination; + _Index = index; + _Unit = unit; + _UnitIndex = unitIndex; + _AnnotationTypeId = annTypeId; + } //end jcb multiunit #endregion public override string ToString() { - return string.Format("Node={0},Destination={1},Index={2},Unit={3},UnitIndex={4}", NodePath(this.Node), this.Destination, this.Index, this.Unit, this.UnitIndex); + return string.Format("Node={0},Destination={1},Index={2},Unit={3},UnitIndex={4}", NodePath(this.Node), this.Destination, this.Index, this.Unit, this.UnitIndex); } private string NodePath(TreeNode node) @@ -322,7 +347,7 @@ namespace Volian.Controls.Library _PasteType = pasteType; _Type = type; } - + #endregion } #endregion @@ -573,16 +598,16 @@ namespace Volian.Controls.Library { if (ProcedureCheckedOutTo != null) ProcedureCheckedOutTo(sender, args); } - - - - - - public event vlnTreeViewEvent ExportImportProcedureSets; - private void OnExportImportProcedureSets(object sender, vlnTreeEventArgs args) - { - if (ExportImportProcedureSets != null) ExportImportProcedureSets(sender, args); - } + + + + + + public event vlnTreeViewEvent ExportImportProcedureSets; + private void OnExportImportProcedureSets(object sender, vlnTreeEventArgs args) + { + if (ExportImportProcedureSets != null) ExportImportProcedureSets(sender, args); + } public event vlnTreeViewEvent PrintTransitionReport; private void OnPrintTransitionReport(object sender, vlnTreeEventArgs args) { @@ -634,7 +659,7 @@ namespace Volian.Controls.Library // This event was added to update the Step Properties/RO & Tools/Search RO & Reports // when an update of ro.fst is done & the ro trees on those panels needs refreshed. // (bug fix B2015-226) - public event StepPanelTabDisplayEvent TabDisplay; + public event StepPanelTabDisplayEvent TabDisplay; private void OnTabDisplay(object sender, StepPanelTabDisplayEventArgs args) { if (TabDisplay != null) TabDisplay(sender, args); @@ -711,7 +736,10 @@ namespace Volian.Controls.Library if (ui.IsAdministrator() || ui.IsSetAdministrator(fi))// && fi.MyParent == null) //VEPROMS level { if (fi.HasWorkingDraft) + { cm.MenuItems.Add("Export Procedure Set", new EventHandler(mi_Click)); + //AddEPExport(cm.MenuItems, 0, null); + } else cm.MenuItems.Add("Import Procedure Set", new EventHandler(mi_Click)); if (DoSpecificInfo) @@ -731,12 +759,12 @@ namespace Volian.Controls.Library } } // B2020-111 only allow Set Administrator to add new folders inside folders they admininstrate - if ((ui.IsAdministrator() || ui.IsSetAdministrator(fi.MyParent)) && fi.FolderDocVersionCount == 0) + if ((ui.IsAdministrator() || ui.IsSetAdministrator(fi.MyParent)) && fi.FolderDocVersionCount == 0) cm.MenuItems.Add("New Folder", new EventHandler(mi_Click)); - if (fi.ChildFolderCount == 0 && !fi.HasWorkingDraft) + if (fi.ChildFolderCount == 0 && !fi.HasWorkingDraft) cm.MenuItems.Add("Create Working Draft", new EventHandler(mi_Click)); } - if (fi.HasWorkingDraft) + if (fi.HasWorkingDraft) cm.MenuItems.Add("Print Transition Report", new EventHandler(mi_Click)); } else if (tn.VEObject as DocVersionInfo != null) // DocVersions can only contain procs @@ -745,14 +773,14 @@ namespace Volian.Controls.Library //_MyLog.WarnFormat("Context Menu 1c - {0}", GC.GetTotalMemory(true)); DocVersionInfo dvi = tn.VEObject as DocVersionInfo; if (ui.IsAdministrator() || ui.IsSetAdministrator(dvi)) - { - cm.MenuItems.Add("Import Procedure", mi_Click); - } - if (ui.IsAdministrator() || ui.IsSetAdministrator(dvi) || ui.IsWriter(dvi)) + { + cm.MenuItems.Add("Import Procedure", mi_Click); + } + if (ui.IsAdministrator() || ui.IsSetAdministrator(dvi) || ui.IsWriter(dvi)) { OwnerInfoList.Reset(); oil = OwnerInfoList.GetByVersionID(dvi.VersionID); - if (dvi.ActiveFormat.PlantFormat.FormatData.SpecificInfo) + if (dvi.ActiveFormat.PlantFormat.FormatData.SpecificInfo) cm.MenuItems.Add("Procedure Set Specific Information", new EventHandler(mi_Click)); cm.MenuItems.Add("Refresh Checked Out Procedures", new EventHandler(mi_Click)); cm.MenuItems.Add("New Procedure", new EventHandler(mi_Click)); @@ -846,7 +874,8 @@ namespace Volian.Controls.Library oi = OwnerInfo.GetByItemID(pri.ItemID, CheckOutType.Procedure); if (ui.IsAdministrator() || ui.IsSetAdministrator(pri.MyDocVersion)) { - cm.MenuItems.Add("Export Procedure", mi_Click); + cm.MenuItems.Add("Export Procedure", mi_Click); + AddEPExport(cm.MenuItems, pri.MyDocVersion.MultiUnitCount, pri.MyDocVersion.UnitNames); } if (ui.IsAdministrator() || ui.IsSetAdministrator(pri.MyDocVersion) || ui.IsWriter(pri.MyDocVersion)) { @@ -898,7 +927,7 @@ namespace Volian.Controls.Library } cm.MenuItems.Add(micas); cm.MenuItems.Add(mitcas); - cm.MenuItems.Add(mip); + cm.MenuItems.Add(mip); cm.MenuItems.Add(miqp); //cm.MenuItems.Add(mips); AddShowChangeBarsAfterMenuItem(cm.MenuItems, pri); @@ -1132,35 +1161,35 @@ namespace Volian.Controls.Library #region Menu_Delete if (ok) - - - - - - { - // Add delete to the menu unless at the very 'top' node, on a grouping (partinfo) - // node (RNOs, Steps, Cautions, Notes) or Folder/DocVersion that contains any items. - PartInfo pi = tn.VEObject as PartInfo; - if (pi == null && tn.Parent != null) // it's not a part and it's not the top.... + + + + + { - fi = tn.VEObject as FolderInfo; - if (fi == null || tn.Nodes.Count == 0) // it's not a folder or it has no children + // Add delete to the menu unless at the very 'top' node, on a grouping (partinfo) + // node (RNOs, Steps, Cautions, Notes) or Folder/DocVersion that contains any items. + PartInfo pi = tn.VEObject as PartInfo; + if (pi == null && tn.Parent != null) // it's not a part and it's not the top.... { - DocVersionInfo di = tn.VEObject as DocVersionInfo; - if (di == null || tn.Nodes.Count == 0) // it's not a docversion or it has no children + fi = tn.VEObject as FolderInfo; + if (fi == null || tn.Nodes.Count == 0) // it's not a folder or it has no children { - // if it's an enhanced step that was linked from a source, don't allow delete - bool canDoDel = true; - ItemInfo iienh = tn.VEObject as ItemInfo; - if (iienh != null && iienh.IsProcedure && iienh.IsEnhancedProcedure) canDoDel = false; - if (iienh != null && iienh.IsSection && iienh.IsEnhancedSection && !iienh.IsEnhancedSectionTitleOnly) canDoDel = false; - if (iienh != null && iienh.IsEnhancedStep) canDoDel = false; - if (canDoDel) cm.MenuItems.Add("Delete", new EventHandler(mi_Click)); + DocVersionInfo di = tn.VEObject as DocVersionInfo; + if (di == null || tn.Nodes.Count == 0) // it's not a docversion or it has no children + { + // if it's an enhanced step that was linked from a source, don't allow delete + bool canDoDel = true; + ItemInfo iienh = tn.VEObject as ItemInfo; + if (iienh != null && iienh.IsProcedure && iienh.IsEnhancedProcedure) canDoDel = false; + if (iienh != null && iienh.IsSection && iienh.IsEnhancedSection && !iienh.IsEnhancedSectionTitleOnly) canDoDel = false; + if (iienh != null && iienh.IsEnhancedStep) canDoDel = false; + if (canDoDel) cm.MenuItems.Add("Delete", new EventHandler(mi_Click)); + } } } } - } - + #endregion //_MyLog.WarnFormat("Context Menu 6 - {0}", GC.GetTotalMemory(true)); #region Menu_ExternalTransitions @@ -1224,8 +1253,8 @@ namespace Volian.Controls.Library // node (RNOs, Steps, Cautions, Notes) or at the step level. // B2020-105 Allow Set Administrators to rename folder's (sets of procedures) to which they have been given access. if (tn.VEObject is FolderInfo) ok = (ui.IsAdministrator() || ui.IsSetAdministrator(tn.VEObject as FolderInfo)); - else ok = (tn.VEObject is DocVersionInfo) ? (ui.IsAdministrator() || ui.IsSetAdministrator(tn.VEObject as DocVersionInfo)) - : (ui.IsAdministrator() || (tn.VEObject is ItemInfo) && (ui.IsSetAdministrator((tn.VEObject as ItemInfo).MyProcedure.MyDocVersion) + else ok = (tn.VEObject is DocVersionInfo) ? (ui.IsAdministrator() || ui.IsSetAdministrator(tn.VEObject as DocVersionInfo)) + : (ui.IsAdministrator() || (tn.VEObject is ItemInfo) && (ui.IsSetAdministrator((tn.VEObject as ItemInfo).MyProcedure.MyDocVersion) || ui.IsWriter((tn.VEObject as ItemInfo).MyProcedure.MyDocVersion))); PartInfo pia = tn.VEObject as PartInfo; ItemInfo ii = tn.VEObject as ItemInfo; @@ -1306,7 +1335,7 @@ namespace Volian.Controls.Library itm.Text == "Procedure Set Specific Information" || itm.Text == "Approve All Procedures for" || itm.Text == "Approve Some Procedures" || itm.Text == "Approve Some Procedures for") itm.Enabled = false; - + } } } @@ -1335,9 +1364,9 @@ namespace Volian.Controls.Library // F2022-024 added Time Critical Action Summary option foreach (MenuItem itm in cm.MenuItems) { - if (itm.Text == "Procedure Specific Information" || itm.Text == "New Section" || itm.Text == "Approve" || itm.Text == "Open" || + if (itm.Text == "Procedure Specific Information" || itm.Text == "New Section" || itm.Text == "Approve" || itm.Text == "Open" || itm.Text == "Copy" || itm.Text == "Delete" || itm.Text == "Properties..." || itm.Text == "Replace Existing Procedure" || - itm.Text.StartsWith("Showing Change Bars Starting") || itm.Text == "Create Continuous Action Summary" || + itm.Text.StartsWith("Showing Change Bars Starting") || itm.Text == "Create Continuous Action Summary" || itm.Text == "Create Time Critical Action Summary" || itm.Text == "Export Procedure") itm.Enabled = false; } @@ -1359,7 +1388,53 @@ namespace Volian.Controls.Library } } - private void AddApprovedRevisionsMultiUnit(Menu.MenuItemCollection menuItemCollection, ProcedureInfo pri) + //C2025-024 Electronic Procedures - Phase 2 (PROMS XML output) + // Add context menu for exporting Electronic Procedures + // if has an Electronic procedure + // then loop through and add an Export for each EP Viewer + private void AddEPExport(Menu.MenuItemCollection menuItems, int MultiUnitCount, string[] UnitNames) + { + //get EP Annotations + AnnotationTypeInfoList annotations = AnnotationTypeInfoList.Get(); + List epAnnotations = new List(); + foreach (AnnotationTypeInfo tmp in annotations) + { + if (tmp.IsEPAnnotationType) epAnnotations.Add(tmp); + } + + if (epAnnotations.Count == 0) return; // no Electronic Procedures + + //add outer menu + MenuItem mi = menuItems.Add("Electronic Procedure Viewer Export"); + foreach (AnnotationTypeInfo epAnn in epAnnotations) + { + //Add item for each individual EP Viewer + MenuItem mv = mi.MenuItems.Add(epAnn.Name); + + //tag will be of format: + //{EP Annotation Type ID},{Unit} + //if not multi-unit, unit will be zero. + if (MultiUnitCount > 1) + { + //if multi-unit, add menu item for each unit + int k = 0; + foreach (string s in UnitNames) + { + k++; + MenuItem multiunit_mv = mv.MenuItems.Add(s); + multiunit_mv.Tag = $"{epAnn.TypeID},{k}"; + multiunit_mv.Click += new EventHandler(miEP_Click); + } + } + else + { + mv.Tag = $"{epAnn.TypeID},0"; + mv.Click += new EventHandler(miEP_Click); + } + } + } + + private void AddApprovedRevisionsMultiUnit(Menu.MenuItemCollection menuItemCollection, ProcedureInfo pri) { _currentPri = pri; RevisionInfoList ril = RevisionInfoList.GetByItemID(pri.ItemID); @@ -1410,11 +1485,11 @@ namespace Volian.Controls.Library ril = null; } } - public void AddNewNode(IVEDrillDownReadOnly o) - { - VETreeNode tn = new VETreeNode(o); - SelectedNode.Nodes.Add(tn); - } + public void AddNewNode(IVEDrillDownReadOnly o) + { + VETreeNode tn = new VETreeNode(o); + SelectedNode.Nodes.Add(tn); + } private void AddApprovedRevisions(Menu.MenuItemCollection menuItemCollection, ProcedureInfo pri) { try @@ -1423,7 +1498,7 @@ namespace Volian.Controls.Library _currentPri = pri; using (RevisionInfoList ril = RevisionInfoList.GetByItemID(pri.ItemID)) { - //_MyLog.WarnFormat("Context Menu 1 After GET - {0}", GC.GetTotalMemory(true)); + //_MyLog.WarnFormat("Context Menu 1 After GET - {0}", GC.GetTotalMemory(true)); if (ril.Count == 0) return; // no versions to list MenuItem mi = menuItemCollection.Add("Versions"); int lastApprovedRevisionID = 0; @@ -1557,7 +1632,7 @@ namespace Volian.Controls.Library } vlnTreeViewPdfArgs args = new vlnTreeViewPdfArgs(Volian.Base.Library.TmpFile.CreateFileName(ProcedureInfo.Get(ri.ItemID).PDFNumber), ri.LatestVersion.PDF, superceded ? "Superceded" : ""); OnViewPDF(sender, args); - // System.Diagnostics.Process pp = System.Diagnostics.Process.Start(GetDocPdf(ri, superceded)); +// System.Diagnostics.Process pp = System.Diagnostics.Process.Start(GetDocPdf(ri, superceded)); } void MultiUnitApprovedRevision_Click(object sender, EventArgs e) { @@ -1680,7 +1755,7 @@ namespace Volian.Controls.Library // 3) 'to' docversion is 'source' and 'from' procedure is within this docversion // 4) 'to' docVersion is 'enhanced' and 'from' procedure is not bool canPaste = false; - + DocVersionInfo dvi = tn.VEObject as DocVersionInfo; DocVersionConfig dvc = dvi.DocVersionConfig; bool docVersionIsEnhanced = dvc.MyEnhancedDocuments != null && dvc.MyEnhancedDocuments.Count > 0 && dvc.MyEnhancedDocuments[0].Type == 0; @@ -1701,7 +1776,7 @@ namespace Volian.Controls.Library if (iiClipboard.IsRtfRaw) canPaste = false; // never paste an equation. if (canPaste) cm.MenuItems.Add("Paste Procedure", new EventHandler(mi_Click)); } - #endregion + #endregion } else { @@ -1919,7 +1994,7 @@ namespace Volian.Controls.Library OnQPrintSection(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0, mi.Text, (int)mi.Tag)); break; case "Print All Procedures for": - OnPrintAllProcedures(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0, mi.Text, (int)mi.Tag)); + OnPrintAllProcedures(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0, mi.Text, (int)mi.Tag)); break; case "Approve": OnApproveProcedure(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0, mi.Text, (int)mi.Tag)); @@ -1980,7 +2055,7 @@ namespace Volian.Controls.Library if (hasValidConnectingProc) { ItemInfo lprc = ItemInfo.Get(seleds[0].ItemID); - lprc.DoUnlinkEnhanced(lprc, 0, !hasValidConnectingProc); + lprc.DoUnlinkEnhanced(lprc, 0, !hasValidConnectingProc); } else selprc.DoUnlinkEnhanced(selprc, seleds[0].Type, !hasValidConnectingProc); @@ -2000,7 +2075,7 @@ namespace Volian.Controls.Library { ItemInfo lprc = ItemInfo.Get(ed.ItemID); bool hasValidConnectingProc = CheckForValidEnhLink(lprc); - // if there is a valid connection, unlink both. Otherwise, just unlink this selected procedure. + // if there is a valid connection, unlink both. Otherwise, just unlink this selected procedure. if (hasValidConnectingProc) lprc.DoUnlinkEnhanced(lprc, ed.Type, !hasValidConnectingProc); else @@ -2024,37 +2099,37 @@ namespace Volian.Controls.Library OnNodeSI(this, new vlnTreeEventArgs(tn, null, 0)); return; } - if (mi.Text.StartsWith("Collapse")) - { + if (mi.Text.StartsWith("Collapse")) + { CollapseProcedures(); - return; - } + return; + } if (mi.Text == "Print Transition Report") { OnPrintTransitionReport(this, new vlnTreeEventArgs(SelectedNode as VETreeNode)); return; } - - - - - - - - - - - if (mi.Text == "Export Procedure Set" || mi.Text == "Export Procedure") - { - OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0)); - return; - } - if (mi.Text == "Import Procedure Set" || mi.Text == "Import Procedure") - { - OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 1)); - return; - } - if (mi.Text.StartsWith("Procedure Checked Out to") || mi.Text.StartsWith("Document Checked Out to")) + + + + + + + + + + + if (mi.Text == "Export Procedure Set" || mi.Text == "Export Procedure") + { + OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0)); + return; + } + if (mi.Text == "Import Procedure Set" || mi.Text == "Import Procedure") + { + OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 1)); + return; + } + if (mi.Text.StartsWith("Procedure Checked Out to") || mi.Text.StartsWith("Document Checked Out to")) { OnProcedureCheckedOutTo(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0)); return; @@ -2080,7 +2155,7 @@ namespace Volian.Controls.Library break; case "New Folder": SelectedNode.Expand(); - tv_NodeNew(MenuSelections.Folder); + tv_NodeNew(MenuSelections.Folder); break; case "Create Working Draft": SelectedNode.Expand(); @@ -2124,7 +2199,7 @@ namespace Volian.Controls.Library tv_NodeCopy(); break; // lots of paste options: - case "Paste Procedure": + case "Paste Procedure": case "Paste Procedure Before": case "Paste Procedure After": case "Paste Section": @@ -2158,7 +2233,7 @@ namespace Volian.Controls.Library break; } - + case "Delete": if (tv_NodeDelete()) { @@ -2226,12 +2301,12 @@ namespace Volian.Controls.Library case "Create Continuous Action Summary": OnCreateContinuousActionSummary(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0)); break; - // F2022-024 Time Critical Action Summary + // F2022-024 Time Critical Action Summary case "Create Time Critical Action Summary": OnCreateTimeCriticalActionSummary(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0)); break; - // B2017-243 added the following two Cannot Paste items when dealing with enhanced documents - // when then user selects these menu items a message box will appear giving more information as to why it cannot be pasted + // B2017-243 added the following two Cannot Paste items when dealing with enhanced documents + // when then user selects these menu items a message box will appear giving more information as to why it cannot be pasted case "CANNOT PASTE HERE. Click for more information...": FlexibleMessageBox.Show("You have copied a document that is linked to an Enhanced Document.\n\n" + "It can only be pasted before or after another document, within the set, that is linked to an Enhanced Document.", "Cannot Paste Here"); @@ -2255,6 +2330,23 @@ namespace Volian.Controls.Library break; } } + + //C2025-024 Electronic Procedures - Phase 2 (PROMS XML output) + // Handles clicking of items in the context menu + // for exporting Electronic Procedures + // tag will be of format: + // {EP Annotation Type ID},{Unit} + // if not multi-unit, unit will be zero. + void miEP_Click(object sender, EventArgs e) + { + MenuItem mi = sender as MenuItem; + int annTypeid = int.Parse(((string)mi.Tag).Split(',')[0]); + int unit = int.Parse(((string)mi.Tag).Split(',')[1]); + if (unit == 0) + OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0, annTypeid)); + else + OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0, "", unit, annTypeid)); + } private bool _doingCollapseNode = false; // B2016-058 when collapse is done, it always calls the drag node event which doesn't appear to be needed private void CollapseProcedures() { @@ -2273,7 +2365,7 @@ namespace Volian.Controls.Library foreach (VETreeNode tnc in tn.Nodes) CollapseProcedures(tnc); if (tn.VEObject as DocVersionInfo == null && tn.VEObject as FolderInfo == null) - tn.Collapse(); + tn.Collapse(); _doingCollapseNode = true; // B2016-058 this will prevent a Drag Node error when collapsing an RNOs, Cautions, or Notes tree node } private void tv_RemoveChgIds() @@ -2333,7 +2425,7 @@ namespace Volian.Controls.Library using (DocVersion dv = DocVersion.Get(MyDVI.VersionID)) { swROUpdate = new System.IO.StreamWriter(ROFstInfo.ROUpdateResultsPath(MyDVI)); // RO changes placed in file in the Documents\VEPROMS folder - // B2022-026 RO Memory Reduction code - first load the new ro.fst so that we can assign the ROTableUpdate event to the correct roFstInfo + // 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 @@ -2474,7 +2566,7 @@ namespace Volian.Controls.Library return; } // C2017-003: ro data in sql server, check for sql connection string - if (MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString != "cstring") + if (MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString != "cstring") roloc = roloc + " \"" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString + "\""; // C2021-026 pass in Parent/Child information (list of the children) // B2022-019 look at all DocVersions to find ParentChild information @@ -2525,7 +2617,7 @@ namespace Volian.Controls.Library } } VETreeNode tn = SelectedNode as VETreeNode; - + DocVersionInfo dvi = tn.VEObject as DocVersionInfo; // Check for paste into a docversion - queries/code is different than paste related to an item (into a proc or section) if (dvi != null) @@ -2575,7 +2667,7 @@ namespace Volian.Controls.Library if (OnlyProc && repitem != null && tmp != null) { VETreeNode tn1 = new VETreeNode(repitem); - tmp.Nodes.Add(tn1); + tmp.Nodes.Add(tn1); SelectedNode = tn1; } } @@ -2584,7 +2676,7 @@ namespace Volian.Controls.Library //if (p.IndexOf("Replace") <= -1) - this.Cursor = Cursors.Default; + this.Cursor = Cursors.Default; } public void PasteAsDocVersionChild(VETreeNode tn, int copyStartID) @@ -2653,7 +2745,7 @@ namespace Volian.Controls.Library // the item to be pasted in the step editor and the tree. ItemInfo newItemInfo = null; // F2021-009 display a message if pasting step will results in more sub-step levels than are defined in the format - if (!ii.IsProcedure) + if (!ii.IsProcedure) ItemInfo.PasteStepIsWithinDefinedSubStepLevels(copyStartID, ii, false); if (ii.IsProcedure || !OnPasteItemInfo(this, new vlnTreeItemInfoPasteEventArgs(ii, copyStartID, pasteOpt, ii.MyContent.Type))) { @@ -2716,7 +2808,7 @@ namespace Volian.Controls.Library SelectedNode.Nodes.Add(tn1); // add tree node to end of list. SelectedNode = tn1; } - private void tv_NodeCopy() + private void tv_NodeCopy() { if (SelectedNode == null) return; VETreeNode tn = SelectedNode as VETreeNode; @@ -2754,7 +2846,7 @@ namespace Volian.Controls.Library { using (Folder folder = folderInfo.Get()) { - OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(string.Format("{0} Properties", folder.FolderConfig.Name), folder.FolderConfig)); + OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(string.Format("{0} Properties", folder.FolderConfig.Name), folder.FolderConfig)); } } private void OpenProperties(DocVersionInfo dvInfo) @@ -2768,7 +2860,7 @@ namespace Volian.Controls.Library { using (Procedure proc = procInfo.Get()) { - OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(string.Format("{0} {1} Properties", proc.ProcedureConfig.Number, proc.ProcedureConfig.Title), proc.ProcedureConfig)); + OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(string.Format("{0} {1} Properties", proc.ProcedureConfig.Number, proc.ProcedureConfig.Title), proc.ProcedureConfig)); } } private void OpenProperties(SectionInfo sectInfo) @@ -2781,7 +2873,7 @@ namespace Volian.Controls.Library title = string.Format("{0} {1} Properties", sectInfo.SectionConfig.Number, sectInfo.SectionConfig.Title); else title = string.Format("{0} Properties", sectInfo.SectionConfig.Title); - OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(title, sect.SectionConfig)); + OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(title, sect.SectionConfig)); } } private void OpenProperties(StepInfo stpinfo) @@ -2919,7 +3011,7 @@ namespace Volian.Controls.Library procedure.Save(); tn = new VETreeNode(_LastProcedureInfo); SelectedNode.Nodes.Add(tn); // add tree node to end of list. - // The following line will allow for a refresh of the procedure list on the Working Draft's treenodes docversion (B2016-034) + // The following line will allow for a refresh of the procedure list on the Working Draft's treenodes docversion (B2016-034) if (((SelectedNode as VETreeNode).VEObject as DocVersionInfo) != null) ((SelectedNode as VETreeNode).VEObject as DocVersionInfo).ResetProcedures(); if (procedure.MyProcedureInfo.CreateEnhanced) { @@ -2961,7 +3053,7 @@ namespace Volian.Controls.Library else p2 = procedure.ItemID; } - if (p2 != -1) + if (p2 != -1) DeleteItemInfoAndChildren(_LastProcedureInfo); // Delete Item and reset Previous and Next } #endregion @@ -2971,11 +3063,11 @@ namespace Volian.Controls.Library string message = string.Empty; if (_LastProcedureInfo != null) if (!MySessionInfo.CanCheckOutItem(_LastProcedureInfo.ItemID, CheckOutType.Procedure, ref message)) - { - FlexibleMessageBox.Show(this, message, "Item Already Checked Out", MessageBoxButtons.OK, MessageBoxIcon.Warning); - OnUnPauseRefresh(this, null); - return; - } + { + FlexibleMessageBox.Show(this, message, "Item Already Checked Out", MessageBoxButtons.OK, MessageBoxIcon.Warning); + OnUnPauseRefresh(this, null); + return; + } int s1 = -1; if (!(_LastProcedureInfo == null) || !(_LastSectionInfo == null)) { @@ -3028,8 +3120,8 @@ namespace Volian.Controls.Library { tn = new VETreeNode(_LastSectionInfo); SelectedNode.Nodes.Add(tn); // add tree node to end of list. - // if the new section was flagged as either having an enhanced link for Title or Contents, create the - // Enhanced section: + // if the new section was flagged as either having an enhanced link for Title or Contents, create the + // Enhanced section: Section sectiontmp = Section.Get(section.ItemID); // need to do this because of 'caching' problem. if (sectiontmp.SectionConfig.LinkEnhanced == "T" || sectiontmp.SectionConfig.LinkEnhanced == "Y") CreateEnhancedForSection(newtype, sectiontmp, savLastSectionInfo, sectiontmp.DisplayNumber, sectiontmp.MyContent.Text); @@ -3057,7 +3149,7 @@ namespace Volian.Controls.Library if (s1 != -1) { DeleteItemInfoAndChildren(_LastSectionInfo);// Delete Item and reset Previous and Next - // B2020-087 refresh the tree node after canceling the creation of the subsection + // B2020-087 refresh the tree node after canceling the creation of the subsection _LastTreeNode.ChildrenLoaded = false; _LastTreeNode.RefreshNode(); _LastTreeNode.Collapse(); @@ -3104,7 +3196,7 @@ namespace Volian.Controls.Library if (s2 != -1) { DeleteItemInfoAndChildren(_LastSectionInfo);// Delete Item and reset Previous and Next - // B2020-087 refresh the tree node after canceling the creation of the subsection + // B2020-087 refresh the tree node after canceling the creation of the subsection _LastTreeNode.ChildrenLoaded = false; _LastTreeNode.RefreshNode(); _LastTreeNode.Collapse(); @@ -3301,7 +3393,7 @@ namespace Volian.Controls.Library cs.Save(); } } - + private Section CreateNewSection() { // B2020-087 the config for SubSection_Edit was sometimes set even when there wasn't any subsections, @@ -3341,7 +3433,7 @@ namespace Volian.Controls.Library // The parent step was not open in the step editor, just create new step(s) and add treenode. int newId = -1; // B2020-076: if this step has a template, insert template steps. - int topType = ii.GetSmartTemplateTopLevelIndxOfThisType(20002); + int topType = ii.GetSmartTemplateTopLevelIndxOfThisType(20002); if (topType != -1) { ItemInfo tmp = null; @@ -3561,7 +3653,7 @@ namespace Volian.Controls.Library { foreach (DVEnhancedDocument dve in dvc.MyEnhancedDocuments) { - if (dve.Type != 0) + if (dve.Type != 0) DocVersion.Delete(dve.VersionID); else { @@ -3607,7 +3699,7 @@ namespace Volian.Controls.Library if (ed.Type != 0) enhIds.Add(ed.ItemID); // always return false because an event gets fired to delete tree nodes. if (!DeleteItemInfoAndChildren(_LastProcedureInfo)) return false; - + _LastProcedureInfo = null; foreach (int enhId in enhIds) { @@ -3706,7 +3798,7 @@ namespace Volian.Controls.Library } return false; } - + public void RemoveFolder(int folderId) { TreeNode nodeToRemove = FindNodeById(folderId, this.Nodes); @@ -3780,7 +3872,7 @@ namespace Volian.Controls.Library // C2020-033: Support delete to bring up Search/Incoming Transitions panel if (ex.Message.Contains("has External Transitions")) { - ItemInfo iis = ItemInfo.Get(ii.ItemID); + ItemInfo iis = ItemInfo.Get(ii.ItemID); OnSearchIncTransIn(this, new vlnTreeItemInfoEventArgs(iis)); iis = ii.HandleSqlExceptionOnDelete(ex); } @@ -3878,7 +3970,7 @@ namespace Volian.Controls.Library ItemInfo iidrag = ((VETreeNode)dragNode).VEObject as ItemInfo; FolderInfo fdrag = ((VETreeNode)dragNode).VEObject as FolderInfo; DocVersionInfo ddrag = ((VETreeNode)dragNode).VEObject as DocVersionInfo; - if ((iidrag == null && fdrag == null && ddrag == null)) + if ((iidrag == null && fdrag == null && ddrag == null)) { FlexibleMessageBox.Show("Cannot drag/drop a grouping node."); return; @@ -3929,7 +4021,7 @@ namespace Volian.Controls.Library { get { return _lastScroll; } } - private string _location = string.Empty; + private string _location = string.Empty; #endregion #region Constructors public DropLocation(TreeView tv, System.Windows.Forms.DragEventArgs e, DateTime lastScroll) @@ -4046,7 +4138,7 @@ namespace Volian.Controls.Library { return; } - //if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("Line at {0} Node {1}[{2}] {3}", _location, _dropNode.Text, _index, _position.ToString()); + //if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("Line at {0} Node {1}[{2}] {3}", _location, _dropNode.Text, _index, _position.ToString()); // Changed the color of the drag indicator to always be red Color lc = (_position == DropPosition.After ? Color.Red : Color.Red); Brush lb = (_position == DropPosition.After ? Brushes.Red : Brushes.Red); @@ -4073,12 +4165,12 @@ namespace Volian.Controls.Library //if (e.Effect == DragDropEffects.None) return; if (_dropNode != null) { - // if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("ShowLocation1 {0} {1}", e.Effect.ToString(), DateTime.Now.Millisecond); +// if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("ShowLocation1 {0} {1}", e.Effect.ToString(), DateTime.Now.Millisecond); DragHelper.ImageList_DragShowNolock(false); TreeView tv = _dropNode.TreeView; TreeNode tmp = tv.GetNodeAt(tv.PointToClient(new Point(e.X, e.Y))); - // if (!ScrollOnly) - // { +// if (!ScrollOnly) +// { if (ScrollTreeView(tmp) || !ScrollOnly) { //if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("ShowLocation2 {0} {1}", e.Effect.ToString(), DateTime.Now.Millisecond); @@ -4091,8 +4183,8 @@ namespace Volian.Controls.Library if (_position != DropPosition.Child) InsertPointer(tmp, g); } } - // } - // else ScrollTreeView(tmp); +// } +// else ScrollTreeView(tmp); DragHelper.ImageList_DragShowNolock(true); } } @@ -4115,10 +4207,10 @@ namespace Volian.Controls.Library tn.NextVisibleNode.EnsureVisible();// Make sure that the next node is visible else if (tn.PrevVisibleNode != null && tn.PrevVisibleNode.PrevVisibleNode != null && tn.PrevVisibleNode.PrevVisibleNode.IsVisible == false) - tn.PrevVisibleNode.PrevVisibleNode.EnsureVisible();// Make sure that the previous node is visible } - else + tn.PrevVisibleNode.PrevVisibleNode.EnsureVisible();// Make sure that the previous node is visible } + else if (tn.PrevVisibleNode != null && tn.PrevVisibleNode.IsVisible == false) - tn.PrevVisibleNode.EnsureVisible();// Make sure that the previous node is visible + tn.PrevVisibleNode.EnsureVisible();// Make sure that the previous node is visible retval = (top != tn.Bounds.Top); // if (retval) if(_MyLog.IsInfoEnabled)_MyLog.Info("Scroll"); } @@ -4151,7 +4243,7 @@ namespace Volian.Controls.Library { DragDropEffects ee = e.Effect; if (e.KeyState == 13) // Shift and Control Keys to do a move. - ee = DragDropEffects.Move; + ee = DragDropEffects.Move; else ee = DragDropEffects.None; // Default - Do nothing if (IsChild(dragNode, dl.DropNode)) // Don't copy or move to a child node @@ -4347,28 +4439,28 @@ namespace Volian.Controls.Library if (_MyLog.IsErrorEnabled) _MyLog.Error("tv_DragDrop", ex); } } - // private void DumpMembers(object o) - // { - // Type t = o.GetType(); - // //if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("\r\n\r\nMembers for type {0}", t.ToString()); - // MemberInfo[] mis = t.GetMembers(); - // int i = 0; - // foreach (MemberInfo mi in mis) - // { - // i++; - // try - // { - // //if(mi.MemberType != MemberTypes.Method) - // //if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("{0} {1} {2}", i, mi.Name, mi.MemberType); - //// if (fi.Name == "TreeView") - //// fi.SetValue(o, null); - // } - // catch (Exception ex) - // { - // if(_MyLog.IsErrorEnabled)_MyLog.Error("DumpMembers", ex); - // } - // } - // } +// private void DumpMembers(object o) +// { +// Type t = o.GetType(); +// //if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("\r\n\r\nMembers for type {0}", t.ToString()); +// MemberInfo[] mis = t.GetMembers(); +// int i = 0; +// foreach (MemberInfo mi in mis) +// { +// i++; +// try +// { +// //if(mi.MemberType != MemberTypes.Method) +// //if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("{0} {1} {2}", i, mi.Name, mi.MemberType); +//// if (fi.Name == "TreeView") +//// fi.SetValue(o, null); +// } +// catch (Exception ex) +// { +// if(_MyLog.IsErrorEnabled)_MyLog.Error("DumpMembers", ex); +// } +// } +// } private TreeNode Clone(TreeNode tn) { diff --git a/PROMS/Volian.Print.Library/PDFReport.cs b/PROMS/Volian.Print.Library/PDFReport.cs index 39bf29f8..e660630e 100644 --- a/PROMS/Volian.Print.Library/PDFReport.cs +++ b/PROMS/Volian.Print.Library/PDFReport.cs @@ -1688,7 +1688,7 @@ namespace Volian.Print.Library System.Windows.Forms.MessageBox.Show(msg.ToString(), "Error during PDF creation for search:", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation); } - private static string BuildStepTab(ItemInfo item) + public static string BuildStepTab(ItemInfo item) { if (item == null) return string.Empty;