727 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			727 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
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 Volian.Base.Library;
 | 
						|
using Volian.Pipe.Library;
 | 
						|
using System.Xml;
 | 
						|
using System.Diagnostics;
 | 
						|
using JR.Utils.GUI.Forms;
 | 
						|
 | 
						|
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 
 | 
						|
					{
 | 
						|
						// B2019-054 needed to add a check for value being NULL else we would always get a list of PROMS database to choose from (prematurely)
 | 
						|
						if (!DesignMode && value != null) // B2019-043 need to check if we are just saving changes to the user interface
 | 
						|
						{
 | 
						|
							//if (_ProcItem == value) return; // Jeff (Westinghouse) requested list to be provided every time fixes both C2016-007 and B2016-097
 | 
						|
							_ProcItem = value;
 | 
						|
							if (ExeType > 0) CreateProcList();
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				private void CreateProcList()
 | 
						|
				{
 | 
						|
					_ProcList = null;
 | 
						|
					if (_ProcItem == null) return;
 | 
						|
					_ProcList = new XmlDocument();
 | 
						|
					_ProcList.LoadXml("<ProcSteps/>");
 | 
						|
					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 
 | 
						|
					{
 | 
						|
						if (!DesignMode && value != null) // B2019-043 need to check if we are just saving changes to the user interface
 | 
						|
						{
 | 
						|
							_CurrentItem = value;
 | 
						|
							SetupCurrentItemValues();
 | 
						|
							SetupConfigEdit();
 | 
						|
							// B2017-126 Only turn-on NamedPipe if Command Line parameter /NamedPipe is used.  
 | 
						|
							// This eliminates waiting for the Pipe if the command line parameter is not used.
 | 
						|
							if (ExeType > 0 && Volian.Base.Library.VlnSettings.GetCommandFlag("NamedPipe")) 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;
 | 
						|
 | 
						|
		}
 | 
						|
				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) ; // initialize ExeType
 | 
						|
				}
 | 
						|
				private string _ExePath;
 | 
						|
				private string _PipeOut;
 | 
						|
				private string _PipeIn;
 | 
						|
				// Made _ExeType a lazy load to fix Jeff's (Westinghouse) request that ProcStep data be generated every time - fixes both C2016-007 and B2016-097
 | 
						|
				private int _ExeType = 0;
 | 
						|
				public int ExeType
 | 
						|
				{
 | 
						|
					get 
 | 
						|
					{
 | 
						|
						if (!DesignMode && _ExeType == 0) // B2019-043 need to check if we are just saving changes to the user interface
 | 
						|
						{
 | 
						|
							_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;
 | 
						|
									}
 | 
						|
								}
 | 
						|
							}
 | 
						|
						}
 | 
						|
						return _ExeType; 
 | 
						|
					}
 | 
						|
				}
 | 
						|
        private DisplaySearch _AnnotationSearch;
 | 
						|
 | 
						|
		private AnnotationInfoList _Annotations;
 | 
						|
		public AnnotationInfoList Annotations
 | 
						|
		{
 | 
						|
			get { return _Annotations; }
 | 
						|
			set 
 | 
						|
			{
 | 
						|
				if (!DesignMode) // B2019-043 need to check if we are just saving changes to the user interface
 | 
						|
				{
 | 
						|
					_Annotations = value;
 | 
						|
					itemAnnotationsBindingSource.DataSource = _Annotations;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private AnnotationInfo _CurrentAnnotation = null;
 | 
						|
		public AnnotationInfo CurrentAnnotation
 | 
						|
		{
 | 
						|
			get { return _CurrentAnnotation; }
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if (DesignMode) return; // B2019-043 need to check if we are just saving changes to the user interface
 | 
						|
				if (_CurrentAnnotation == null && value == null) return; // No Change
 | 
						|
				if (_CurrentAnnotation != null && value != null)
 | 
						|
					if (_CurrentAnnotation.AnnotationID == value.AnnotationID) return; // No Change
 | 
						|
				//vlnStackTrace.ShowStack("CurrentAnnotation = '{0}' Old = '{1}'", value, _CurrentAnnotation);
 | 
						|
				if (_CurrentAnnotation != null || _AddingAnnotation)
 | 
						|
				{
 | 
						|
					if (AnnotationDirty)
 | 
						|
						SaveAnnotation();
 | 
						|
				}
 | 
						|
				_CurrentAnnotation = value;
 | 
						|
				InitializeAnnotation();
 | 
						|
            }
 | 
						|
		}
 | 
						|
 | 
						|
		private bool _AnnotationDirty = false;
 | 
						|
		public bool AnnotationDirty
 | 
						|
		{
 | 
						|
			get { return _AnnotationDirty; }
 | 
						|
			set
 | 
						|
			{
 | 
						|
				btnRemoveAnnotation.Enabled = btnAddAnnotation.Enabled = !value;
 | 
						|
				btnSaveAnnotation.Enabled = btnCancelAnnoation.Enabled = value;
 | 
						|
				_AddingAnnotation = value && (CurrentAnnotation == null);
 | 
						|
				_AnnotationDirty = value;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public string AnnotationText
 | 
						|
		{
 | 
						|
			get { return rtxbComment.Text; }
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if (!DesignMode) // B2019-043 need to check if we are just saving changes to the user interface
 | 
						|
				{
 | 
						|
					rtxbComment.Text = value;
 | 
						|
					if (rtxbComment.Text != string.Empty)
 | 
						|
						rtxbComment.SelectionStart = rtxbComment.TextLength; // position cursor to end of text
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public string AnnotationRTFText
 | 
						|
		{
 | 
						|
			get { return rtxbComment.Rtf; }
 | 
						|
			set
 | 
						|
			{
 | 
						|
				if (!DesignMode) // B2019-043 need to check if we are just saving changes to the user interface
 | 
						|
				{
 | 
						|
					rtxbComment.Rtf = value;
 | 
						|
					if (rtxbComment.Rtf != string.Empty)
 | 
						|
						rtxbComment.SelectionStart = rtxbComment.TextLength; // position cursor to end of text
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		private UserInfo _MyUserInfo;
 | 
						|
		public UserInfo MyUserInfo
 | 
						|
		{
 | 
						|
			get { return _MyUserInfo; }
 | 
						|
			set { _MyUserInfo = value; }
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Constructors
 | 
						|
		public AnnotationDetails()
 | 
						|
		{
 | 
						|
			InitializeComponent();
 | 
						|
//#if(DEBUG)
 | 
						|
			//Resize+=new EventHandler(AnnotationDetails_Resize); // Debug the resize event
 | 
						|
//#endif
 | 
						|
			Resize += AnnotationDetails_Resize;
 | 
						|
		}
 | 
						|
 | 
						|
		void AnnotationDetails_Resize(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			if(Height > 0)
 | 
						|
				rtxbComment.Height = Height - rtxbComment.Top;
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Events
 | 
						|
		private bool _AddingAnnotation = false;
 | 
						|
		private void btnAddAnnotation_Click(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
            dgAnnotations.ClearSelection();
 | 
						|
			CurrentAnnotation = null;
 | 
						|
			_AddingAnnotation = true;
 | 
						|
            rtxbComment.Focus();
 | 
						|
		}
 | 
						|
 | 
						|
		private void btnRemoveAnnotation_Click(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			// CSM B2024-068 / B2024-069 - check if current annotation is not selected before removal of annotation
 | 
						|
			if (CurrentAnnotation != null)
 | 
						|
			{
 | 
						|
				//using (Annotation annotation = CurrentAnnotation.Get())
 | 
						|
				//{
 | 
						|
				//				annotation.Delete();
 | 
						|
				_AnnotationSearch.LoadingList = true;
 | 
						|
				Annotation.DeleteAnnotation(CurrentAnnotation);
 | 
						|
				//				annotation.Save();
 | 
						|
				_AnnotationSearch.LoadingList = false;
 | 
						|
				CurrentAnnotation = null;
 | 
						|
				UpdateAnnotationGrid();
 | 
						|
				_AnnotationSearch.UpdateAnnotationSearchResults(); // B2019-004: update search results list when an annotation is removed.
 | 
						|
																   //}
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				FlexibleMessageBox.Show("You Must Select an Annotation To Remove", "Annotation Not Selected", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		private void btnSaveAnnotation_Click(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			if (cbGridAnnoType.SelectedIndex == -1)
 | 
						|
			{
 | 
						|
				FlexibleMessageBox.Show("You Must Select an Annotation Type", "Annotation Type Not Selected", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
 | 
						|
				cbGridAnnoType.Focus();
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			if (rtxbComment.Text == string.Empty)
 | 
						|
			{
 | 
						|
				FlexibleMessageBox.Show("You Must Enter Annotation Text", "Annotation Text Is Blank", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
 | 
						|
				rtxbComment.Focus();
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			SaveAnnotation();
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		private void btnCancelAnnoation_Click(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			InitializeAnnotation();
 | 
						|
		}
 | 
						|
 | 
						|
		private void cbGridAnnoType_SelectedValueChanged(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			if (!_LoadingAnnotation)
 | 
						|
				AnnotationDirty = true;
 | 
						|
		}
 | 
						|
 | 
						|
		//C2025-023 - Electronic Procedures - Modifications to PROMS
 | 
						|
		// Only show Open button if it is an EPAnnotationType
 | 
						|
		private void dgAnnotations_CellClick(object sender, DataGridViewCellEventArgs e)
 | 
						|
        {
 | 
						|
			btnEPAnnotation.Visible = false;
 | 
						|
 | 
						|
			if (!_LoadingGrid) // Only set the Current Annotation when not loading the grid
 | 
						|
            {
 | 
						|
				if ((_Annotations != null) && (dgAnnotations.Rows.Count > 0))
 | 
						|
				{
 | 
						|
					CurrentAnnotation = _Annotations[dgAnnotations.CurrentRow.Index];
 | 
						|
					if (CurrentAnnotation.MyAnnotationType.IsEPAnnotationType && CurrentItem.HasEPformat(CurrentAnnotation.MyAnnotationType.TypeID))
 | 
						|
						btnEPAnnotation.Visible = true;
 | 
						|
				}
 | 
						|
				else
 | 
						|
					CurrentAnnotation = null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
		private void rtxbComment_TextChanged(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			if (!_LoadingAnnotation)
 | 
						|
				AnnotationDirty = true;
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region LoadControlData
 | 
						|
 | 
						|
		public void SetupAnnotations(DisplaySearch annosrch)
 | 
						|
		{
 | 
						|
			_LoadingAnnotation = true;
 | 
						|
			_AnnotationSearch = annosrch; // reference the Annotation Search to update its lists
 | 
						|
 | 
						|
			cbGridAnnoType.DisplayMember = "Name";
 | 
						|
			cbGridAnnoType.ValueMember = "TypeId";
 | 
						|
 | 
						|
			//C2025 - 027 Annotation Type Filtering
 | 
						|
			cbGridAnnoType.WatermarkText = "Select Annotation Type";
 | 
						|
			cbGridAnnoType.DataSource = VEPROMS.CSLA.Library.AnnotationstypeSelections.Get(MyUserInfo.UserID);
 | 
						|
 | 
						|
			// If there are no annotatons, then selected index is -1 (not defined), otherwise select the first.
 | 
						|
			// This was done so that it could be saved if there was text entered but user moves to another steprtb without selecting save button
 | 
						|
			// so that annotation gets saved.
 | 
						|
			if (cbGridAnnoType.Items.Count == 0)
 | 
						|
				cbGridAnnoType.SelectedIndex = -1;
 | 
						|
			else
 | 
						|
				cbGridAnnoType.SelectedIndex = 0;
 | 
						|
			_LoadingAnnotation = false;
 | 
						|
		}
 | 
						|
 | 
						|
		private void InitializeAnnotation()
 | 
						|
		{
 | 
						|
			//vlnCSLAStackTrace.ShowStack("InitializeAnnotation - CurrentAnnotation = {0}", CurrentAnnotation);
 | 
						|
			_LoadingAnnotation = true;
 | 
						|
			if (CurrentAnnotation == null)
 | 
						|
			{
 | 
						|
				if (cbGridAnnoType.Items.Count == 0)		// see comment for SetupAnnotations
 | 
						|
					cbGridAnnoType.SelectedIndex = -1;
 | 
						|
				else
 | 
						|
					cbGridAnnoType.SelectedIndex = 0;
 | 
						|
				AnnotationText = "";
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				cbGridAnnoType.SelectedValue = CurrentAnnotation.TypeID;
 | 
						|
				if (CurrentAnnotation.RtfText != "")
 | 
						|
					AnnotationRTFText = CurrentAnnotation.RtfText;
 | 
						|
				else
 | 
						|
					AnnotationText = CurrentAnnotation.SearchText;
 | 
						|
			}
 | 
						|
			_LoadingAnnotation = false;
 | 
						|
			AnnotationDirty = false;
 | 
						|
			if (!rtxbComment.Visible) 
 | 
						|
				rtxbComment.Visible = true;	
 | 
						|
			if (!_LoadingGrid)
 | 
						|
				rtxbComment.Focus(); // Set the focus to the comment text
 | 
						|
 | 
						|
			// Bug Fix:  B2016-274 if admin user also has reviewer set, allow admin user to modify existing annotations
 | 
						|
			if (CurrentAnnotation != null && (!(MyUserInfo.IsAdministrator() || MyUserInfo.IsSetAdministrator(CurrentAnnotation.MyItem.MyDocVersion)) && (MyUserInfo.IsReviewer(CurrentAnnotation.MyItem.MyDocVersion ) && CurrentAnnotation.UserID != MyUserInfo.UserID)))
 | 
						|
			{
 | 
						|
				btnRemoveAnnotation.Enabled = false;
 | 
						|
				cbGridAnnoType.Enabled = false;
 | 
						|
				rtxbComment.Enabled = false;
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				btnRemoveAnnotation.Enabled = true;
 | 
						|
				cbGridAnnoType.Enabled = true;
 | 
						|
				rtxbComment.Enabled = true;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		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()
 | 
						|
		{
 | 
						|
			if (_ExePath != null) // B2019-043 if we are just saving changes to the user interface don't do anything
 | 
						|
			{
 | 
						|
				_ClientProcess = Process.Start(_ExePath);
 | 
						|
				_ClientProcess.WaitForInputIdle();
 | 
						|
				_ClientProcess.Exited += ClientProcess_Exited;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		private void SendPromsAnnotationData()
 | 
						|
		{
 | 
						|
			//Console.WriteLine("Send {0}", CurrentItem);
 | 
						|
			XmlDocument xdMessage = new XmlDocument();
 | 
						|
			xdMessage.LoadXml("<PromsToClient Mode='AnnotationSetup'><PromsAnnotationConfig/></PromsToClient>");
 | 
						|
			// 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 && ai.Config.Length > 0)
 | 
						|
			{
 | 
						|
				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))
 | 
						|
					{
 | 
						|
						if (config == "")
 | 
						|
						{
 | 
						|
							Annotation.DeleteAnnotation(ai);
 | 
						|
							UpdateAnnotationGrid();
 | 
						|
						}
 | 
						|
						else
 | 
						|
						{
 | 
						|
							aa.Config = config;
 | 
						|
							aa.DTS = DateTime.Now;
 | 
						|
							aa.UserID = Volian.Base.Library.VlnSettings.UserID;
 | 
						|
							aa.Save();
 | 
						|
							AnnotationInfo.Refresh(aa);
 | 
						|
							UpdateAnnotationGrid();
 | 
						|
						}
 | 
						|
					}
 | 
						|
					else // Add a new Annotation
 | 
						|
					{
 | 
						|
						if (config != "")
 | 
						|
						{
 | 
						|
							using (Item myItem = Item.Get(itemID))
 | 
						|
							{
 | 
						|
								using (AnnotationType myType = AnnotationType.Get(ExeType))
 | 
						|
								{
 | 
						|
									using (Annotation annotation = Annotation.MakeAnnotation(myItem, myType, null, "New", config))
 | 
						|
									{
 | 
						|
										annotation.Save();
 | 
						|
										UpdateAnnotationGrid();
 | 
						|
									}
 | 
						|
								}
 | 
						|
							}
 | 
						|
						}
 | 
						|
					}
 | 
						|
					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
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Set up the Annotation Grid for the given item
 | 
						|
		/// This is called from frmVEPROMS
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="currentitem"></param>
 | 
						|
		public void UpdateAnnotationGrid(ItemInfo currentitem)
 | 
						|
		{
 | 
						|
			CurrentItem = currentitem;
 | 
						|
			btnEPAnnotation.Visible = false;
 | 
						|
			UpdateAnnotationGrid();
 | 
						|
		}
 | 
						|
 | 
						|
		private void UpdateAnnotationGrid()
 | 
						|
		{
 | 
						|
			_LoadingGrid = true;
 | 
						|
			
 | 
						|
			if (CurrentItem == null) 
 | 
						|
					_Annotations= null;
 | 
						|
			else
 | 
						|
			{
 | 
						|
				CurrentItem.RefreshItemAnnotations();
 | 
						|
				_Annotations = CurrentItem.ItemAnnotations;
 | 
						|
			}
 | 
						|
			itemAnnotationsBindingSource.DataSource = _Annotations;
 | 
						|
            dgAnnotations.Refresh();
 | 
						|
			if ((CurrentAnnotation == null || (CurrentItem.ItemID != CurrentAnnotation.ItemID)))
 | 
						|
			{
 | 
						|
				if (_Annotations != null && _Annotations.Count > 0)
 | 
						|
					CurrentAnnotation = _Annotations[0];
 | 
						|
				else
 | 
						|
					CurrentAnnotation = null;
 | 
						|
			}
 | 
						|
			FindCurrentAnnotation(); // position to the grid row of the current annotation
 | 
						|
			_LoadingGrid = false;
 | 
						|
			if (_Annotations == null || _Annotations.Count == 0) btnRemoveAnnotation.Enabled = false;
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Find the Current Annotation in the Annotation Grid select the corresponding row
 | 
						|
		/// Note: this is also called from AnnotationSearch.cs when a search results is selected
 | 
						|
		/// </summary>
 | 
						|
		public void FindCurrentAnnotation()
 | 
						|
		{
 | 
						|
			int row = 0;
 | 
						|
            if (CurrentAnnotation != null)
 | 
						|
            {
 | 
						|
                if (_Annotations != null)
 | 
						|
                {
 | 
						|
                    foreach (AnnotationInfo ai in _Annotations)
 | 
						|
                    {
 | 
						|
                        if (ai.AnnotationID == CurrentAnnotation.AnnotationID)
 | 
						|
                        {
 | 
						|
                            row = _Annotations.IndexOf(ai);// +1;
 | 
						|
                            break;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
										try
 | 
						|
										{
 | 
						|
											dgAnnotations.Rows[row].Selected = true;
 | 
						|
											if (!_LoadingGrid && (dgAnnotations.FirstDisplayedScrollingRowIndex != -1))
 | 
						|
												dgAnnotations.FirstDisplayedScrollingRowIndex = row;
 | 
						|
										}
 | 
						|
										catch (Exception ex)
 | 
						|
										{
 | 
						|
											_MyLog.InfoFormat("Trying to open an annotation which has been removed");
 | 
						|
										}
 | 
						|
                }
 | 
						|
            }
 | 
						|
		}
 | 
						|
 | 
						|
		public void SaveAnnotation()
 | 
						|
		{
 | 
						|
			if (cbGridAnnoType.SelectedIndex == -1) return;
 | 
						|
			if (rtxbComment.Text == string.Empty) return;
 | 
						|
			using (AnnotationType annotationType = AnnotationType.Get((int)cbGridAnnoType.SelectedValue))
 | 
						|
			{
 | 
						|
				if (_AddingAnnotation)
 | 
						|
				{
 | 
						|
					_AddingAnnotation = false;
 | 
						|
					using (Item myItem = CurrentItem.Get())
 | 
						|
					{
 | 
						|
						using (Annotation annotation = Annotation.MakeAnnotation(myItem, annotationType, rtxbComment.Rtf, rtxbComment.Text, ""))
 | 
						|
						{
 | 
						|
							CurrentAnnotation = AnnotationInfo.Get(annotation.AnnotationID);
 | 
						|
							//annotation.DTS = DateTime.Now;
 | 
						|
							//annotation.Save();
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					using (Annotation annotation = CurrentAnnotation.Get())
 | 
						|
					{
 | 
						|
						if (annotation != null) // B2024-061 check for null reference
 | 
						|
						{
 | 
						|
							annotation.RtfText = rtxbComment.Rtf;
 | 
						|
							annotation.SearchText = rtxbComment.Text;
 | 
						|
							annotation.MyAnnotationType = annotationType;
 | 
						|
							annotation.DTS = DateTime.Now;
 | 
						|
							annotation.UserID = Volian.Base.Library.VlnSettings.UserID;
 | 
						|
							annotation.Save();
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			AnnotationDirty = false;
 | 
						|
			UpdateAnnotationGrid();
 | 
						|
			AnnotationTypeInfoList.Reset();		// B2018-135: refresh annotation type list to update when annotations are used.
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		//C2025-023 - Electronic Procedures - Modifications to PROMS
 | 
						|
		// Open new Dynamic Form if open button selected
 | 
						|
		private void btnEPAnnotation_Click(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
			frmEPAnnotationDetails EPfrm = new frmEPAnnotationDetails(CurrentAnnotation);
 | 
						|
			DialogResult dr = EPfrm.ShowDialog(this);
 | 
						|
		}
 | 
						|
    }
 | 
						|
}
 |