From b695681abadcd79f6f96c1a1fdef412db9a2ad59 Mon Sep 17 00:00:00 2001 From: Rich Date: Tue, 5 Apr 2016 16:05:19 +0000 Subject: [PATCH] code to support CPS Editor --- .../AnnotationDetails.cs | 312 +++++++++++++++++- 1 file changed, 299 insertions(+), 13 deletions(-) diff --git a/PROMS/Volian.Controls.Library/AnnotationDetails.cs b/PROMS/Volian.Controls.Library/AnnotationDetails.cs index 8bc51159..13924b20 100644 --- a/PROMS/Volian.Controls.Library/AnnotationDetails.cs +++ b/PROMS/Volian.Controls.Library/AnnotationDetails.cs @@ -7,17 +7,143 @@ using System.Text; using System.Windows.Forms; using VEPROMS.CSLA.Library; using Volian.Base.Library; +using Volian.Pipe.Library; +using System.Xml; +using System.Diagnostics; namespace Volian.Controls.Library { + public delegate void NewMessageDelegate(string NewMessage); public partial class AnnotationDetails : UserControl { private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #region Properties private bool _LoadingAnnotation = false; private bool _LoadingGrid = false; + private XmlDocument _ProcList; + private ItemInfo _ProcItem = null; + public ItemInfo ProcItem + { + get { return _ProcItem; } + set + { + if (_ProcItem == value) return; + _ProcItem = value; + CreateProcList(); + } + } - private ItemInfo _CurrentItem = null; + private void CreateProcList() + { + _ProcList = null; + if (_ProcItem == null) return; + _ProcList = new XmlDocument(); + _ProcList.LoadXml(""); + AddItem(0,ProcItem); + //Console.WriteLine(_ProcList.OuterXml); + } + private void AddItem(int parentID, ItemInfo myItemInfo) + { + if (myItemInfo.IsProcedure || myItemInfo.IsSection || myItemInfo.IsHigh || + myItemInfo.IsRNOPart || myItemInfo.IsSequential || myItemInfo.IsNote || + myItemInfo.IsCaution) + { + XmlElement xe = _ProcList.CreateElement(TypeName(myItemInfo)); + AddAttribute(xe, "ItemID", myItemInfo.ItemID); + AddAttribute(xe, "ParentID", parentID); + if (myItemInfo.IsProcedure || myItemInfo.IsSection) + AddAttribute(xe, "Number", myItemInfo.DisplayNumber); + else + AddAttribute(xe, "Number", myItemInfo.MyTab.CleanText); + AddAttribute(xe, "Text", myItemInfo.DisplayText); + _ProcList.DocumentElement.AppendChild(xe); + + if (myItemInfo.Cautions != null) foreach (StepInfo caui in myItemInfo.Cautions) AddItem(myItemInfo.ItemID, caui); + if (myItemInfo.Notes != null) foreach (StepInfo noti in myItemInfo.Notes) AddItem(myItemInfo.ItemID, noti); + if (myItemInfo.RNOs != null) foreach (StepInfo rnoi in myItemInfo.RNOs) AddItem(myItemInfo.ItemID, rnoi); + if (myItemInfo.Sections != null) foreach (SectionInfo seci in myItemInfo.Sections) AddItem(myItemInfo.ItemID, seci); + if (myItemInfo.Steps != null) + { + if(myItemInfo.IsSection || (myItemInfo.IsHigh && SubStepHasRNOs(myItemInfo.Steps))) + foreach (StepInfo stpi in myItemInfo.Steps) AddItem(myItemInfo.ItemID, stpi); + } + } + } + + private string TypeName(ItemInfo myItemInfo) + { + if (myItemInfo.IsProcedure) return "Procedure"; + if (myItemInfo.IsSection) return "Section"; + if (myItemInfo.IsHigh) return "Step"; + if (myItemInfo.IsRNOPart) return "RNO"; + if (myItemInfo.IsCaution) return "Caution"; + if (myItemInfo.IsNote) return "Note"; + return "Substep"; + } + private bool SubStepHasRNOs(ItemInfoList substeps) + { + foreach (ItemInfo ii in substeps) + if (ii.RNOs != null) return true; + return false; + } + private ItemInfo _CurrentItem = null; + public ItemInfo CurrentItem + { + get { return _CurrentItem; } + set + { + _CurrentItem = value; + SetupCurrentItemValues(); + SetupConfigEdit(); + if (_ExeType > 0) SendPromsAnnotationData(); + } + } + private int _FromType; + private string _ROPath; + private void SetupCurrentItemValues() + { + _FromType = 0; + if (CurrentItem.FirstSibling.ItemPartCount > 0) + _FromType = CurrentItem.FirstSibling.ItemParts[0].FromType; + _ROPath = ""; + if (CurrentItem.MyDocVersion != null) + if (CurrentItem.MyDocVersion.DocVersionAssociationCount > 0) + _ROPath = CurrentItem.MyDocVersion.DocVersionAssociations[0].MyROFst.MyRODb.FolderPath; + ProcItem = CurrentItem.MyProcedure; + } + public AnnotationInfo FirstExeAnnotation(ItemInfo ii) + { + if (ii == null) return null; + if (ii.ItemAnnotationCount == 0) return null; + foreach (AnnotationInfo ai in ii.ItemAnnotations) + if (ai.TypeID == _ExeType) return ai; + return null; + } + private void SetupConfigEdit() + { + if (_ExeType == 0) + { + _ExeType = -1; + foreach (AnnotationTypeInfo ati in AnnotationTypeInfoList.Get()) + { + if ((ati.Config ?? "") != "") + { + _ExePath = ati.AnnotationTypeConfig.Integration_Executable; + _PipeIn = ati.AnnotationTypeConfig.Integration_PipeIn; + _PipeOut = ati.AnnotationTypeConfig.Integration_PipeOut; + if (_ExePath != "" && _PipeIn != "" && _PipeOut != "") + { + _ExeType = ati.TypeID; + break; + } + } + } + } + } + private string _ExePath; + private string _PipeOut; + private string _PipeIn; + private int _ExeType=0; private DisplaySearch _AnnotationSearch; private AnnotationInfoList _Annotations; @@ -216,6 +342,8 @@ namespace Volian.Controls.Library } _LoadingAnnotation = false; AnnotationDirty = false; + if (!rtxbComment.Visible) + rtxbComment.Visible = true; if (!_LoadingGrid) rtxbComment.Focus(); // Set the focus to the comment text if (CurrentAnnotation != null && MyUserInfo.IsReviewer(CurrentAnnotation.MyItem.MyDocVersion ) && CurrentAnnotation.UserID != MyUserInfo.UserID) @@ -232,8 +360,171 @@ namespace Volian.Controls.Library } } - #endregion + private void CheckClientProcess() + { + if (ClientProcess.HasExited) + { + ClientProcess = null; + StartClientProcess(); + } + } + void ClientProcess_Exited(object sender, EventArgs e) + { + ClientProcess = null; + } + private Process _ClientProcess; + public Process ClientProcess + { + get { + if (_ClientProcess == null) + { + StartClientProcess(); + } + return _ClientProcess; + } + set { _ClientProcess = value; } + } + + private void StartClientProcess() + { + _ClientProcess = Process.Start(_ExePath); + _ClientProcess.WaitForInputIdle(); + _ClientProcess.Exited += ClientProcess_Exited; + } + private void SendPromsAnnotationData() + { + Console.WriteLine("Send {0}", CurrentItem); + XmlDocument xdMessage = new XmlDocument(); + xdMessage.LoadXml(""); + // Add Steps Data + if(_ProcList != null) + { + xdMessage.DocumentElement.AppendChild(xdMessage.ImportNode(_ProcList.DocumentElement, true)); + _ProcList = null; + } + // Add Config Data + AnnotationInfo ai = FirstExeAnnotation(CurrentItem); + if (ai != null) + { + XmlDocument xdConfig = new XmlDocument(); + xdConfig.LoadXml(ai.Config); + ProcedureInfo currentProc = CurrentItem.MyProcedure; + XmlNode nd = xdMessage.DocumentElement.SelectSingleNode("//PromsAnnotationConfig"); + nd.AppendChild(xdMessage.ImportNode(xdConfig.DocumentElement, true)); + } + // Add Local Info + AddAttribute(xdMessage.DocumentElement, "ItemID", CurrentItem.ItemID); + AddAttribute(xdMessage.DocumentElement, "ROPath", _ROPath); + AddAttribute(xdMessage.DocumentElement, "FromType", _FromType); + AddAttribute(xdMessage.DocumentElement, "Type", CurrentItem.MyContent.Type); + PipeToClient.Send(xdMessage.OuterXml); + PipeFromClient.Listen(); + } + private void AddAttribute(XmlElement xe, string name, object value) + { + XmlAttribute xa = xe.OwnerDocument.CreateAttribute(name); + xa.Value= value.ToString(); + xe.Attributes.Append(xa); + } + private PipeClient _PipeToClient; + public PipeClient PipeToClient + { + get + { + if (_PipeToClient == null) + _PipeToClient = new PipeClient(_PipeOut); + return _PipeToClient; + } + } + private PipeServer _PipeFromClient; + public PipeServer PipeFromClient + { + get + { + if (_PipeFromClient == null) + { + _PipeFromClient = new PipeServer(_PipeIn); + _PipeFromClient.PipeMessage += PipesMessageHandler; + } + return _PipeFromClient; + } + } + void PipesMessageHandler(string message) + { + try + { + if (this.InvokeRequired) + { + this.Invoke(new NewMessageDelegate(PipesMessageHandler), message); + } + else + { + ProcessMessage(message); + } + } + catch (Exception ex) + { + PipesMessageHandler(string.Format("{0} - {1}", ex.GetType().FullName, ex.Message)); + } + } + + private void ProcessMessage(string message) + { + Console.WriteLine(message); + XmlDocument xd = new XmlDocument(); + xd.LoadXml(message); + string Mode = GetAttribute(xd, "ClientToProms", "Mode"); + switch (Mode) + { + case "SaveAnnotationConfig": + // Get the AnnotationID + int itemID = GetAttributeInt(xd,"ClientToProms","ItemID"); + // Get the Config + string config = GetNode(xd,"PromsAnnotationConfig").InnerXml; + // Save updated Config Value + AnnotationInfo ai = FirstExeAnnotation(ItemInfo.Get(itemID)); + if(ai != null) // Update existing Annotation + using(Annotation aa = Annotation.Get(ai.AnnotationID)) + { + aa.Config=config; + aa.DTS=DateTime.Now; + aa.UserID = Volian.Base.Library.VlnSettings.UserID; + aa.Save(); + AnnotationInfo.Refresh(aa); + } + else // Add a new Annotation + { + using(Item myItem = Item.Get(itemID )) + { + using (AnnotationType myType = AnnotationType.Get(_ExeType)) + { + using (Annotation annotation = Annotation.MakeAnnotation(myItem, myType,null, "New",config)) + { + annotation.Save(); + } + } + } + } + break; + default: + Console.WriteLine("Unknown Message Type {0}", Mode); + break; + } + } + private XmlNode GetNode(XmlDocument xd, string nodeName) + { + return xd.DocumentElement.SelectSingleNode("//" + nodeName); + } + private string GetAttribute(XmlDocument xd, string nodeName, string attrName) + { + return GetNode(xd,nodeName).Attributes[attrName].Value; + } + private int GetAttributeInt(XmlDocument xd, string nodeName, string attrName) + { + return int.Parse(GetAttribute(xd, nodeName, attrName)); + } + #endregion #region VariousSupportMethods /// @@ -243,7 +534,7 @@ namespace Volian.Controls.Library /// public void UpdateAnnotationGrid(ItemInfo currentitem) { - _CurrentItem = currentitem; + CurrentItem = currentitem; UpdateAnnotationGrid(); } @@ -251,16 +542,16 @@ namespace Volian.Controls.Library { _LoadingGrid = true; - if (_CurrentItem == null) + if (CurrentItem == null) _Annotations= null; else { - _CurrentItem.RefreshItemAnnotations(); - _Annotations = _CurrentItem.ItemAnnotations; + CurrentItem.RefreshItemAnnotations(); + _Annotations = CurrentItem.ItemAnnotations; } itemAnnotationsBindingSource.DataSource = _Annotations; dgAnnotations.Refresh(); - if ((CurrentAnnotation == null || (_CurrentItem.ItemID != CurrentAnnotation.ItemID))) + if ((CurrentAnnotation == null || (CurrentItem.ItemID != CurrentAnnotation.ItemID))) { if (_Annotations != null && _Annotations.Count > 0) CurrentAnnotation = _Annotations[0]; @@ -314,7 +605,7 @@ namespace Volian.Controls.Library if (_AddingAnnotation) { _AddingAnnotation = false; - using (Item myItem = _CurrentItem.Get()) + using (Item myItem = CurrentItem.Get()) { using (Annotation annotation = Annotation.MakeAnnotation(myItem, annotationType, rtxbComment.Rtf, rtxbComment.Text, "")) { @@ -342,10 +633,5 @@ namespace Volian.Controls.Library } #endregion - //private void AnnotationDetails_Resize(object sender, EventArgs e) - //{ - // vlnStackTrace.ShowStackLocal(string.Format("Resize - Height = {0}", Height), 3, 4); - // //vlnStackTrace.ShowStack(string.Format("Resize - Height = {0}", Height)); - //} } }