3629 lines
		
	
	
		
			126 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			3629 lines
		
	
	
		
			126 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 DevComponents.DotNetBar;
 | ||
| using DevComponents.AdvTree;
 | ||
| using Volian.Base.Library;
 | ||
| using System.Text.RegularExpressions;
 | ||
| using JR.Utils.GUI.Forms;
 | ||
| using System.Linq;
 | ||
| 
 | ||
| namespace Volian.Controls.Library
 | ||
| {
 | ||
| 	public partial class DisplaySearch : UserControl
 | ||
| 	{
 | ||
| 		#region Public Events/Handlers
 | ||
| 
 | ||
| 		public event DisplaySearchEvent PrintRequest;
 | ||
| 		public event DisplaySearchEvent SearchComplete;
 | ||
| 
 | ||
| 		private void OnPrintRequest(DisplaySearchEventArgs args)
 | ||
| 		{
 | ||
| 			if (PrintRequest != null)
 | ||
| 				PrintRequest(this, args);
 | ||
| 		}
 | ||
| 
 | ||
| 		private void OnSearchComplete(DisplaySearchEventArgs args)
 | ||
| 		{
 | ||
| 			if (SearchComplete != null)
 | ||
| 				SearchComplete(this, args);
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region Fields
 | ||
| 		// B2022-026 RO Memeory reduction logic change - defined dummy node text variable to ensure consistancy
 | ||
| 		private const string DummyNodeText = "VLN_DUMMY_NODE";
 | ||
| 
 | ||
| 		// B2023-076: Adding option to select all procedure sets
 | ||
| 		private const string SelectAllProcedureSetsText = "Select All Procedure Sets";
 | ||
| 
 | ||
| 		// B2019-161 When tracking timing time this action
 | ||
| 		private static VolianTimer _TimeActivity = new VolianTimer("DisplaySearch _TmrRefresh_Tick", 399);
 | ||
| 		private Timer _TmrRefresh = null;
 | ||
| 
 | ||
| 		public FormatVersionList myFormatVersionList;
 | ||
| 		private ItemInfo _SearchIncTransII = null;
 | ||
| 		private static UserInfo _MyUserInfo = null;
 | ||
| 		private string _strSrchText = string.Empty;
 | ||
| 		private List<DocVersionInfo> lstCheckedDocVersions = new List<DocVersionInfo>();
 | ||
| 		private List<int> lstCheckedStepTypes = new List<int>();
 | ||
| 		private List<string> lstCheckedStepTypesStr = new List<string>();
 | ||
| 		private AnnotationDetails _AnnotationDetails = null;
 | ||
| 		public ItemInfo _ItemInfo = null;
 | ||
| 		private DisplayTabControl _TabControl;
 | ||
| 		private DocVersionInfo _MyDocVersion;
 | ||
| 		private Color saveXpSetToSearchColor;
 | ||
| 		private Color saveXpStepTypeTitleColor;
 | ||
| 		private Color saveGpSrchAnnoTextColor;
 | ||
| 		private Color saveGpSrchTextColor;
 | ||
| 		private Color saveGpFindROsColor;
 | ||
| 		private Color saveGrpPanSearchResults;
 | ||
| 		private ItemInfoList _SearchResults;
 | ||
| 
 | ||
| 		private string _DisplayMember = "SearchPath_clean";
 | ||
| 		private bool _OpenDocFromSearch;
 | ||
| 		private ROFSTLookup _MyROFSTLookup;
 | ||
| 		private bool _LoadingList = false;
 | ||
| 		private int LastResultsMouseOverIndex = -1;
 | ||
| 		private ProgressBarItem _ProgressBar;
 | ||
| 
 | ||
| 		DevComponents.AdvTree.Node wordSectionTreeNode = null;      // C2020-010: Disable Word Section choice for Transition search
 | ||
| 
 | ||
| 		private static int _lastRoFstId = -1;
 | ||
| 		private Dictionary<DevComponents.AdvTree.Node, bool> dicSelectedFolderNodes = new Dictionary<DevComponents.AdvTree.Node, bool>();
 | ||
| 		private Dictionary<DevComponents.AdvTree.Node, bool> dicExpandedFolderNodes = new Dictionary<DevComponents.AdvTree.Node, bool>();
 | ||
| 		private int _TopFolderID = 1;
 | ||
| 		private bool _ProcessingSelectedValueChanged = false;
 | ||
| 
 | ||
| 		// Search Related Fields
 | ||
| 		private bool _LastSearchWasAnnotations = false; // B2019-119 only refresh annotation search results if an annotation search was done
 | ||
| 
 | ||
| 		// ProcSetSelection Related Fields
 | ||
| 		private int _MyRODbID;
 | ||
| 		private static bool checkingChildren = false;
 | ||
| 
 | ||
| 		// A timer updated the step type tree but if it was loaded from xml the timer update overwrite what
 | ||
| 		//	was loaded in from the xml file.  Added a flag that gets set on load and set to false on new Search
 | ||
| 		private bool _fromLoad = false;
 | ||
| 		private string _ReportTitle;
 | ||
| 		private string _SearchString = null;
 | ||
| 		private string _TypesSelected;
 | ||
| 
 | ||
| 		private bool fromTranCvtBtn = false;
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region Properties
 | ||
| 
 | ||
| 		// C2020-033: SearchIncTransII represents the item that the transitions go to.  It can be either the item the user
 | ||
| 		//	tried to delete or that the user selected to get Incoming Transitions from tree view or ribbon.
 | ||
| 		public ItemInfo SearchIncTransII
 | ||
| 		{
 | ||
| 			get { return _SearchIncTransII; }
 | ||
| 			set
 | ||
| 			{
 | ||
| 				_SearchIncTransII = value;
 | ||
| 
 | ||
| 				if (_SearchIncTransII != null)
 | ||
| 					lblSrchIncTran.Text = _SearchIncTransII.Path;
 | ||
| 				else
 | ||
| 					lblSrchIncTran.Text = string.Empty;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		public static UserInfo MyUserInfo
 | ||
| 		{
 | ||
| 			get { return _MyUserInfo; }
 | ||
| 			set { _MyUserInfo = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		public ItemInfoList SearchResults
 | ||
| 		{
 | ||
| 			get { return _SearchResults; }
 | ||
| 			set
 | ||
| 			{
 | ||
| 				if (DesignMode) return; // B2019-043 need to check if we are just saving changes to the user interface
 | ||
| 
 | ||
| 				_SearchResults = value;
 | ||
| 
 | ||
| 				if (value != null) // Don't select an item from the list when it is updated
 | ||
| 					_SearchResults.ListChanged += new ListChangedEventHandler(_SearchResults_ListChanged);
 | ||
| 
 | ||
| 				DisplayResults();
 | ||
| 
 | ||
| 				// B2022-044: don't set selection to top of list (commented out/changed if). Remove event that does this
 | ||
| 				//	after results are displayed.  Without this, the code in _SearchResults_ListChanged was run upon selections
 | ||
| 				if (value != null)
 | ||
| 					_SearchResults.ListChanged -= new ListChangedEventHandler(_SearchResults_ListChanged);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		public bool OpenDocFromSearch
 | ||
| 		{
 | ||
| 			get { return _OpenDocFromSearch; }
 | ||
| 		}
 | ||
| 
 | ||
| 		public DocVersionInfo Mydocversion
 | ||
| 		{
 | ||
| 			get { return _MyDocVersion; }
 | ||
| 			set
 | ||
| 			{
 | ||
| 				if (DesignMode) return; // B2019-043 need to check if we are just saving changes to the user interface
 | ||
| 
 | ||
| 				_MyDocVersion = value;
 | ||
| 
 | ||
| 				if (_MyDocVersion != null)
 | ||
| 				{
 | ||
| 					if (_MyDocVersion.DocVersionAssociationCount > 0)
 | ||
| 					{
 | ||
| 						// if the count variable is not consistent with the actual list count,
 | ||
| 						// do a refresh. There was a bug, B2012-040, that was not reproducible..
 | ||
| 						// so this is an attempt to fix it.
 | ||
| 						if (_MyDocVersion.DocVersionAssociations.Count == 0)
 | ||
| 						{
 | ||
| 							_MyDocVersion.RefreshDocVersionAssociations();
 | ||
| 							if (_MyDocVersion.DocVersionAssociations.Count == 0) return;
 | ||
| 						}
 | ||
| 						MyROFSTLookup = _MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(_MyDocVersion);
 | ||
| 						_MyRODbID = _MyDocVersion.DocVersionAssociations[0].MyROFst.RODbID;
 | ||
| 					}
 | ||
| 				}
 | ||
| 				else
 | ||
| 				{
 | ||
| 					MyROFSTLookup = null;
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		public ROFSTLookup MyROFSTLookup
 | ||
| 		{
 | ||
| 			get { return _MyROFSTLookup; }
 | ||
| 			set
 | ||
| 			{
 | ||
| 				if (DesignMode) return; // B2019-043 need to check if we are just saving changes to the user interface
 | ||
| 
 | ||
| 				bool beforeIsNotNull = _MyROFSTLookup != null;
 | ||
| 				bool afterIsNotNull = value != null;
 | ||
| 				//if (!Visible) return;		// don't reset anything if the form is invisible.
 | ||
| 				_MyROFSTLookup = value;         // define the tree nodes based on this rofst
 | ||
| 
 | ||
| 				if (beforeIsNotNull || afterIsNotNull)
 | ||
| 				{
 | ||
| 					LoadROComboTree();// B2017-215 Added logic so that database is not accessed during initialization.
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		public bool LoadingList
 | ||
| 		{
 | ||
| 			get { return _LoadingList; }
 | ||
| 			set { _LoadingList = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		public ProgressBarItem ProgressBar
 | ||
| 		{
 | ||
| 			get { return _ProgressBar; }
 | ||
| 			set { _ProgressBar = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		public Timer TmrRefresh
 | ||
| 		{
 | ||
| 			get
 | ||
| 			{
 | ||
| 				if (_TmrRefresh == null)
 | ||
| 				{
 | ||
| 					_TmrRefresh = new Timer();
 | ||
| 					_TmrRefresh.Interval = 1000;
 | ||
| 					_TmrRefresh.Tick += _TmrRefresh_Tick;
 | ||
| 				}
 | ||
| 				return _TmrRefresh;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		public int TopFolderID
 | ||
| 		{
 | ||
| 			get { return _TopFolderID; }
 | ||
| 			set { _TopFolderID = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		public string ReportTitle
 | ||
| 		{
 | ||
| 			get { return _ReportTitle; }
 | ||
| 			set { _ReportTitle = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		public string SearchString
 | ||
| 		{
 | ||
| 			get { return _SearchString; }
 | ||
| 			set { _SearchString = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		public string TypesSelected
 | ||
| 		{
 | ||
| 			get { return _TypesSelected; }
 | ||
| 			set { _TypesSelected = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		#region (Search)
 | ||
| 
 | ||
| 		private string DVISearchList
 | ||
| 		{
 | ||
| 			get
 | ||
| 			{
 | ||
| 				// append list of document versions to search
 | ||
| 				if (lstCheckedDocVersions.Count > 0)
 | ||
| 				{
 | ||
| 					string strRtnStr = string.Empty;
 | ||
| 					// get list of doc versions to search
 | ||
| 					foreach (DocVersionInfo dvi in lstCheckedDocVersions)
 | ||
| 					{
 | ||
| 						strRtnStr += string.Format(",{0}", dvi.VersionID.ToString());
 | ||
| 					}
 | ||
| 					return strRtnStr.Substring(1);
 | ||
| 				}
 | ||
| 				return string.Empty;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private string TypeSearchList
 | ||
| 		{
 | ||
| 			get
 | ||
| 			{
 | ||
| 				// append list of step types to search
 | ||
| 				if (lstCheckedStepTypes.Count > 0)
 | ||
| 				{
 | ||
| 					string strRtnStr = string.Empty;
 | ||
| 					// get list of selected types
 | ||
| 					foreach (int typ in lstCheckedStepTypes)
 | ||
| 					{
 | ||
| 						int tmp = typ;
 | ||
| 						if (tmp == 0)
 | ||
| 							tmp = 10000; // this is the accessory page type
 | ||
| 						else
 | ||
| 							tmp += 20000; // step/substep types
 | ||
| 						strRtnStr += string.Format(",{0}", tmp);
 | ||
| 					}
 | ||
| 					return strRtnStr.Substring(1);
 | ||
| 				}
 | ||
| 
 | ||
| 				return string.Empty;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private string TextSearchString
 | ||
| 		{
 | ||
| 			get
 | ||
| 			{
 | ||
| 				if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[0])
 | ||
| 					return ConvertSpecialChars(cbxTextSearchText.Text);
 | ||
| 
 | ||
| 				return string.Empty;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private string AnnotationSearchType
 | ||
| 		{
 | ||
| 			get
 | ||
| 			{
 | ||
| 				if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[1])
 | ||
| 					return ((AnnotationTypeSearch)cbxAnnoTypes.SelectedValue).ID;
 | ||
| 
 | ||
| 				return string.Empty;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private string ROSearchList
 | ||
| 		{
 | ||
| 			get
 | ||
| 			{
 | ||
| 				if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[2])
 | ||
| 				{    // RO Search
 | ||
| 					ROFSTLookup.rochild[] chld = null;
 | ||
| 					ROFSTLookup.rochild ch;
 | ||
| 					if (cmboTreeROs.SelectedNode != null)
 | ||
| 					{
 | ||
| 						if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked)
 | ||
| 						{
 | ||
| 							ch = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag;
 | ||
| 							_strSrchText = string.Format("{0}", ch.value);
 | ||
| 							return _strSrchText; // append RO Value text to search
 | ||
| 						}
 | ||
| 						else
 | ||
| 						{
 | ||
| 							if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rodbi)
 | ||
| 							{
 | ||
| 								ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)cmboTreeROs.SelectedNode.Tag;
 | ||
| 								return _MyRODbID.ToString() + ":" + string.Format("{0}", db.dbiID.ToString("X4"));
 | ||
| 							}
 | ||
| 							else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild)
 | ||
| 							{
 | ||
| 								ch = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag;
 | ||
| 								chld = ch.children;
 | ||
| 								// build a list of ROs to search
 | ||
| 								// B2022-118: remove the ending comma otherwise query will fail
 | ||
| 								string strRtnStr = _MyRODbID.ToString() + ":" + GetROsToSearch(chld);
 | ||
| 								if (strRtnStr.EndsWith(","))
 | ||
| 									strRtnStr = strRtnStr.Substring(0, strRtnStr.Length - 1);
 | ||
| 								return strRtnStr;
 | ||
| 							}
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 				return string.Empty;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		public bool LastSearchWasAnnotations
 | ||
| 		{
 | ||
| 			get { return _LastSearchWasAnnotations; }
 | ||
| 			set { _LastSearchWasAnnotations = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region Constructor
 | ||
| 
 | ||
| 		public DisplaySearch()
 | ||
| 		{
 | ||
| 			InitializeComponent();
 | ||
| 			LoadSearchTextListBox();
 | ||
| 			saveXpSetToSearchColor = xpSetToSearch.TitleStyle.BackColor1.Color;
 | ||
| 			saveXpStepTypeTitleColor = xpStepTypes.TitleStyle.BackColor1.Color;
 | ||
| 			saveGpSrchAnnoTextColor = gpSrchAnnoText.Style.BackColor;
 | ||
| 			saveGpSrchTextColor = gpSrchText.Style.BackColor;
 | ||
| 			saveGpFindROsColor = gpFindROs.Style.BackColor;
 | ||
| 			gpSrchText.Style.BackColor = Color.Yellow;
 | ||
| 			saveGrpPanSearchResults = grpPanSearchResults.Style.BackColor;
 | ||
| 
 | ||
| 			// start out with the procedure and type selection windows colasped
 | ||
| 			xpSetToSearch.Expanded = false;
 | ||
| 			xpStepTypes.Expanded = false;
 | ||
| 			rbtnSrchTxt.Checked = true;
 | ||
| 			gpSrchAnnoText.Enabled = true;
 | ||
| 			cmbResultsStyle.Enabled = false;
 | ||
| 			tabSearchTypes.SelectedTabChanged += new TabStrip.SelectedTabChangedEventHandler(tabSearchTypes_SelectedTabChanged);
 | ||
| 			// Don't do this here.  If you do then the /DB parameter has not yet been set, which will cause the database menu to be displayed
 | ||
| 			//SetupContextMenu(); // so that the symbol list is available without selecting a procedure set or procedure
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region Public Methods
 | ||
| 
 | ||
| 		public void _SearchResults_ListChanged(object sender, ListChangedEventArgs e)
 | ||
| 		{
 | ||
| 			lbSrchResults.SelectedIndex = -1; // Don't select an item from the new list
 | ||
| 			lbSrchResultsIncTrans.SelectedIndex = -1;
 | ||
| 		}
 | ||
| 
 | ||
| 		public void tabSearchTypes_SelectedTabChanged(object sender, TabStripTabChangedEventArgs e)
 | ||
| 		{
 | ||
| 			if (wordSectionTreeNode != null) //B2020-070 NULL reference check
 | ||
| 				wordSectionTreeNode.Enabled = true;
 | ||
| 			btnSearch.Enabled = true;
 | ||
| 			xpSetToSearch.Enabled = true;
 | ||
| 			xpStepTypes.Enabled = true;
 | ||
| 			lbSrchResults.Visible = true;
 | ||
| 			lbSrchResultsIncTrans.Visible = false;
 | ||
| 			cbxRnoOnly.Visible = true;
 | ||
| 			if (e.NewTab == tabIncTrans)        // C2020-033: Incoming transitions
 | ||
| 			{
 | ||
| 				xpSetToSearch.Enabled = false;
 | ||
| 				xpStepTypes.Enabled = false;
 | ||
| 				lbSrchResults.Visible = false;
 | ||
| 				lbSrchResultsIncTrans.Visible = true;
 | ||
| 				lbSrchResultsIncTrans.CheckBoxesVisible = true;
 | ||
| 				lbSrchResultsIncTrans.AutoScroll = true;
 | ||
| 				btnSearch.Enabled = false; // C2021 - 002: disable search button - no functionality for Incoming Transitions
 | ||
| 				cbxRnoOnly.Visible = false;
 | ||
| 			}
 | ||
| 			else if (e.NewTab == tabROSearch)
 | ||
| 			{
 | ||
| 				LoadROComboTree();
 | ||
| 			}
 | ||
| 			else if (e.NewTab == tabTranSearch)
 | ||
| 			{
 | ||
| 				if (wordSectionTreeNode != null) //B2020-070 NULL reference check
 | ||
| 				{
 | ||
| 					wordSectionTreeNode.Enabled = false;        // C2020-010: Disable Word Section choice for Transition search
 | ||
| 					wordSectionTreeNode.Checked = false;
 | ||
| 				}
 | ||
| 				btnSearch.Enabled = (cbxTranCategory.Items.Count > 0); // B2017-038 disable search button if no format selected
 | ||
| 																	   //enable-disable doc version nodes based on version type if selected
 | ||
| 				if (cbxTranVersion.SelectedIndex > -1)
 | ||
| 				{
 | ||
| 					if (dicExpandedFolderNodes.Count > 0)
 | ||
| 					{
 | ||
| 						foreach (DevComponents.AdvTree.Node n in dicExpandedFolderNodes.Keys)
 | ||
| 						{
 | ||
| 							DocVersionInfo dvi = (DocVersionInfo)n.Tag;
 | ||
| 							if (cbxTranVersion.Tag.ToString().Contains(dvi.VersionID.ToString()))
 | ||
| 								n.Enabled = true;
 | ||
| 							else
 | ||
| 								n.Enabled = false;
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 				//setup transition format versions
 | ||
| 				this.Cursor = Cursors.WaitCursor;
 | ||
| 				if (myFormatVersionList == null)
 | ||
| 				{
 | ||
| 					this.Refresh();
 | ||
| 					myFormatVersionList = FormatVersionList.GetFormatVersions();
 | ||
| 					cbxTranVersion.DisplayMember = "Title";
 | ||
| 					int lastLastFormatID = 0;
 | ||
| 					foreach (FormatVersion fv in myFormatVersionList)
 | ||
| 					{
 | ||
| 						if (fv.FormatID != lastLastFormatID)
 | ||
| 						{
 | ||
| 							cbxTranVersion.Items.Add(fv);
 | ||
| 							lastLastFormatID = fv.FormatID;
 | ||
| 						}
 | ||
| 					}
 | ||
| 					cbxTranVersion.SelectedIndexChanged -= new EventHandler(cbxTranVersion_SelectedIndexChanged);
 | ||
| 					cbxTranVersion.SelectedIndexChanged += new EventHandler(cbxTranVersion_SelectedIndexChanged);
 | ||
| 					cbxTranFormat.SelectedIndexChanged -= new EventHandler(cbxTranFormat_SelectedIndexChanged);
 | ||
| 					cbxTranFormat.SelectedIndexChanged += new EventHandler(cbxTranFormat_SelectedIndexChanged);
 | ||
| 				}
 | ||
| 				this.Cursor = Cursors.Default;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				foreach (DevComponents.AdvTree.Node n in dicExpandedFolderNodes.Keys)
 | ||
| 					n.Enabled = true;
 | ||
| 				if (dicSelectedFolderNodes.Count > 0)
 | ||
| 				{
 | ||
| 					foreach (DevComponents.AdvTree.Node n in dicSelectedFolderNodes.Keys)
 | ||
| 					{
 | ||
| 						n.Enabled = true;
 | ||
| 					}
 | ||
| 					dicSelectedFolderNodes.Clear();
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		public void cbxTranFormat_SelectedIndexChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			#region 1st cut
 | ||
| 			//if (cbxTranFormat.SelectedItem.ToString() == "All")
 | ||
| 			//{
 | ||
| 			//  cbxTranCategory.Items.Clear();
 | ||
| 			//  cbxTranCategory.Items.Add("All");
 | ||
| 			//  cbxTranCategory.Items.Add("Internal");
 | ||
| 			//  cbxTranCategory.Items.Add("External");
 | ||
| 			//  cbxTranCategory.Items.Add("Outside");
 | ||
| 			//  cbxTranCategory.SelectedIndex = 0;
 | ||
| 			//}
 | ||
| 			//else if (cbxTranFormat.SelectedItem.ToString().Contains("{Proc"))
 | ||
| 			//{
 | ||
| 			//  cbxTranCategory.Items.Clear();
 | ||
| 			//  cbxTranCategory.Items.Add("All");
 | ||
| 			//  cbxTranCategory.Items.Add("External");
 | ||
| 			//  cbxTranCategory.Items.Add("Outside");
 | ||
| 			//  cbxTranCategory.SelectedIndex = 0;
 | ||
| 			//}
 | ||
| 			//else
 | ||
| 			//{
 | ||
| 			//  cbxTranCategory.Items.Clear();
 | ||
| 			//  cbxTranCategory.Items.Add("Internal");
 | ||
| 			//  cbxTranCategory.SelectedIndex = 0;
 | ||
| 			//}
 | ||
| 			#endregion
 | ||
| 
 | ||
| 			#region 2nd cut
 | ||
| 			if (cbxTranFormat.SelectedItem.ToString().Contains("{Proc"))
 | ||
| 			{
 | ||
| 				cbxTranCategory.Items.Clear();
 | ||
| 				cbxTranCategory.Items.Add("All");
 | ||
| 				cbxTranCategory.Items.Add("External");
 | ||
| 				cbxTranCategory.Items.Add("Outside");
 | ||
| 				cbxTranCategory.SelectedIndex = 0;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				cbxTranCategory.Items.Clear();
 | ||
| 				cbxTranCategory.Items.Add("All");
 | ||
| 				cbxTranCategory.Items.Add("Internal");
 | ||
| 				cbxTranCategory.Items.Add("External");
 | ||
| 				cbxTranCategory.Items.Add("Outside");
 | ||
| 				cbxTranCategory.SelectedIndex = 0;
 | ||
| 			}
 | ||
| 			#endregion
 | ||
| 
 | ||
| 			btnSearch.Enabled = true; // B2017-038 enable search button if when a format selected
 | ||
| 		}
 | ||
| 
 | ||
| 		public void cbxTranVersion_SelectedIndexChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			this.Cursor = Cursors.WaitCursor;
 | ||
| 			string versionList = string.Empty;
 | ||
| 			string sep = string.Empty;
 | ||
| 			FormatVersion sfv = cbxTranVersion.SelectedItem as FormatVersion;
 | ||
| 			foreach (FormatVersion fv in myFormatVersionList)
 | ||
| 			{
 | ||
| 				if (fv.FormatID == sfv.FormatID)
 | ||
| 				{
 | ||
| 					versionList += sep + fv.VersionID;
 | ||
| 					sep = ",";
 | ||
| 				}
 | ||
| 			}
 | ||
| 			cbxTranVersion.Tag = versionList;
 | ||
| 			cbxTranFormatFillIn(versionList);
 | ||
| 			if (dicExpandedFolderNodes.Count > 0)
 | ||
| 			{
 | ||
| 				foreach (DevComponents.AdvTree.Node n in dicExpandedFolderNodes.Keys)
 | ||
| 				{
 | ||
| 					FolderInfo fi = (FolderInfo)n.Tag;
 | ||
| 					// if this folder has a docversion, use its id:
 | ||
| 					string svid = null;
 | ||
| 					if (fi.FolderDocVersionCount > 0)
 | ||
| 						svid = fi.FolderDocVersions[0].VersionID.ToString();
 | ||
| 					if (cbxTranVersion.Tag.ToString().Contains(svid))
 | ||
| 						n.Enabled = true;
 | ||
| 					else
 | ||
| 						n.Enabled = false;
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			List<DevComponents.AdvTree.Node> uncheckNodes = new List<Node>();
 | ||
| 			foreach (DevComponents.AdvTree.Node n in dicSelectedFolderNodes.Keys)
 | ||
| 			{
 | ||
| 				FolderInfo fi = (FolderInfo)n.Tag;          // this was crashing in old version of code
 | ||
| 															// if this folder has a docversion, use its id:
 | ||
| 				string svid = null;
 | ||
| 				if (fi.FolderDocVersionCount > 0)
 | ||
| 					svid = fi.FolderDocVersions[0].VersionID.ToString();
 | ||
| 				if (svid != null && !versionList.Contains(svid))
 | ||
| 					uncheckNodes.Add(n);
 | ||
| 				else
 | ||
| 					n.Enabled = true;
 | ||
| 			}
 | ||
| 			while (uncheckNodes.Count > 0)
 | ||
| 			{
 | ||
| 				uncheckNodes[0].Checked = false;
 | ||
| 				uncheckNodes[0].Enabled = false;
 | ||
| 				uncheckNodes.Remove(uncheckNodes[0]);
 | ||
| 			}
 | ||
| 			if (lstCheckedDocVersions.Count > 0)
 | ||
| 			{
 | ||
| 				if (FlexibleMessageBox.Show(this, "Do you want to expand to all relevant procedure sets for the selected format?", "Expand Procedure Sets", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
 | ||
| 				{
 | ||
| 					lstCheckedDocVersions.Clear();
 | ||
| 					foreach (DevComponents.AdvTree.Node n in dicSelectedFolderNodes.Keys)
 | ||
| 						uncheckNodes.Add(n);
 | ||
| 					while (uncheckNodes.Count > 0)
 | ||
| 					{
 | ||
| 						uncheckNodes[0].Checked = false;
 | ||
| 						uncheckNodes.Remove(uncheckNodes[0]);
 | ||
| 					}
 | ||
| 					dicSelectedFolderNodes.Clear();
 | ||
| 				}
 | ||
| 			}
 | ||
| 			this.Cursor = Cursors.Default;
 | ||
| 		}
 | ||
| 
 | ||
| 		// C2020-033: Update the search panel for Incoming transitions.  This gets called from the tree view & the ribbon
 | ||
| 		public void UpdateSearchIncTransResults()
 | ||
| 		{
 | ||
| 			//IncTransSelectedCount = 0;
 | ||
| 			tabSearchTypes.SelectedTab = tabSearchTypes.Tabs[4];
 | ||
| 
 | ||
| 			lbSrchResultsIncTrans.DataSource = null;
 | ||
| 			lbSrchResultsIncTrans.Items.Clear();
 | ||
| 			// Get item to do search for, either from tree or from editor
 | ||
| 			if (SearchIncTransII != null)
 | ||
| 			{
 | ||
| 				// B2021-010: Use IncomingTranGetMergedTranList to get a complete list of incoming transitions (transitions to procedure
 | ||
| 				//	were only included if there were NO transitions to items within procedure)
 | ||
| 				SearchResults = IncomingTranGetMergedTranList();
 | ||
| 				ReportTitle = string.Format("Search For Incoming Transitions to {0}: ", SearchIncTransII.Path);
 | ||
| 			}
 | ||
| 			if (SearchResults != null && SearchResults.Count > 0)
 | ||
| 			{
 | ||
| 				AddMessageForEmptyAnnotations();
 | ||
| 				cmbResultsStyle.SelectedIndex = 1;  //display step locations in results
 | ||
| 				DisplayResults();
 | ||
| 				//If any transitions are listed after the Convert, Admin Tools/Links/Refresh Transitions can be used to fix incorrect links.  This will eliminate any in the list.
 | ||
| 				// B2023-103 if any items are left in search list, there may be bad transition link data - put out a message box
 | ||
| 				if (fromTranCvtBtn)
 | ||
| 					FlexibleMessageBox.Show(this, "If items remain in the list after performing Convert All to Text, running Admin Tools/Links/Refresh Transitions will clear the list.", 
 | ||
| 						"Convert Transitions to Text", MessageBoxButtons.OK);
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				btnPrnSrchRslts.Enabled = false;
 | ||
| 				btnClearSearchResults.Enabled = false;
 | ||
| 				btnCopySearchResults.Enabled = false;
 | ||
| 				btnSaveSearchResults.Enabled = false;
 | ||
| 				cmbResultsStyle.Enabled = false;
 | ||
| 				if (!fromTranCvtBtn) FlexibleMessageBox.Show("No Matches Found.", "Search");  // B2021-009: Research after convert transitions to text
 | ||
| 			}
 | ||
| 			btnTranCvtAllToTxt.Enabled = IncTransCvtAllToTextPerm();
 | ||
| 			btnTranCvtSelToTxt.Enabled = false;
 | ||
| 			btnSearch.Enabled = false;  // C2021 - 002: disable search button - no functionality for Incoming Transitions
 | ||
| 		}
 | ||
| 
 | ||
| 		public bool IncTranCvtPerm()
 | ||
| 		{
 | ||
| 			FolderInfo topFolder = FolderInfo.Get(1);
 | ||
| 			FolderConfig fc = topFolder.MyConfig as FolderConfig;
 | ||
| 			return fc.General_IncTranCvtPerm;
 | ||
| 		}
 | ||
| 
 | ||
| 		#region (ROFST Combo Tree)
 | ||
| 
 | ||
| 		public void StartAdvTreeStepTypesFillIn()// B2016-258 Hang after selecting a procedure if the Step Type panel is open on the search panel
 | ||
| 		{
 | ||
| 			TmrRefresh.Enabled = true;
 | ||
| 		}
 | ||
| 
 | ||
| 		public void AdvTreeStepTypesFillIn()
 | ||
| 		{
 | ||
| 			DevComponents.AdvTree.Node topnode = new DevComponents.AdvTree.Node();
 | ||
| 			advTreeStepTypes.Nodes.Clear();
 | ||
| 			lstCheckedStepTypes.Clear();
 | ||
| 			lstCheckedStepTypesStr.Clear();
 | ||
| 			topnode.Text = "Types";
 | ||
| 			advTreeStepTypes.Nodes.Add(topnode);
 | ||
| 			FormatData fmtdata = null;
 | ||
| 			// B2017-181: selecting/deselecting, and no nodes are selected was causing null reference when trying
 | ||
| 			//	to access the DocVersion (none are selected), use the format off of the top folder:
 | ||
| 			if (_MyDocVersion == null)
 | ||
| 			{
 | ||
| 				FolderInfo fi = FolderInfo.Get(TopFolderID);
 | ||
| 				fmtdata = fi.ActiveFormat.PlantFormat.FormatData;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				fmtdata = _MyDocVersion.ActiveFormat.PlantFormat.FormatData;
 | ||
| 			}
 | ||
| 			List<StepDataRetval> lstSrchStpTypes = fmtdata.GetSearchableSteps(); // list of searchable step types
 | ||
| 			if (lstSrchStpTypes != null && lstSrchStpTypes.Count > 0)
 | ||
| 			{
 | ||
| 				DevComponents.AdvTree.Node newnode;
 | ||
| 				advTreeStepTypes.Nodes.Clear();
 | ||
| 				// Add a dummy node for searching Word Sections (MS Word sections)
 | ||
| 				//newnode = new DevComponents.AdvTree.Node();
 | ||
| 				//newnode.Text = "Word Sections";
 | ||
| 				//newnode.Selectable = true;
 | ||
| 				//newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter;
 | ||
| 				//newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox;
 | ||
| 				//newnode.CheckBoxThreeState = false;
 | ||
| 				//newnode.CheckBoxVisible = true;
 | ||
| 				newnode = NewAdvTreeNode("WORD Sections", true, true);      // C2020-010: Change Accessory Sections to Word Sections
 | ||
| 				wordSectionTreeNode = newnode;
 | ||
| 				// C2021-028: RNO Only search, disable Word section tree node
 | ||
| 				wordSectionTreeNode.Enabled = !(tabSearchTypes.SelectedTab == tabTranSearch || cbxRnoOnly.Checked);
 | ||
| 				advTreeStepTypes.Nodes.Add(newnode);
 | ||
| 
 | ||
| 				// C2023-010: Allow selecting all section types or none
 | ||
| 				newnode = NewAdvTreeNode("All Types", true, true);
 | ||
| 				newnode.NodeClick += new EventHandler(AllSectionTypes_clicked);
 | ||
| 				advTreeStepTypes.Nodes.Add(newnode);
 | ||
| 
 | ||
| 				foreach (StepDataRetval sdr in lstSrchStpTypes)
 | ||
| 				{
 | ||
| 					StepDataList sdl = fmtdata.StepDataList; ;
 | ||
| 					StepData sd = sdl[sdr.Index]; // get the step type record
 | ||
| 					string parentName = sd.ParentType; // this gets the parent of the this step/substep type
 | ||
| 
 | ||
| 					//Console.WriteLine("{0} {1} - {2}", parentName,sd.Type,sdr.Name);
 | ||
| 					//newnode = new DevComponents.AdvTree.Node();
 | ||
| 					//newnode.Text = sdr.Name;
 | ||
| 					//newnode.Name = sd.Type; // this needed for the FindNodeByName() function
 | ||
| 					//newnode.Tag = sd;
 | ||
| 					//newnode.Selectable = true;
 | ||
| 					//newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter;
 | ||
| 					//newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox;
 | ||
| 					//newnode.CheckBoxThreeState = false;
 | ||
| 					//newnode.CheckBoxVisible = true;
 | ||
| 					if (parentName.Equals("Base"))
 | ||
| 					{
 | ||
| 						newnode = NewAdvTreeNode(sdr.Name, true, true);
 | ||
| 						newnode.Tag = sd;
 | ||
| 						newnode.Name = sd.Type;
 | ||
| 						DevComponents.AdvTree.Node pnode = NewAdvTreeNode(sd.Type, true, true); //create parent node (non selectable)
 | ||
| 						pnode.Name = sd.Type;
 | ||
| 						if (!sd.Type.Equals("Title")) // only use Title as a tree grouping to put Title with Text Right/Below substep types
 | ||
| 							pnode.Nodes.Add(newnode);
 | ||
| 						pnode.Nodes.Sort();
 | ||
| 						advTreeStepTypes.Nodes.Add(pnode);
 | ||
| 
 | ||
| 						//C2030-010:
 | ||
| 						pnode.NodeClick += new EventHandler(pnode_selected);
 | ||
| 					}
 | ||
| 					else if (sd.Type.Equals("RNOType")) // B2019-016 Allow for search of RNO step types (when selecting types to search)
 | ||
| 					{
 | ||
| 						newnode = NewAdvTreeNode(sdr.Name, true, true);
 | ||
| 						newnode.Tag = sd;
 | ||
| 						newnode.Name = sd.Type;
 | ||
| 						advTreeStepTypes.Nodes.Add(newnode);
 | ||
| 					}
 | ||
| 					else if (sd.Type.Equals("RNOType")) // B2019-016 Allow for search of RNO step types (when selecting types to search)
 | ||
| 					{
 | ||
| 						newnode = NewAdvTreeNode(sdr.Name, true, true);
 | ||
| 						newnode.Tag = sd;
 | ||
| 						newnode.Name = sd.Type;
 | ||
| 						advTreeStepTypes.Nodes.Add(newnode);
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						// B2016-236: for global search <20> change <20>AER<45> to <20>Left<66> in list of step types for figures
 | ||
| 						string nameInTree = sdr.Name;
 | ||
| 						if (sdr.Name.Contains("AER") && sdr.Name.ToUpper().Contains("FIGURE")) nameInTree = nameInTree.Replace("AER", "Left");
 | ||
| 						newnode = NewAdvTreeNode(nameInTree, true, true);
 | ||
| 						newnode.Name = sd.Type; // this needed for the FindNodeByName() function
 | ||
| 						newnode.Tag = sd;
 | ||
| 
 | ||
| 						// if the parent node exists in the tree, then add the new node to that parent
 | ||
| 						// else, it is a parent node, so add it as a new parent
 | ||
| 
 | ||
| 						DevComponents.AdvTree.Node parnode = advTreeStepTypes.FindNodeByName(parentName);
 | ||
| 						// Group by High Level Steps, Substeps, Cautions, Notes, Figures, Tables and Equations
 | ||
| 						while (!parentName.Equals("Base") && !parentName.Equals("Substep") && !parentName.Equals("High") &&
 | ||
| 							!parentName.Equals("Caution") && !parentName.Equals("Note") && !parentName.Equals("Table") &&
 | ||
| 							!parentName.Equals("Figure") && !parentName.Equals("Title") &&
 | ||
| 							!parentName.Equals("And") && !parentName.Equals("Or") && !parentName.Equals("Paragraph") && !parentName.Equals("Equation"))
 | ||
| 						{
 | ||
| 							StepData tmpsd = (StepData)parnode.Tag;
 | ||
| 							parentName = tmpsd.ParentType;
 | ||
| 							parnode = advTreeStepTypes.FindNodeByName(parentName);
 | ||
| 						}
 | ||
| 						if (parnode != null)
 | ||
| 						{
 | ||
| 							parnode.Nodes.Add(newnode);
 | ||
| 							parnode.Nodes.Sort(); // sort the second level of the tree
 | ||
| 						}
 | ||
| 						else
 | ||
| 							advTreeStepTypes.Nodes.Add(newnode);
 | ||
| 					}
 | ||
| 				}
 | ||
| 				advTreeStepTypes.Nodes.Sort(); // sort the first level of the tree
 | ||
| 			}
 | ||
| 			buildStepTypePannelTitle();
 | ||
| 		}
 | ||
| 
 | ||
| 		private void AllProcedureSets_clicked(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			Node pNode = sender as Node;
 | ||
| 			foreach (Node node in advTreeProcSets.Nodes)
 | ||
| 			{
 | ||
| 				node.Checked = pNode.Checked;
 | ||
| 				CheckTreeNodeChildren(node.Nodes);
 | ||
| 			}
 | ||
| 			// B2023-112: Clear the docversion list - this flags 'All' when the 'All Proc Sets' tree node is checked and 'None' when it isn't.  Then
 | ||
| 			//	Use buildSetToSearchPanelTitle to set the text for how many sets are in search.
 | ||
| 			lstCheckedDocVersions.Clear();
 | ||
| 			buildSetToSearchPanelTitle();
 | ||
| 		}
 | ||
| 
 | ||
| 		private void AllSectionTypes_clicked(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			Node pNode = sender as Node;
 | ||
| 			foreach (Node node in advTreeStepTypes.Nodes)
 | ||
| 			{
 | ||
| 				node.Checked = pNode.Checked;
 | ||
| 				CheckTreeNodeChildren(node.Nodes);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		//C2023-010: Select all child nodes when a subtype is selected
 | ||
| 		private void pnode_selected(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			DevComponents.AdvTree.Node pnode = sender as DevComponents.AdvTree.Node;
 | ||
| 			if (pnode != null && pnode.HasChildNodes)
 | ||
| 			{
 | ||
| 				CheckTreeNodeChildren(pnode.Nodes);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		public void advTreeProcSetsFillIn(bool blSeachTabClicked)
 | ||
| 		{
 | ||
| 			DevComponents.AdvTree.Node topnode = null;
 | ||
| 			int cntnd = 0;
 | ||
| 			VETreeNode vtn = VETreeNode.GetFolder(TopFolderID);
 | ||
| 			FolderInfo fi = vtn.VEObject as FolderInfo;
 | ||
| 			int fiCount = fi.ChildFolderCount;
 | ||
| 			advTreeProcSets.Nodes.Clear();
 | ||
| 			lstCheckedDocVersions.Clear();
 | ||
| 			topnode = new DevComponents.AdvTree.Node();
 | ||
| 			topnode.Text = "Available Procedure Sets";
 | ||
| 			topnode.Tag = fi;
 | ||
| 			topnode.DataKey = fi.FolderID;
 | ||
| 			advTreeProcSets.Nodes.Add(topnode);
 | ||
| 			//advTreeProcSets.AfterNodeInsert += new TreeNodeCollectionEventHandler(advTreeProcSets_AfterNodeInsert);
 | ||
| 
 | ||
| 			//B2023-076: Adding option to select all procedure sets
 | ||
| 			DevComponents.AdvTree.Node selectAllNode = new Node();
 | ||
| 			selectAllNode.Text = SelectAllProcedureSetsText;
 | ||
| 			selectAllNode.Tag = SelectAllProcedureSetsText;
 | ||
| 			selectAllNode.CheckBoxVisible = true;
 | ||
| 			selectAllNode.NodeClick += new EventHandler(AllProcedureSets_clicked);
 | ||
| 			topnode.Nodes.Add(selectAllNode);
 | ||
| 
 | ||
| 			if (fi.SortedChildFolders != null)
 | ||
| 			{
 | ||
| 				foreach (FolderInfo fic in fi.SortedChildFolders)
 | ||
| 				{
 | ||
| 					DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node();
 | ||
| 					newnode.Text = fic.ToString();
 | ||
| 					newnode.Tag = fic;
 | ||
| 					newnode.DataKey = fi.FolderID;
 | ||
| 					AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected.
 | ||
| 					cntnd++;
 | ||
| 					if (fic.ChildFolderCount > 0 || fic.FolderDocVersionCount > 0)      // allow for '+' for tree expansion
 | ||
| 					{
 | ||
| 						if (fic.ChildFolderCount > 0)           // B2017-176: Do not display the Working Draft node (don't create dummy for expander)
 | ||
| 						{
 | ||
| 							DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node();
 | ||
| 							tnt.Text = DummyNodeText;
 | ||
| 							newnode.Nodes.Add(tnt);
 | ||
| 						}
 | ||
| 						topnode.Nodes.Add(newnode);
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node();
 | ||
| 				newnode.Text = fi.ToString();
 | ||
| 				newnode.Tag = fi;
 | ||
| 				newnode.DataKey = fi.FolderID;
 | ||
| 				AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected.
 | ||
| 				topnode.Nodes.Add(newnode);
 | ||
| 				lstCheckedDocVersions.Add(Mydocversion);
 | ||
| 				buildSetToSearchPanelTitle();
 | ||
| 			}
 | ||
| 			// if nothing was added to the tree, just put in the node above the docversions...
 | ||
| 			if (advTreeProcSets.Nodes.Count == 0)
 | ||
| 			{
 | ||
| 				cntnd++;
 | ||
| 				fi = Mydocversion.MyFolder;
 | ||
| 				topnode = new DevComponents.AdvTree.Node();
 | ||
| 				topnode.Text = fi.ToString();
 | ||
| 				advTreeProcSets.Nodes.Add(topnode);
 | ||
| 				topnode.Tag = fi;
 | ||
| 				topnode.DataKey = fi.FolderID;
 | ||
| 			}
 | ||
| 
 | ||
| 			advTreeProcSets.BeforeExpand -= new DevComponents.AdvTree.AdvTreeNodeCancelEventHandler(advTreeProcSets_BeforeExpand);
 | ||
| 			advTreeProcSets.BeforeExpand += new DevComponents.AdvTree.AdvTreeNodeCancelEventHandler(advTreeProcSets_BeforeExpand);
 | ||
| 
 | ||
| 			// position to the procedure set in the tree if we have a procedure open
 | ||
| 			if (Mydocversion != null)
 | ||
| 				advTreeProcSetsPreSelect();
 | ||
| 			else
 | ||
| 				advTreeProcSets.Nodes[0].SelectedCell = advTreeProcSets.Nodes[0].Cells[0]; // select the first node - fixes cosmetic problem
 | ||
| 
 | ||
| 			if (blSeachTabClicked)
 | ||
| 				cbxTextSearchText.Focus(); // set initial focus to enter search text
 | ||
| 		}
 | ||
| 
 | ||
| 		public void advTreeProcSets_BeforeExpand(object sender, DevComponents.AdvTree.AdvTreeNodeCancelEventArgs e)
 | ||
| 		{
 | ||
| 			DevComponents.AdvTree.Node par = e.Node;
 | ||
| 			// get first child's text, if it has one & if the text is "VLN_DUMMY_NODE", load children
 | ||
| 			DevComponents.AdvTree.Node tn = null;
 | ||
| 			if (par.Nodes.Count > 0) tn = par.Nodes[0];
 | ||
| 			if (tn.Text == DummyNodeText)       // expand this
 | ||
| 			{
 | ||
| 				par.Nodes.Clear();
 | ||
| 				Object obj = par.Tag;
 | ||
| 				if (!(obj is FolderInfo)) return;   // should always be folderinfo on expand
 | ||
| 				FolderInfo fi = (FolderInfo)obj;
 | ||
| 				if (fi.ChildFolderCount > 0)
 | ||
| 				{
 | ||
| 					foreach (FolderInfo fic in fi.SortedChildFolders)
 | ||
| 					{
 | ||
| 						DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node();
 | ||
| 						newnode.Text = fic.ToString();
 | ||
| 						newnode.Tag = fic;
 | ||
| 						newnode.DataKey = fic.FolderID;
 | ||
| 						par.Nodes.Add(newnode);
 | ||
| 						AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected.
 | ||
| 						newnode.Enabled = true;
 | ||
| 						if (fic.ChildFolderCount > 0)       // B2017-176: Only expand if folder has folders (not working draft nodes)
 | ||
| 						{
 | ||
| 							DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node();
 | ||
| 							tnt.Text = DummyNodeText;
 | ||
| 							newnode.Nodes.Add(tnt);
 | ||
| 							// B2017-176: Only expand if folder has folders (not working draft nodes): the following was moved from the code
 | ||
| 							//  that would check if this should be enabled if seraching for transition types.  The transition controls
 | ||
| 							//  had a list of associated docversions, so needed to get the docversion in the folder:
 | ||
| 							if (tabSearchTypes.SelectedTab == tabTranSearch)
 | ||
| 							{
 | ||
| 								if (!dicSelectedFolderNodes.ContainsKey(newnode)) dicSelectedFolderNodes.Add(newnode, false);
 | ||
| 								// get the docversion for this folder, if it has one and determine whether it is enabled for transitions:
 | ||
| 								string svid = null;
 | ||
| 								if (fic.FolderDocVersionCount > 0)
 | ||
| 									svid = fic.FolderDocVersions[0].VersionID.ToString();
 | ||
| 								newnode.Enabled = svid != null && cbxTranVersion.Tag != null ? cbxTranVersion.Tag.ToString().Contains(svid) : false;
 | ||
| 							}
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		public void AdvTree_AfterExpandorCollapse(object sender, AdvTreeNodeEventArgs e)
 | ||
| 		{
 | ||
| 			Node bottomNode = BottomTreeNode(cmboTreeROs.AdvTree.Nodes);
 | ||
| 			Node lastNode = cmboTreeROs.AdvTree.Nodes[cmboTreeROs.AdvTree.Nodes.Count - 1];
 | ||
| 
 | ||
| 			int top = cmboTreeROs.AdvTree.Nodes[0].Bounds.Top;
 | ||
| 			int bottom = bottomNode.Bounds.Bottom + 5;
 | ||
| 			int hScrollBarHeight = cmboTreeROs.AdvTree.HScrollBar != null ? cmboTreeROs.AdvTree.HScrollBar.Height : 0;
 | ||
| 			bottom = bottomNode.Bounds.Bottom + 5;
 | ||
| 			cmboTreeROs.AdvTree.Size = new Size(cmboTreeROs.AdvTree.Size.Width, Math.Min(525, bottom - top + hScrollBarHeight));
 | ||
| 
 | ||
| 			if (cmboTreeROs.AdvTree.VScrollBar != null && bottom < cmboTreeROs.AdvTree.Size.Height)
 | ||
| 			{
 | ||
| 				int yLookFor = (bottom - cmboTreeROs.AdvTree.Size.Height) + 2 * hScrollBarHeight;
 | ||
| 				Node topNode = FindTreeNodeAt(cmboTreeROs.AdvTree.Nodes, yLookFor);
 | ||
| 				if (topNode != null)
 | ||
| 				{
 | ||
| 					topNode.EnsureVisible();
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (Annotation Search)
 | ||
| 
 | ||
| 		public void SetupAnnotationSearch(AnnotationDetails annotationDetails, DisplayTabControl tc)
 | ||
| 		{
 | ||
| 			_AnnotationDetails = annotationDetails;
 | ||
| 			List<AnnotationTypeSearch> annoTypes = new List<AnnotationTypeSearch>();
 | ||
| 			annoTypes.Add(new AnnotationTypeSearch("All Annotations", string.Empty));
 | ||
| 			AnnotationTypeInfoList annoList = AnnotationTypeInfoList.Get();
 | ||
| 			foreach (AnnotationTypeInfo ati in annoList)
 | ||
| 				annoTypes.Add(new AnnotationTypeSearch(ati.Name, ati.TypeID.ToString()));
 | ||
| 			cbxAnnoTypes.DisplayMember = "Name";
 | ||
| 			cbxAnnoTypes.DataSource = annoTypes;
 | ||
| 			lbSrchResults.MouseMove -= new MouseEventHandler(lbSrchResults_MouseMove);
 | ||
| 			lbSrchResults.MouseMove += new MouseEventHandler(lbSrchResults_MouseMove);
 | ||
| 			_TabControl = tc;
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (Search Results)
 | ||
| 
 | ||
| 		public void UpdateAnnotationSearchResults()
 | ||
| 		{
 | ||
| 			if (!LastSearchWasAnnotations) return; // B2019-119 only refresh annotation search results if an annotation search was done
 | ||
| 												   // B2019-004: update search results list when an annotation is removed. (before bug fix, code method & code below was commented out)
 | ||
| 			string unitPrefix = string.Empty;
 | ||
| 
 | ||
| 			if (Mydocversion != null)
 | ||
| 				unitPrefix = Mydocversion.DocVersionConfig.Unit_ProcedureNumber;
 | ||
| 
 | ||
| 			if (unitPrefix.EndsWith("#"))
 | ||
| 				unitPrefix = unitPrefix.Replace("#", string.Empty);
 | ||
| 
 | ||
| 			// C2023-005: Lose list position after delete. Save selected index to restore after & don't open the
 | ||
| 			//		section after reset of index (UpdateAnnotationList setting below)
 | ||
| 			int curindx = lbSrchResults.SelectedIndex;
 | ||
| 
 | ||
| 			SearchResults = ItemInfoList.GetListFromAnnotationSearch(DVISearchList, TypeSearchList, AnnotationSearchType, cbxTextSearchAnnotation.Text, cbxCaseSensitiveAnnoText.Checked, unitPrefix);
 | ||
| 
 | ||
| 			DisplayResults();
 | ||
| 			UpdatedAnnotationList = true;
 | ||
| 			// C2023-007: C2023-005 reset position after delete but positioned to item before deleted item, modified the
 | ||
| 			//	list reset to position after deleted item
 | ||
| 			lbSrchResults.SelectedIndex = curindx < 0 ? -1 : curindx == lbSrchResults.Items.Count ? curindx - 1 : curindx;
 | ||
| 			UpdatedAnnotationList = false;
 | ||
| 		}
 | ||
| 		private bool UpdatedAnnotationList = false;
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (ContextMenu)
 | ||
| 
 | ||
| 		// Changed to a public so that it could be called after the /DB parameter has been processed
 | ||
| 		public void SetupContextMenu()
 | ||
| 		{
 | ||
| 			galSymbols.SubItems.Clear();
 | ||
| 			// Bug fix B2014-057
 | ||
| 			// if we are searching for a symbol character in all procedure sets MyDocVersion is null
 | ||
| 			// when MyDocVersion is null, get the symbol list directly from the PROMS base format (BaseAll.xml)
 | ||
| 			// this will populate the context menu of the Search text entry field so that a symbol can be selected without first selecting a procedure set
 | ||
| 			FormatData fmtdata = (_MyDocVersion != null) ? _MyDocVersion.ActiveFormat.PlantFormat.FormatData : FormatInfo.PROMSBaseFormat.FormatData;
 | ||
| 
 | ||
| 			if (fmtdata != null && fmtdata.SymbolList != null)
 | ||
| 			{
 | ||
| 				SymbolList sl = fmtdata.SymbolList;
 | ||
| 
 | ||
| 				if (sl == null || sl.Count <= 0)
 | ||
| 				{
 | ||
| 					FlexibleMessageBox.Show("No symbols are available, check with administrator");
 | ||
| 					return;
 | ||
| 				}
 | ||
| 
 | ||
| 				foreach (Symbol sym in sl)
 | ||
| 				{
 | ||
| 					DevComponents.DotNetBar.ButtonItem btnCM = new DevComponents.DotNetBar.ButtonItem();
 | ||
| 
 | ||
| 					btnCM.Text = string.Format("{0}", (char)sym.Unicode);
 | ||
| 					// to name button use unicode rather than desc, desc may have spaces or odd chars
 | ||
| 					btnCM.Name = "btnCM" + sym.Unicode.ToString();
 | ||
| 					btnCM.Tooltip = sym.Desc;
 | ||
| 					btnCM.Tag = string.Format(@"{0}", sym.Unicode);
 | ||
| 					btnCM.FontBold = true;
 | ||
| 					btnCM.Click += new System.EventHandler(btnSym_Click);
 | ||
| 					galSymbols.SubItems.Add(btnCM);
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (Refresh Timer)
 | ||
| 
 | ||
| 		public void _TmrRefresh_Tick(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			// B2016-258 Hang after selecting a procedure if the Step Type panel is open on the search panel
 | ||
| 			_TimeActivity.Open();
 | ||
| 
 | ||
| 			TmrRefresh.Enabled = false;
 | ||
| 			if (!_fromLoad) AdvTreeStepTypesFillIn();       // Don't reload if coming from Load - this overwrites the load settings
 | ||
| 
 | ||
| 			_TimeActivity.Close();
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region Private Methods
 | ||
| 
 | ||
| 		private void LoadSearchTextListBox()
 | ||
| 		{
 | ||
| 			// Setup SearchText Combo
 | ||
| 			cbxTextSearchText.Items.Clear();
 | ||
| 			if (Properties.Settings.Default["SearchList"] != null && Properties.Settings.Default.SearchList.Count > 0)
 | ||
| 			{
 | ||
| 				foreach (string str in Properties.Settings.Default.SearchList)
 | ||
| 					cbxTextSearchText.Items.Add(str);
 | ||
| 			}
 | ||
| 			// Setup SearchAnnotation Combo
 | ||
| 			cbxTextSearchAnnotation.Items.Clear();
 | ||
| 			if (Properties.Settings.Default["SearchAList"] != null && Properties.Settings.Default.SearchAList.Count > 0)
 | ||
| 			{
 | ||
| 				foreach (string str in Properties.Settings.Default.SearchAList)
 | ||
| 					cbxTextSearchAnnotation.Items.Add(str);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private DevComponents.AdvTree.Node NewAdvTreeNode(string nodetext, bool selectable, bool chxbxvisable)
 | ||
| 		{
 | ||
| 			DevComponents.AdvTree.Node newnode;
 | ||
| 			newnode = new DevComponents.AdvTree.Node();
 | ||
| 			newnode.Text = nodetext;
 | ||
| 			newnode.Selectable = selectable;
 | ||
| 			AddCheckBox(chxbxvisable, newnode);//C2016-045 Allow Folders to be selected.
 | ||
| 			return newnode;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void AddCheckBox(bool chxbxvisable, DevComponents.AdvTree.Node newnode)
 | ||
| 		{
 | ||
| 			//C2016-045 Allow Folders to be selected.
 | ||
| 			newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter;
 | ||
| 			newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox;
 | ||
| 			newnode.CheckBoxThreeState = false;
 | ||
| 			newnode.CheckBoxVisible = chxbxvisable;
 | ||
| 
 | ||
| 			// Set newnode.Checked = parent.Checked
 | ||
| 			if (newnode.Parent != null)
 | ||
| 				newnode.Checked = newnode.Parent.Checked;
 | ||
| 		}
 | ||
| 
 | ||
| 		private Node LookInTree(NodeCollection monkeys, string bananna)
 | ||
| 		{
 | ||
| 			Node foundit = null;
 | ||
| 			foreach (Node chimp in monkeys)
 | ||
| 			{
 | ||
| 				if (chimp.Text.Equals(bananna))
 | ||
| 				{
 | ||
| 					foundit = chimp;
 | ||
| 					// need to select the node (cell) for it to be checked
 | ||
| 					chimp.SelectedCell = chimp.Cells[0];
 | ||
| 					if (chimp.Nodes.Count > 0)
 | ||
| 						chimp.Expand();
 | ||
| 					break;
 | ||
| 				}
 | ||
| 				chimp.Collapse();
 | ||
| 			}
 | ||
| 			return foundit;
 | ||
| 		}
 | ||
| 
 | ||
| 		// C2020-033: Before allowing conversion of Incoming Transitions to text, get list of results that the user has permission edit.
 | ||
| 		private List<int> TranCvtCheckPermission(bool all)
 | ||
| 		{
 | ||
| 			// B2023-102 Don't crash on converting incoming transitions to text if there are none (can happen if 2nd pass occurs)
 | ||
| 			if (_SearchResults == null) return null;
 | ||
| 
 | ||
| 			// check if a non-reader can convert transitions to text even if a reader - this is set by an administrator on the top
 | ||
| 			// folder properties dialog
 | ||
| 			bool allowNonAdmin = IncTranCvtPerm();
 | ||
| 			List<int> itmsEditable = new List<int>();   // return this list
 | ||
| 			int listCount = 0;
 | ||
| 			if (all)  // Check all in list
 | ||
| 			{
 | ||
| 				listCount = _SearchResults.Count;
 | ||
| 				foreach (ItemInfo ii in _SearchResults)
 | ||
| 				{
 | ||
| 					if (allowNonAdmin || UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion)) itmsEditable.Add(ii.ContentID);
 | ||
| 				}
 | ||
| 			}
 | ||
| 			else  // check only the items selected
 | ||
| 			{
 | ||
| 				listCount = lbSrchResultsIncTrans.CheckedItems.Count;
 | ||
| 				List<ListBoxItem> lbis = lbSrchResultsIncTrans.CheckedItems;
 | ||
| 				foreach (ListBoxItem lbi in lbis)
 | ||
| 				{
 | ||
| 					ItemBindingData tmpii = lbi.Tag as ItemBindingData;
 | ||
| 					ItemInfo ii = tmpii.DataItem as ItemInfo;
 | ||
| 					if (allowNonAdmin || UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion)) itmsEditable.Add(ii.ContentID);
 | ||
| 				}
 | ||
| 			}
 | ||
| 			// Prompt user if convert to text should continue.  If some items cannot be edited, also state that
 | ||
| 			// not all can be converted to text. If count of itmsEditable & lbis are different some cannot be edited.
 | ||
| 			if (itmsEditable.Count == 0)
 | ||
| 			{
 | ||
| 				FlexibleMessageBox.Show("You do not have permission to edit any of the procedures, sections, and/or steps" + (all ? "." : " that are selected."),
 | ||
| 						"Convert Transition to Text", MessageBoxButtons.OK, MessageBoxIcon.Information);
 | ||
| 				return null;
 | ||
| 			}
 | ||
| 			else if (itmsEditable.Count != listCount)
 | ||
| 			{
 | ||
| 				DialogResult ans = FlexibleMessageBox.Show("You only have permission to edit some of the procedures, sections, and/or steps that are selected.procedures, sections, and/or steps" + (all ? "." : " that are selected.") +
 | ||
| 					"\r\n\r\n Should the conversion of the transitions to text continue?",
 | ||
| 							"Convert Transition to Text", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
 | ||
| 				if (ans == DialogResult.No) return null;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				// B2023-103 add spinner (WaitCursor) and also, change FlexibleMessageBox to regular MessageBox since restore of cursor to
 | ||
| 				//		wait cursor did not work after FlexibleMessageBox
 | ||
| 				Cursor savcursor = Cursor;
 | ||
| 				DialogResult ans = MessageBox.Show(this, "Are you sure you want to convert the transitions to text?", "Convert Transitions to Text", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
 | ||
| 				this.Cursor = savcursor;
 | ||
| 				if (ans == DialogResult.No) return null;
 | ||
| 			}
 | ||
| 
 | ||
| 			return itmsEditable;
 | ||
| 		}
 | ||
| 
 | ||
| 		// C2020-033: convert selected transitions to text
 | ||
| 		private void btnTranCvtSelToTxt_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			// First see if all selected can be converted, i.e. user has permission to edit 
 | ||
| 			List<ListBoxItem> lbis = lbSrchResultsIncTrans.CheckedItems;
 | ||
| 			List<int> itmsEditable = TranCvtCheckPermission(false);
 | ||
| 			if (itmsEditable == null || itmsEditable.Count == 0) return;
 | ||
| 			TranCvtToTxt(itmsEditable);
 | ||
| 			fromTranCvtBtn = true;
 | ||
| 			UpdateSearchIncTransResults();  // B2021-009: Research after convert transitions to text
 | ||
| 			fromTranCvtBtn = false;
 | ||
| 		}
 | ||
| 
 | ||
| 		// B2021-010: IncomingTranGetMergedTranList gets a complete list of incoming transitions (before fix transitions to procedure
 | ||
| 		//	were only included if there were NO transitions to items within procedure, the GetExternalTransitionsToChildren query
 | ||
| 		//	did not get transitions 'incoming to' the item itself)
 | ||
| 		private ItemInfoList IncomingTranGetMergedTranList()
 | ||
| 		{
 | ||
| 			ItemInfoList iil = null;
 | ||
| 			bool first = true;
 | ||
| 
 | ||
| 			using (TransitionInfoList exTrans = TransitionInfoList.GetExternalTransitionsToChildren(SearchIncTransII.ItemID))
 | ||
| 			{
 | ||
| 				foreach (TransitionInfo ti in exTrans)
 | ||
| 				{
 | ||
| 					if (first)
 | ||
| 					{
 | ||
| 						ContentInfo ci = ContentInfo.Get(ti.FromID);
 | ||
| 						ItemInfo tmp = ci.ContentItems[0];
 | ||
| 						iil = new ItemInfoList(tmp);
 | ||
| 						first = false;
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						ContentInfo ci = ContentInfo.Get(ti.FromID);
 | ||
| 						ItemInfo tmp = ci.ContentItems[0];
 | ||
| 						iil.AddItem(tmp);
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			using (TransitionInfoList exTrans = TransitionInfoList.GetExternalTransitions(SearchIncTransII.ItemID))
 | ||
| 			{
 | ||
| 				foreach (TransitionInfo ti in exTrans)
 | ||
| 				{
 | ||
| 					if (first)
 | ||
| 					{
 | ||
| 						ContentInfo ci = ContentInfo.Get(ti.FromID);
 | ||
| 						ItemInfo tmp = ci.ContentItems[0];
 | ||
| 						iil = new ItemInfoList(tmp);
 | ||
| 						first = false;
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						ContentInfo ci = ContentInfo.Get(ti.FromID);
 | ||
| 						ItemInfo tmp = ci.ContentItems[0];
 | ||
| 
 | ||
| 						// B2021-014:  if in list, don't add another
 | ||
| 						if (!iil.Contains(tmp)) iil.AddItem(tmp);
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			return iil;
 | ||
| 		}
 | ||
| 
 | ||
| 		// C2020-033: For items in list, do the actual conversion of the Incoming Transition to text
 | ||
| 		private void TranCvtToTxt(List<int> itmsEditable)
 | ||
| 		{
 | ||
| 			// B2023-103 Add wait cursor (and remove at end)
 | ||
| 			this.Cursor = Cursors.WaitCursor;
 | ||
| 			ItemInfo trII = SearchIncTransII;
 | ||
| 
 | ||
| 			if (trII != null)
 | ||
| 			{
 | ||
| 				using (TransitionInfoList exTrans = TransitionInfoList.GetExternalTransitionsToChildren(trII.ItemID))
 | ||
| 				{
 | ||
| 					foreach (TransitionInfo ti in exTrans)
 | ||
| 					{
 | ||
| 						// See if the 'item to' id is to be converted and if so do it.  To figure this out, 
 | ||
| 						//  see if it is in the list itmsEditable.
 | ||
| 						if (itmsEditable.Contains(ti.FromID))
 | ||
| 						{
 | ||
| 							ContentInfo ci = ContentInfo.Get(ti.FromID);
 | ||
| 							ItemInfo tmp = ci.ContentItems[0];
 | ||
| 
 | ||
| 							using (Content content = Content.Get(tmp.ContentID))
 | ||
| 							{
 | ||
| 								content.FixTransitionText(ti, true);
 | ||
| 								content.Save();
 | ||
| 							}
 | ||
| 						}
 | ||
| 					}
 | ||
| 
 | ||
| 				}
 | ||
| 
 | ||
| 				// B2021-010: Convert the text of transitions pointing (incoming) to the item itself
 | ||
| 				using (TransitionInfoList exTrans = TransitionInfoList.GetExternalTransitions(trII.ItemID))
 | ||
| 				{
 | ||
| 					foreach (TransitionInfo ti in exTrans)
 | ||
| 					{
 | ||
| 						// See if the 'item to' id is to be converted and if so do it.  To figure this out, 
 | ||
| 						//  see if it is in the list itmsEditable.
 | ||
| 						if (itmsEditable.Contains(ti.FromID))
 | ||
| 						{
 | ||
| 							ContentInfo ci = ContentInfo.Get(ti.FromID);
 | ||
| 							ItemInfo tmp = ci.ContentItems[0];
 | ||
| 
 | ||
| 							using (Content content = Content.Get(tmp.ContentID))
 | ||
| 							{
 | ||
| 								content.FixTransitionText(ti, true);
 | ||
| 								content.Save();
 | ||
| 							}
 | ||
| 						}
 | ||
| 					}
 | ||
| 
 | ||
| 				}
 | ||
| 			}
 | ||
| 			this.Cursor = Cursors.Default;
 | ||
| 		}
 | ||
| 
 | ||
| 		#region (ProgressBar)
 | ||
| 
 | ||
| 		private void ProgressBar_Initialize(int max, string desc)
 | ||
| 		{
 | ||
| 			if (_ProgressBar != null)
 | ||
| 			{
 | ||
| 				_ProgressBar.Maximum = max;
 | ||
| 				_ProgressBar.Text = desc;
 | ||
| 				_ProgressBar.TextVisible = true;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void ProgressBar_SetValue(int curval)
 | ||
| 		{
 | ||
| 			if (_ProgressBar != null)
 | ||
| 				_ProgressBar.Value = curval;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void ProgressBar_Clear()
 | ||
| 		{
 | ||
| 			if (_ProgressBar != null)
 | ||
| 			{
 | ||
| 				_ProgressBar.Text = string.Empty;
 | ||
| 				_ProgressBar.Maximum = 0;
 | ||
| 				_ProgressBar.Value = 0;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (ROFST Combo Tree)
 | ||
| 
 | ||
| 		private void LoadROComboTree()
 | ||
| 		{
 | ||
| 			lblSrchRoMsg.Visible = false;           // C2019-041: start out with no message about rofsts and folder(s) compatibility
 | ||
| 													// if only one docversion selected, this RoFst can be used.  If more than one or none (none is all docversions), then check if they 
 | ||
| 													// use the same RO fst.  If not, put a message as the first tree node and return, otherwise, load the tree.
 | ||
| 			List<DocVersionInfo> dvilTmp = new List<DocVersionInfo>();
 | ||
| 
 | ||
| 			if (lstCheckedDocVersions == null || lstCheckedDocVersions.Count == 0)
 | ||
| 			{
 | ||
| 				DocVersionInfoList dvil = DocVersionInfoList.Get();
 | ||
| 				foreach (DocVersionInfo dvi in dvil) dvilTmp.Add(dvi);
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				dvilTmp = lstCheckedDocVersions;
 | ||
| 			}
 | ||
| 
 | ||
| 			bool same = true;
 | ||
| 			// get the first rofstId for comparing to the rest:
 | ||
| 			int rofstId = (dvilTmp.Count > 0) ? (dvilTmp[0].DocVersionAssociations != null && dvilTmp[0].DocVersionAssociations.Count > 0) ? dvilTmp[0].DocVersionAssociations[0].ROFstID : -1 : -1;
 | ||
| 
 | ||
| 			// for remaining folder/docversions in the list, check if they have an associated rofst & if so, if it is the same as the first in list.
 | ||
| 			for (int i = 1; i < dvilTmp.Count; i++)
 | ||
| 			{
 | ||
| 				if (dvilTmp[i].DocVersionAssociations != null && dvilTmp[i].DocVersionAssociations.Count > 0)
 | ||
| 				{
 | ||
| 					if (rofstId != dvilTmp[i].DocVersionAssociations[0].ROFstID)
 | ||
| 					{
 | ||
| 						same = false;
 | ||
| 						break;
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			// rofsts for selected folder/docversions are not the same, cannot do an ro search:
 | ||
| 			if (!same)
 | ||
| 			{
 | ||
| 				DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node();
 | ||
| 				// C2019-041: if selected folders do not have the same ro.fst then clear the ro list and let user know.
 | ||
| 				cmboTreeROs.Nodes.Clear();
 | ||
| 
 | ||
| 				if (lstCheckedDocVersions == null || lstCheckedDocVersions.Count == 0)
 | ||
| 					lblSrchRoMsg.Text = "RO values are incompatible between the folders. This may be due to the RO values needing to be updated.";
 | ||
| 				else
 | ||
| 					lblSrchRoMsg.Text = "This folder(s) RO values are incompatible with the currently selected folder(s).  This may be due to the RO values needing to be updated.";
 | ||
| 
 | ||
| 				lblSrchRoMsg.Visible = true;
 | ||
| 				_lastRoFstId = -1;
 | ||
| 				return;
 | ||
| 			}
 | ||
| 
 | ||
| 			// C2019-041: if requested rofst is same as last one, just return;
 | ||
| 			if (_lastRoFstId == rofstId) return;
 | ||
| 
 | ||
| 			lblSrchRoMsg.Refresh();
 | ||
| 			cmboTreeROs.Nodes.Clear();
 | ||
| 			this.cmboTreeROs.AdvTree.BeforeExpand += new DevComponents.AdvTree.AdvTreeNodeCancelEventHandler(this.cmboTreeROs_BeforeExpand);
 | ||
| 			cmboTreeROs.AdvTree.AfterExpand += new AdvTreeNodeEventHandler(AdvTree_AfterExpandorCollapse);
 | ||
| 			cmboTreeROs.AdvTree.AfterCollapse += new AdvTreeNodeEventHandler(AdvTree_AfterExpandorCollapse);
 | ||
| 
 | ||
| 			// populate the tree - only 1 folder/docversion is selected or all selected use the same rofst:
 | ||
| 			// B2022-071 use the dvilTmp instead of lstCheckedDocVersions because if none are check then it's count will be zero
 | ||
| 			if (dvilTmp != null && dvilTmp.Count > 0)
 | ||
| 			{
 | ||
| 				// C2019-041:  Save this rofstid in case a new one is processed.
 | ||
| 				// B2022-071: We were setting _lastRoFstId before checking if we were going to load the RO tree,
 | ||
| 				//            So now set set it only if we actually load the RO tree
 | ||
| 				//            Also, set _MydocVersion to dvilTmp[0]
 | ||
| 				_lastRoFstId = rofstId;
 | ||
| 				// B2022-143:  Only reset _MyDocVersion if it is null, it a procedure is in editor, _MyDocVersion is the set for
 | ||
| 				//	the procedure active in the editor:
 | ||
| 				if (_MyDocVersion == null) _MyDocVersion = dvilTmp[0];
 | ||
| 
 | ||
| 				if (_MyDocVersion.DocVersionAssociations != null && _MyDocVersion.DocVersionAssociations.Count > 0)
 | ||
| 				{
 | ||
| 					_MyROFSTLookup = _MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(_MyDocVersion);
 | ||
| 
 | ||
| 					ROFSTLookup.rodbi[] dbs = _MyROFSTLookup.GetRODatabaseList(true);
 | ||
| 
 | ||
| 					if (dbs != null && dbs.Length > 0)
 | ||
| 					{
 | ||
| 						for (int i = 0; i < dbs.Length; i++)
 | ||
| 						{
 | ||
| 							ROFSTLookup.rodbi db = dbs[i];
 | ||
| 
 | ||
| 							DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node(db.dbiTitle);
 | ||
| 							tn.Tag = db;
 | ||
| 							cmboTreeROs.Nodes.Add(tn);
 | ||
| 
 | ||
| 							AddDummyGroup(db, tn);
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private Node FindTreeNodeAt(NodeCollection nodes, int y)
 | ||
| 		{
 | ||
| 			foreach (Node node in nodes)
 | ||
| 			{
 | ||
| 				if (node.Bounds.Top <= y && node.Bounds.Bottom >= y)
 | ||
| 					return node;
 | ||
| 				if (node.Bounds.Top > y)
 | ||
| 				{
 | ||
| 					if (node.PrevNode != null && node.PrevNode.Expanded)
 | ||
| 						return FindTreeNodeAt(node.PrevNode.Nodes, y);
 | ||
| 					return node;
 | ||
| 				}
 | ||
| 			}
 | ||
| 			return null;
 | ||
| 		}
 | ||
| 
 | ||
| 		private Node BottomTreeNode(NodeCollection nodes)
 | ||
| 		{
 | ||
| 			Node bottomNode = nodes[nodes.Count - 1]; // Return bottom node in collection
 | ||
| 			if (bottomNode.Expanded) // If expanded return bottom child
 | ||
| 				return BottomTreeNode(bottomNode.Nodes);
 | ||
| 			return bottomNode;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void AddDummyGroup(ROFSTLookup.rodbi rodbi, DevComponents.AdvTree.Node tn)
 | ||
| 		{
 | ||
| 			if (MyROFSTLookup.HasChildren(ref rodbi))
 | ||
| 			{
 | ||
| 				DevComponents.AdvTree.Node tmp = new DevComponents.AdvTree.Node(DummyNodeText);
 | ||
| 				tn.Nodes.Add(tmp);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cmboTreeROs_BeforeExpand(object sender, DevComponents.AdvTree.AdvTreeNodeCancelEventArgs e)
 | ||
| 		{
 | ||
| 			LoadChildren(e.Node);
 | ||
| 		}
 | ||
| 
 | ||
| 		private void LoadChildren(DevComponents.AdvTree.Node tn)
 | ||
| 		{
 | ||
| 			if (tn.HasChildNodes && tn.Nodes[0].Text != DummyNodeText) return;  // already loaded.
 | ||
| 			if (tn.HasChildNodes && tn.Nodes[0].Text == DummyNodeText) tn.Nodes[0].Remove();
 | ||
| 
 | ||
| 			ROFSTLookup.rochild[] chld = null;
 | ||
| 
 | ||
| 			if (tn.Tag is ROFSTLookup.rodbi)
 | ||
| 			{
 | ||
| 				ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag;
 | ||
| 				MyROFSTLookup.LoadChildren(ref db);
 | ||
| 				chld = db.children;
 | ||
| 			}
 | ||
| 			else if (tn.Tag is ROFSTLookup.rochild)
 | ||
| 			{
 | ||
| 				ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag;
 | ||
| 				MyROFSTLookup.LoadChildren(ref ch);
 | ||
| 				chld = ch.children;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				Console.WriteLine("error - no type");
 | ||
| 				return;
 | ||
| 			}
 | ||
| 
 | ||
| 			// if children, add dummy node
 | ||
| 			// B2022-026 RO Memory Reduction code - need to check length
 | ||
| 			if (chld != null && chld.Length > 0)
 | ||
| 			{
 | ||
| 				ProgressBar_Initialize(chld.Length, tn.Text);
 | ||
| 
 | ||
| 				for (int i = 0; i < chld.Length; i++)
 | ||
| 				{
 | ||
| 					ProgressBar_SetValue(i);
 | ||
| 					DevComponents.AdvTree.Node tmp = null;
 | ||
| 
 | ||
| 					ROFSTLookup.rochild roc = chld[i];
 | ||
| 
 | ||
| 					// if this is a group, i.e. type 0, add a dummy node
 | ||
| 					// B2022-026 RO Memory Reduction code - check children length
 | ||
| 					if (roc.type == 0 && !MyROFSTLookup.HasChildren(ref roc))
 | ||
| 					{
 | ||
| 						continue; // Ignore: Junk Scenario
 | ||
| 					}
 | ||
| 					else if (!string.IsNullOrEmpty(roc.appid))
 | ||
| 					{
 | ||
| 						MyROFSTLookup.LoadChildren(ref roc);
 | ||
| 
 | ||
| 						if (roc.children.Length == 1 && roc.children.First().roid.Length == 16)
 | ||
| 						{
 | ||
| 							roc.appid = roc.children.First().appid;
 | ||
| 							roc.roid = roc.children.First().roid;
 | ||
| 							roc.value = roc.children.First().value;
 | ||
| 
 | ||
| 							roc.children = new List<ROFSTLookup.rochild>().ToArray();
 | ||
| 						}
 | ||
| 					}
 | ||
| 
 | ||
| 
 | ||
| 					if (roc.value == null)
 | ||
| 					{
 | ||
| 						tmp = new DevComponents.AdvTree.Node(roc.title);
 | ||
| 						tmp.Tag = roc;
 | ||
| 
 | ||
| 						int index = FindIndex(tn.Nodes, tmp.Text);
 | ||
| 						tn.Nodes.Insert(index, tmp);
 | ||
| 
 | ||
| 						DevComponents.AdvTree.Node sub = new DevComponents.AdvTree.Node(DummyNodeText);
 | ||
| 						tmp.Nodes.Add(sub);
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						tmp = new DevComponents.AdvTree.Node(roc.title);
 | ||
| 						tmp.Tag = roc;
 | ||
| 
 | ||
| 						if (roc.roid.Length == 16)
 | ||
| 						{
 | ||
| 							tn.Nodes.Add(tmp);
 | ||
| 						}
 | ||
| 						else
 | ||
| 						{
 | ||
| 							int index = FindIndex(tn.Nodes, tmp.Text);
 | ||
| 							tn.Nodes.Insert(index, tmp);
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			ProgressBar_Clear();
 | ||
| 		}
 | ||
| 
 | ||
| 		private int FindIndex(NodeCollection nodes, string value)
 | ||
| 		{
 | ||
| 			int index = 0;
 | ||
| 			foreach (Node node in nodes)
 | ||
| 			{
 | ||
| 				if (GreaterValue(node.Text, value)) return index;
 | ||
| 				index++;
 | ||
| 			}
 | ||
| 			return index;
 | ||
| 		}
 | ||
| 
 | ||
| 		private bool GreaterValue(string value1, string value2)
 | ||
| 		{
 | ||
| 			return DisplayRO.GreaterValue(value1, value2);
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cmboTreeROs_SelectedIndexChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (cmboTreeROs.SelectedIndex == -1 || cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rodbi)
 | ||
| 			{
 | ||
| 				cbxFndUnLnkROVals.Enabled = false;
 | ||
| 			}
 | ||
| 			else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild)
 | ||
| 			{
 | ||
| 				ROFSTLookup.rochild ro = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag;
 | ||
| 				// B2022-026 RO Memory Reduction code - check children length
 | ||
| 				cbxFndUnLnkROVals.Enabled = (ro.children == null || ro.children.Length <= 0);
 | ||
| 			}
 | ||
| 
 | ||
| 			if (!cbxFndUnLnkROVals.Enabled)
 | ||
| 				cbxFndUnLnkROVals.Checked = false;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void gpFindROs_EnabledChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (gpFindROs.Enabled)
 | ||
| 				gpFindROs.Style.BackColor = Color.Yellow;
 | ||
| 			else
 | ||
| 				gpFindROs.Style.BackColor = saveGpFindROsColor;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void advTreeProcSetsPreSelect()
 | ||
| 		{
 | ||
| 			bool keeplooking = true;
 | ||
| 			//build a stack (bread crumb trail) of where is procedure set came from within the tree.
 | ||
| 			Stack<string> crumbs = new Stack<string>();
 | ||
| 			//crumbs.Push(Mydocversion.Name); // ex: "working draft"
 | ||
| 			//crumbs.Push(Mydocversion.MyFolder.Name); // ex: "Emergency Procedures"
 | ||
| 			//crumbs.Push(Mydocversion.MyFolder.MyParent.Name); // ex: "STPNOC-South Texas"
 | ||
| 			//crumbs.Push(advTreeProcSets.Nodes[0].Text); //top node of my tree
 | ||
| 
 | ||
| 			//crumbs.Push(Mydocversion.Name); // ex: "working draft"
 | ||
| 			crumbs.Push(Mydocversion.MyFolder.Name); // ex: "Emergency Procedures"
 | ||
| 			FolderInfo fi = Mydocversion.MyFolder.MyParent;
 | ||
| 			while (fi != null)
 | ||
| 			{
 | ||
| 				if (fi.MyParent != null)
 | ||
| 					crumbs.Push(fi.Name);
 | ||
| 				fi = fi.MyParent;
 | ||
| 			}
 | ||
| 			crumbs.Push(advTreeProcSets.Nodes[0].Text); //top node of my tree
 | ||
| 
 | ||
| 			// now walk the tree, looking for the node names we saved in the stack.
 | ||
| 			NodeCollection monkeys = advTreeProcSets.Nodes;
 | ||
| 			while (keeplooking)
 | ||
| 			{
 | ||
| 				Node climber = LookInTree(monkeys, crumbs.Pop());
 | ||
| 				keeplooking = (climber != null && crumbs.Count > 0);
 | ||
| 				if (keeplooking)
 | ||
| 					monkeys = climber.Nodes;
 | ||
| 				if (!keeplooking && climber != null)
 | ||
| 				{
 | ||
| 					climber.Checked = true;
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (Annotation Search)
 | ||
| 
 | ||
| 		private void cbxTextSearchAnnotation_Leave(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			InsertAnnotationSearchCriteria();
 | ||
| 
 | ||
| 		}
 | ||
| 
 | ||
| 		private void InsertAnnotationSearchCriteria()
 | ||
| 		{
 | ||
| 			if (!cbxTextSearchAnnotation.Text.Equals(string.Empty))
 | ||
| 			{
 | ||
| 				string tstr = cbxTextSearchAnnotation.Text;
 | ||
| 				if (!cbxTextSearchAnnotation.Items.Contains(tstr))
 | ||
| 					cbxTextSearchAnnotation.Items.Insert(0, tstr);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void gpSrchAnnoText_EnabledChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (gpSrchAnnoText.Enabled)
 | ||
| 			{
 | ||
| 				gpSrchAnnoText.Style.BackColor = Color.Yellow;
 | ||
| 				cbxTextSearchAnnotation.Focus();
 | ||
| 			}
 | ||
| 			else
 | ||
| 				gpSrchAnnoText.Style.BackColor = saveGpSrchAnnoTextColor;
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (Search Results)
 | ||
| 
 | ||
| 		private void DisplayResults()
 | ||
| 		{
 | ||
| 			_LoadingList = true;
 | ||
| 			// C2020-033: Incoming Transition tab.  Note that this tab uses a different control for the search
 | ||
| 			//	results, it uses the dotnetbar list that has check boxes.  Because of this, various places throughout
 | ||
| 			//	the code will check for what tab is displayed and will work eith the associated list box, either
 | ||
| 			//	lbSrchResults or lbSrchResultsIncTrans
 | ||
| 			if (tabSearchTypes.SelectedTab != tabSearchTypes.Tabs[4]) lbSrchResults.DisplayMember = _DisplayMember;
 | ||
| 			else lbSrchResultsIncTrans.DisplayMember = _DisplayMember;
 | ||
| 			if (_SearchResults != null)
 | ||
| 			{
 | ||
| 				// record count flag
 | ||
| 				bool reccnt = true;
 | ||
| 				// B2021-076: Proms search results are not presented in order when printed to PDF
 | ||
| 				// B2023-041 - backed out previous change as it was not needed and was preventing the sorting of search results text
 | ||
| 				if (cbSorted.Checked)
 | ||
| 				{
 | ||
| 					Csla.SortedBindingList<ItemInfo> sortedResults = new Csla.SortedBindingList<ItemInfo>(_SearchResults);
 | ||
| 					sortedResults.ApplySort(_DisplayMember, ListSortDirection.Ascending);
 | ||
| 					if (tabSearchTypes.SelectedTab != tabSearchTypes.Tabs[4]) lbSrchResults.DataSource = sortedResults;
 | ||
| 					else lbSrchResultsIncTrans.DataSource = sortedResults;
 | ||
| 				}
 | ||
| 				else
 | ||
| 				{
 | ||
| 					// B2021-076: Proms search results are not presented in order when printed to PDF
 | ||
| 					var sortedResults = _SearchResults.OrderBy(x => x.SearchDefaultSort).ToList();
 | ||
| 
 | ||
| 					// if searching for just a "?" remove all the special code matches and leaving only the true matches.
 | ||
| 					if (SearchString == "\\?")
 | ||
| 					{
 | ||
| 						string pat = @"\?";
 | ||
| 						Regex r = new Regex(pat, RegexOptions.IgnoreCase);
 | ||
| 						for (int i = 0; i < sortedResults.Count; i++)
 | ||
| 						{
 | ||
| 
 | ||
| 							Match m = r.Match(sortedResults[i].DisplayText);
 | ||
| 							if (m.Success)
 | ||
| 							{
 | ||
| 								continue;
 | ||
| 							}
 | ||
| 							else
 | ||
| 							{
 | ||
| 								sortedResults.Remove(sortedResults[i]);
 | ||
| 
 | ||
| 								i--;
 | ||
| 							}
 | ||
| 						}
 | ||
| 						grpPanSearchResults.Text = string.Format("Search Results Found: {0}", sortedResults.Count);
 | ||
| 						reccnt = false;
 | ||
| 					}
 | ||
| 
 | ||
| 					if (tabSearchTypes.SelectedTab != tabSearchTypes.Tabs[4]) lbSrchResults.DataSource = sortedResults;
 | ||
| 					else lbSrchResultsIncTrans.DataSource = sortedResults;
 | ||
| 				}
 | ||
| 				if (reccnt)
 | ||
| 				{
 | ||
| 					grpPanSearchResults.Text = string.Format("Search Results Found: {0}", _SearchResults.Count);
 | ||
| 				}
 | ||
| 				grpPanSearchResults.Style.BackColor = Color.LightGreen;// Color.YellowGreen;  Color.DarkSeaGreen;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				grpPanSearchResults.Text = "Search Results";
 | ||
| 				grpPanSearchResults.Style.BackColor = saveGrpPanSearchResults;
 | ||
| 			}
 | ||
| 
 | ||
| 			// Turn Print and Results display style on/off based on whether there are search results
 | ||
| 			if (_SearchResults != null && _SearchResults.Count > 0)
 | ||
| 			{
 | ||
| 				btnPrnSrchRslts.Enabled = true;
 | ||
| 				btnClearSearchResults.Enabled = true;
 | ||
| 				btnCopySearchResults.Enabled = true;
 | ||
| 				btnSaveSearchResults.Enabled = true;
 | ||
| 				cmbResultsStyle.Enabled = true;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				btnPrnSrchRslts.Enabled = false;
 | ||
| 				btnClearSearchResults.Enabled = false;
 | ||
| 				btnCopySearchResults.Enabled = false;
 | ||
| 				btnSaveSearchResults.Enabled = false;
 | ||
| 				cmbResultsStyle.Enabled = false;
 | ||
| 			}
 | ||
| 
 | ||
| 			// B2021-076: Proms search results are not presented in order when printed to PDF
 | ||
| 			if (_DisplayMember == "SearchPath_clean" || _DisplayMember == "ShortSearchPath_clean")
 | ||
| 			{
 | ||
| 				cbSorted.Checked = false;
 | ||
| 				cbSorted.Enabled = false;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				cbSorted.Enabled = true;
 | ||
| 			}
 | ||
| 
 | ||
| 			lbSrchResults.SelectedIndex = -1;
 | ||
| 			lbSrchResultsIncTrans.SelectedIndex = -1;
 | ||
| 			LastResultsMouseOverIndex = -1;
 | ||
| 			_LoadingList = false;
 | ||
| 
 | ||
| 		}
 | ||
| 
 | ||
| 		private void lbSrchResults_MouseMove(object sender, MouseEventArgs e)
 | ||
| 		{
 | ||
| 			int ResultsMouseOverIndex = lbSrchResults.IndexFromPoint(e.Location);
 | ||
| 			if (ResultsMouseOverIndex != -1 && ResultsMouseOverIndex != LastResultsMouseOverIndex)
 | ||
| 			{
 | ||
| 				ItemInfo ii = lbSrchResults.Items[ResultsMouseOverIndex] as ItemInfo;
 | ||
| 				if (cmbResultsStyle.Text == "Step Path" && !ii.IsRtfRaw)
 | ||
| 					toolTip1.SetToolTip(lbSrchResults, ii.DisplayText); // display the text in a tooltip
 | ||
| 				else
 | ||
| 					toolTip1.SetToolTip(lbSrchResults, ii.Path); // display location of corresponding procedure text in a tooltip
 | ||
| 				LastResultsMouseOverIndex = ResultsMouseOverIndex;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		// B2021-018: Removed code that was tracking the number of items checked in the incoming transition
 | ||
| 		//	listbox.  Found that could just look at the CheckedItems.Count value. (Previous fixes
 | ||
| 		//	that were removed are B2021-003 & part of C2020-033 (part was for permissions, which was not removed)
 | ||
| 		// C2020-033: lbSrchResultsIncTrans_ItemClicked is used to check permissions of a selection before allowing an
 | ||
| 		//	item to be clicked and to turn on/off the btnTranCvtSelToTxt button for converting selected to test.
 | ||
| 		private void lbSrchResultsIncTrans_ItemClicked(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			ListBoxItem lbi = sender as ListBoxItem;
 | ||
| 			if (lbi != null)
 | ||
| 			{
 | ||
| 				ItemBindingData ibd = lbi.Tag as ItemBindingData;
 | ||
| 				ItemInfo ii = ibd.DataItem as ItemInfo;
 | ||
| 				bool allowNonAdmin = IncTranCvtPerm();
 | ||
| 				if (lbi.CheckState == CheckState.Checked && ii != null)
 | ||
| 				{
 | ||
| 					if (!allowNonAdmin && !UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion))
 | ||
| 					{
 | ||
| 						FlexibleMessageBox.Show("You do not have permission to edit the procedure, section, or step.",
 | ||
| 							"Convert Transition to Text", MessageBoxButtons.OK, MessageBoxIcon.Information);
 | ||
| 						lbi.CheckState = CheckState.Unchecked;
 | ||
| 					}
 | ||
| 				}
 | ||
| 				// B2021-018: use the CheckedItems.Count on the list box for the search results for
 | ||
| 				//	incoming transitions to determine whether to enable the convert selected to text:
 | ||
| 				btnTranCvtSelToTxt.Enabled = (lbSrchResultsIncTrans.CheckedItems.Count > 0);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void GrpPanSearchResults_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
 | ||
| 		{
 | ||
| 			// B2021-004: If a multiple selection occurred in the results list for Incoming Transitions, tell user that
 | ||
| 			//	processing is occurring
 | ||
| 			if (!lbSrchResultsIncTrans.Enabled) FlexibleMessageBox.Show("Processing a request to open a procedure. Try again when complete.",
 | ||
| 				"Try Again", MessageBoxButtons.OK, MessageBoxIcon.Information);
 | ||
| 		}
 | ||
| 
 | ||
| 		private void lbSrchResults_SelectedValueChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (_LoadingList) return;
 | ||
| 			if (_ProcessingSelectedValueChanged) return;
 | ||
| 			if (UpdatedAnnotationList) return;
 | ||
| 			_ProcessingSelectedValueChanged = true;
 | ||
| 			// B2021-004: Prevent multiple selections on the Incoming Transitions listbox  (disable selections
 | ||
| 			//	for the listbox until all processing is done, listbox is enabled at end of method)
 | ||
| 			if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4])
 | ||
| 			{
 | ||
| 				lbSrchResultsIncTrans.Enabled = false;
 | ||
| 				lbSrchResultsIncTrans.UseWaitCursor = true;
 | ||
| 			}
 | ||
| 			//B2025-056 Click on Incoming Transitions
 | ||
| 			// Clicking on Incoming Transitions
 | ||
| 			// will now open that item
 | ||
| 			ListBox mylb_lbSrchResults = sender as ListBox;
 | ||
| 			ListBoxAdv mylb_lbSrchResultsIncTrans = sender as ListBoxAdv;
 | ||
| 
 | ||
| 			// If the list is being refreshed, then set the selection index to -1 (no selection)
 | ||
| 			// B2022-044: don't set selection to top of list (commented out/changed if)
 | ||
| 			if ((mylb_lbSrchResults != null || mylb_lbSrchResultsIncTrans != null) && !_SearchResults.RefreshingList)
 | ||
| 			{
 | ||
| 				_ItemInfo = (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4]) ? lbSrchResultsIncTrans.SelectedValue as ItemInfo : lbSrchResults.SelectedValue as ItemInfo;
 | ||
| 				if ((tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[1]) && (_ItemInfo != null))
 | ||
| 				{
 | ||
| 					// B2020-019: Don't set the CurrentAnnotation to an annotation in a procedure that cannot be opened.
 | ||
| 					AnnotationInfo tmpca = AnnotationInfo.Get(_ItemInfo.SearchAnnotationID);
 | ||
| 					DisplayTabItem dti = null;
 | ||
| 					if (tmpca != null) dti = _TabControl.OpenItem(tmpca.MyItem); // open the corresponding procedure text
 | ||
| 					if (dti != null)
 | ||
| 					{
 | ||
| 						_AnnotationDetails.CurrentAnnotation = tmpca;
 | ||
| 						_AnnotationDetails.FindCurrentAnnotation(); // position to corresponding row in annotation grid
 | ||
| 					}
 | ||
| 				}
 | ||
| 				else
 | ||
| 				{
 | ||
| 					if (_ItemInfo != null)
 | ||
| 					{
 | ||
| 						_OpenDocFromSearch = true;
 | ||
| 						// B2023-089: selecting a deleted item from search results shows deleted step in the editor when the StepTabItem for 
 | ||
| 						//	the deleted item was displayed but is not the active StepTabItem.  Use its procedure if it was deleted
 | ||
| 						ItemInfo openItem = _ItemInfo.IsDeleted ? ItemInfo.Get(_ItemInfo.MyProcedure == null ? _ItemInfo.ItemID : _ItemInfo.MyProcedure.ItemID) : _ItemInfo;
 | ||
| 						DisplayTabItem dti = _TabControl.OpenItem(openItem); // open the corresponding procedure text
 | ||
| 						if (dti != null)
 | ||
| 						{
 | ||
| 							if (dti.MyDSOTabPanel != null)
 | ||
| 								dti.MyDSOTabPanel.SearchString = _strSrchText == null || _strSrchText == string.Empty ? this.cbxTextSearchText.Text : _strSrchText;
 | ||
| 							if (dti.MyStepTabPanel != null)
 | ||
| 								dti.MyStepTabPanel.SearchString = _strSrchText == null || _strSrchText == string.Empty ? this.cbxTextSearchText.Text : _strSrchText;
 | ||
| 							_OpenDocFromSearch = false;
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			_ProcessingSelectedValueChanged = false;
 | ||
| 			if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4])
 | ||
| 			{
 | ||
| 				lbSrchResultsIncTrans.Enabled = true;
 | ||
| 				lbSrchResultsIncTrans.UseWaitCursor = false;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cmbResultsStyle_SelectedValueChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			switch (cmbResultsStyle.Text)
 | ||
| 			{
 | ||
| 				case "Document Path":
 | ||
| 					_DisplayMember = "SearchDVPath_clean";
 | ||
| 					break;
 | ||
| 				case "Step Path":
 | ||
| 					_DisplayMember = "ShortSearchPath_clean";
 | ||
| 					break;
 | ||
| 				case "Annotation Text":
 | ||
| 					_DisplayMember = "SearchAnnotationText";
 | ||
| 					break;
 | ||
| 				case "Document Text":
 | ||
| 					_DisplayMember = "DisplayText";
 | ||
| 					break;
 | ||
| 				default:
 | ||
| 					_DisplayMember = "SearchPath_clean";
 | ||
| 					break;
 | ||
| 			}
 | ||
| 			DisplayResults();
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cbSorted_CheckedChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			Cursor savcursor = Cursor;
 | ||
| 			Application.DoEvents();
 | ||
| 			Cursor = Cursors.WaitCursor;
 | ||
| 			//Console.WriteLine(string.Format("Checked = {0}", cbSorted.Checked));
 | ||
| 			DisplayResults();
 | ||
| 			Cursor = savcursor;
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (Search)
 | ||
| 
 | ||
| 		private string ConvertSpecialChars(string str)
 | ||
| 		{
 | ||
| 			string rtnVal = str;
 | ||
| 			rtnVal = rtnVal.Replace("\u00A0", @"\u160?"); //convert \u00A0 to a hard space (\u00A0 shows as a blank in the search text field)
 | ||
| 			rtnVal = rtnVal.Replace("\n", @"\line "); //B2018-020 SQL content record has "\line " for the hard return
 | ||
| 													  // Bug fix B2014-057
 | ||
| 													  // if we are searching for a symbol character in all procedure sets MyDocVersion is null
 | ||
| 													  // when MyDocVersion is null, get the symbol list directly from the PROMS base format (BaseAll.xml)
 | ||
| 			FormatData fmtdata = (_MyDocVersion != null) ? _MyDocVersion.ActiveFormat.PlantFormat.FormatData : FormatInfo.PROMSBaseFormat.FormatData;
 | ||
| 			if (fmtdata != null && fmtdata.SymbolList != null)
 | ||
| 			{
 | ||
| 				SymbolList sl = fmtdata.SymbolList;
 | ||
| 				if (sl != null)
 | ||
| 				{
 | ||
| 					foreach (Symbol sym in sl)
 | ||
| 					{
 | ||
| 						string rplace = string.Format(sym.Unicode < 256 ? @"\'{0:X2}" : @"\u{0}?", sym.Unicode);  // bug fix B2014-057 we were not including the ? in the replace
 | ||
| 						rtnVal = rtnVal.Replace(((char)sym.Unicode).ToString(), rplace);
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			return rtnVal;
 | ||
| 		}
 | ||
| 
 | ||
| 		// Same funtion as GetROChildren in DisplayReport.cs
 | ||
| 		private string GetROsToSearch(ROFSTLookup.rochild[] chld)
 | ||
| 		{
 | ||
| 			string rtnstr = string.Empty;
 | ||
| 			// B2022-118: If the ro has child nodes in tree view but they aren't loaded, load them
 | ||
| 			if ((chld == null || chld.Length <= 0) && (cmboTreeROs.SelectedNode.Nodes != null || cmboTreeROs.SelectedNode.Nodes.Count >= 1))
 | ||
| 			{
 | ||
| 				ROFSTLookup.rochild ro = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag;
 | ||
| 				MyROFSTLookup.LoadChildren(ref ro);
 | ||
| 				chld = ro.children;
 | ||
| 			}
 | ||
| 
 | ||
| 			// B2022-026 RO Memory Reduction code - check children length
 | ||
| 			if (chld == null || chld.Length <= 0) // get a single ROID
 | ||
| 			{
 | ||
| 				ROFSTLookup.rochild ro = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag;
 | ||
| 				// B2022-107: Display Progress Bar Messages/Statuses when a new ROFST binary file is loaded into the database
 | ||
| 				rtnstr += ROFSTLookup.FormatRoidKey(ro.roid, false);
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{ // spin through the child list and get the ROIDs.
 | ||
| 			  // if the child has children, then call this function recursively 
 | ||
| 				foreach (ROFSTLookup.rochild roc in chld)
 | ||
| 				{
 | ||
| 					// B2022-026 RO Memory Reduction code - check children length
 | ||
| 					if (roc.children != null && roc.children.Length > 0)
 | ||
| 						rtnstr += GetROsToSearch(roc.children);
 | ||
| 					else
 | ||
| 					{
 | ||
| 						// B2022-118: If the ro has child nodes in tree view but they aren't loaded, load them
 | ||
| 						ROFSTLookup.rochild rot = roc;
 | ||
| 						MyROFSTLookup.LoadChildren(ref rot);
 | ||
| 						chld = rot.children;
 | ||
| 
 | ||
| 						if (rot.children != null && rot.children.Length > 0)
 | ||
| 							rtnstr += GetROsToSearch(rot.children);
 | ||
| 						else
 | ||
| 							rtnstr += string.Format("{0},", ROFSTLookup.FormatRoidKey(roc.roid, false));
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			return rtnstr;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnSearch_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			_fromLoad = false;
 | ||
| 			DateTime start = DateTime.Now;
 | ||
| 			Cursor savcursor = Cursor;
 | ||
| 			// keeps track of index into combo box for results style.  This combo box may have 3 or 4
 | ||
| 			// items depending on whether annotations exist.
 | ||
| 			int cmbResultsStyleIndex = -1;
 | ||
| 			try
 | ||
| 			{
 | ||
| 				LastSearchWasAnnotations = false; // B2019-119 only refresh annotation search results if an annotation search was done
 | ||
| 				ClearResults();
 | ||
| 				Cursor = Cursors.WaitCursor;
 | ||
| 				SearchResults = null;
 | ||
| 				bool includeRTFformat = false;
 | ||
| 				bool includeSpecialChars = (TextSearchString != @"\?"); // true;
 | ||
| 																		// Build list of selected types that were searched
 | ||
| 				string typstr = null;
 | ||
| 				foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : typstr + ", " + s;
 | ||
| 				TypesSelected = "Filtered By:  " + ((typstr != null) ? typstr : "All Step Types");
 | ||
| 				//TypesSelected = "Step Types Searched: " + ((typstr != null) ? typstr : "all step types");
 | ||
| 				//TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "all step types");
 | ||
| 				//TypesSelected = (typstr != null) ? "Searched Step Types: " + typstr : "Searched All Step Types";
 | ||
| 				string unitPrefix = string.Empty;
 | ||
| 				if (Mydocversion != null)
 | ||
| 					unitPrefix = Mydocversion.DocVersionConfig.Unit_ProcedureNumber;
 | ||
| 				if (unitPrefix.EndsWith("#"))
 | ||
| 					unitPrefix = unitPrefix.Replace("#", string.Empty);
 | ||
| 
 | ||
| 				if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[0]) // Text Search
 | ||
| 				{
 | ||
| 					if (cbxSrchTypeUsage.Checked) // find just the usage of the selected types
 | ||
| 					{
 | ||
| 						if (lstCheckedStepTypes.Count == 0)
 | ||
| 						{
 | ||
| 							FlexibleMessageBox.Show("Please select one or more types then press the Search button", "No Types Selected");
 | ||
| 							xpStepTypes.Expanded = true;
 | ||
| 							advTreeStepTypes.Focus();
 | ||
| 							xpStepTypes.TitleStyle.BackColor1.Color = Color.Crimson;
 | ||
| 						}
 | ||
| 						else
 | ||
| 						{
 | ||
| 							//string typstr = null;
 | ||
| 							//foreach (string s in lstCheckedStepTypesStr) typstr = typstr==null?s:typstr + ", " + s;
 | ||
| 							//ReportTitle = "Search for Selected Types"; //"Proms - Search by Type: " + typstr;
 | ||
| 							ReportTitle = "Step Element Report"; //"Proms - Search by Type: " + typstr;
 | ||
| 							TypesSelected = "Filtered By:  " + typstr;
 | ||
| 							SearchString = null;
 | ||
| 								// B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results.
 | ||
| 							SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, string.Empty, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Value, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty);
 | ||
| 							cmbResultsStyleIndex = 1;  //display step locations in results
 | ||
| 						}
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						//if (textSearchString.Equals(string.Empty))
 | ||
| 						//{
 | ||
| 						//  MessageBox.Show("Please enter some search text, then click the Search button", "No Search Text");
 | ||
| 						//  cbxTextSearchText.Focus();
 | ||
| 						//}
 | ||
| 						//else
 | ||
| 						//{
 | ||
| 						//ReportTitle = string.Format("Proms - {0} Search for '{1}'", cbxBooleanTxtSrch.Checked ? "Boolean" : "Text", TextSearchString);
 | ||
| 						ReportTitle = string.Format("Search for '{0}'", TextSearchString);
 | ||
| 
 | ||
| 						// C2020-009: Search - Allow search 'By Word'. 
 | ||
| 						string byWordPrefix = string.Empty;
 | ||
| 						string byWordSuffix = string.Empty;
 | ||
| 						if (cbxByWord.Checked)
 | ||
| 						{
 | ||
| 							// Generate a prefix & suffix to be used in the sql query around the search string.
 | ||
| 							// If the search string starts (prefix)/ends(suffix) with a number, then use an expression that 
 | ||
| 							// does not allow the preceding/following text to have a number, '.', letter or other rtf 
 | ||
| 							// commands.  If the search string starts/ends with a letter, then use an expression that does not
 | ||
| 							// find the preceding/following text that is text, i.e. a letter.
 | ||
| 							if (Regex.IsMatch(TextSearchString, @"^[\d\.]"))        // starts with a number or '.' decimal pt
 | ||
| 							{
 | ||
| 								byWordPrefix = @"[^0-9a-zA-Z.vbpi:\\-]";
 | ||
| 							}
 | ||
| 							else if (Regex.IsMatch(TextSearchString, @"^[a-zA-Z]")) // starts with a letter
 | ||
| 							{
 | ||
| 								byWordPrefix = @"[^a-zA-Z]";
 | ||
| 							}
 | ||
| 							if (Regex.IsMatch(TextSearchString, @"[\d\.]$"))        // ends with a number or decimal
 | ||
| 							{
 | ||
| 								byWordSuffix = @"[^0-9a-zA-Z.vbpi:\\-]";
 | ||
| 							}
 | ||
| 							else if (Regex.IsMatch(TextSearchString, @"[a-zA-Z]$")) // ends with a letter
 | ||
| 							{
 | ||
| 								byWordSuffix = @"[^a-zA-Z]";
 | ||
| 							}
 | ||
| 						}
 | ||
| 						SearchString = TextSearchString;
 | ||
| 						//TypesSelected = (typstr != null) ? "Searched Step Types: " + typstr : "Searched All Step Types";
 | ||
| 						//TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "All Step Types");
 | ||
| 							// B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results.
 | ||
| 						SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, TextSearchString /*.Replace(@"\",@"\u9586?")*/, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, cbxIncROTextSrch.Checked ? ItemSearchIncludeLinks.Value : ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix);
 | ||
| 
 | ||
| 						cmbResultsStyleIndex = 3;  // display step text in results
 | ||
| 												   //}
 | ||
| 					}
 | ||
| 					// C2019-001: Search in RNO steps only
 | ||
| 					if (cbxRnoOnly.Checked) GetInRNOResults();
 | ||
| 				}
 | ||
| 				else if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[1]) // Annotation Search
 | ||
| 				{
 | ||
| 					LastSearchWasAnnotations = true; // B2019-119 only refresh annotation search results if an annotation search was done
 | ||
| 					SearchString = null;
 | ||
| 					//ReportTitle = string.Format("Proms - Annotation Search for '{0}'", cbxTextSearchAnnotation.Text);
 | ||
| 					if (cbxTextSearchAnnotation.Text == null || cbxTextSearchAnnotation.Text == string.Empty)
 | ||
| 					{
 | ||
| 						ReportTitle = string.Format("Find {0}{1}", cbxAnnoTypes.Text, (cbxAnnoTypes.SelectedIndex > 0) ? " Annotations" : string.Empty);
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						ReportTitle = string.Format("Search {0}{1} For '{2}'", cbxAnnoTypes.Text, (cbxAnnoTypes.SelectedIndex > 0) ? " Annotations" : string.Empty, cbxTextSearchAnnotation.Text);
 | ||
| 					}
 | ||
| 					//ReportTitle = string.Format("Search Annotations for '{0}'", cbxTextSearchAnnotation.Text);
 | ||
| 					//string srchStr = ConvertSpecialChars(cbxTextSearchAnnotation.Text);//cbxTextSearchAnnotation.Text;
 | ||
| 					//TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "All Step Types");
 | ||
| 
 | ||
| 					//SearchResults = ItemInfoList.GetListFromAnnotationSearch(dviSearchList, typeSearchList, textSearchString, srchStr, cbxCaseSensitiveAnnoText.Checked);
 | ||
| 
 | ||
| 					SearchResults = ItemInfoList.GetListFromAnnotationSearch(DVISearchList, TypeSearchList, AnnotationSearchType, cbxTextSearchAnnotation.Text, cbxCaseSensitiveAnnoText.Checked, unitPrefix);
 | ||
| 					//UpdateAnnotationSearchResults();
 | ||
| 					cmbResultsStyleIndex = 2;  // display annotation text in results
 | ||
| 											   // C2019-001: Search in RNO steps only
 | ||
| 					if (cbxRnoOnlyAnnot.Checked) GetInRNOResults();
 | ||
| 				}
 | ||
| 				else if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[2]) // RO Search
 | ||
| 				{
 | ||
| 					SearchString = null;
 | ||
| 					//ReportTitle = "Proms - Referenced Object Search";
 | ||
| 					ReportTitle = string.Format("Search For Referenced Object:\n{0}", cmboTreeROs.Text);
 | ||
| 					//TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "All Step Types");
 | ||
| 
 | ||
| 					if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked)
 | ||
| 					{
 | ||
| 						// B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results.
 | ||
| 						SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty);
 | ||
| 						cmbResultsStyleIndex = 3;  // display step text in results
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						SearchResults = ItemInfoList.GetListFromROSearch(DVISearchList, TypeSearchList, ROSearchList, unitPrefix);
 | ||
| 						cmbResultsStyleIndex = 3;  // display step text in results
 | ||
| 					}
 | ||
| 					// C2019-001: Search in RNO steps only
 | ||
| 					if (cbxRnoOnlyRO.Checked) GetInRNOResults();
 | ||
| 				}
 | ||
| 				else if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[3])  //Transition Search
 | ||
| 				{
 | ||
| 					ReportTitle = string.Format("Search For Transitions: Transition Type: {0}, Transition Category: {1}", cbxTranFormat.SelectedItem, cbxTranCategory.SelectedItem);
 | ||
| 					string docVersionList = string.Empty;
 | ||
| 					if (lstCheckedDocVersions.Count == 0)
 | ||
| 						docVersionList = cbxTranVersion.Tag.ToString();
 | ||
| 					else
 | ||
| 					{
 | ||
| 						string sep = string.Empty;
 | ||
| 						foreach (DocVersionInfo dvi in lstCheckedDocVersions)
 | ||
| 						{
 | ||
| 							docVersionList += sep + dvi.VersionID.ToString();
 | ||
| 							sep = ",";
 | ||
| 						}
 | ||
| 					}
 | ||
| 					// B2018-134 to search specifically for Outside Transitions, set docVeronList to empty string so that all procedure sets are considered
 | ||
| 					if (cbxTranCategory.SelectedItem.ToString() == "Outside")
 | ||
| 						docVersionList = string.Empty;
 | ||
| 					// added TypeSearchList for bug fix B2015-055
 | ||
| 					SearchResults = ItemInfoList.GetListFromTransitionSearch(docVersionList, cbxTranFormat.SelectedIndex - 1, cbxTranCategory.SelectedItem.ToString() == "All" ? string.Empty : cbxTranCategory.SelectedItem.ToString(), TypeSearchList);
 | ||
| 					cmbResultsStyleIndex = 3;  // display step text in results
 | ||
| 											   // C2019-001: Search in RNO steps only
 | ||
| 					if (cbxRnoOnlyTrans.Checked) GetInRNOResults();
 | ||
| 				}
 | ||
| 				else if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4])
 | ||
| 				{
 | ||
| 					// C2020-033: Incoming Transitions: Make an iteminfolist from the list returned from
 | ||
| 					//	GetExternalTransitionsToChildren (also gets transitions to the item itself)
 | ||
| 					// B2021-010: Use IncomingTranGetMergedTranList to get a complete list of incoming transitions (transitions to procedure
 | ||
| 					//	were only included if there were NO transitions to items within procedure)
 | ||
| 					ReportTitle = string.Format("Search For Incoming Transitions to {0}: ", SearchIncTransII.Path);
 | ||
| 					SearchResults = IncomingTranGetMergedTranList();
 | ||
| 					cmbResultsStyleIndex = 1;  //display step locations in results
 | ||
| 					if (SearchResults == null || SearchResults.Count == 0)
 | ||
| 					{
 | ||
| 						FlexibleMessageBox.Show("No Matches Found.", "Search");
 | ||
| 					}
 | ||
| 				}
 | ||
| 				if (SearchResults != null)
 | ||
| 				{
 | ||
| 					AddMessageForEmptyAnnotations();
 | ||
| 					if (cmbResultsStyleIndex == 3 && cmbResultsStyle.Items.Count == 3) cmbResultsStyleIndex--;
 | ||
| 					cmbResultsStyle.SelectedIndex = cmbResultsStyleIndex;
 | ||
| 					DisplayResults();
 | ||
| 					if (SearchResults != null && SearchResults.Count == 0)
 | ||
| 					{
 | ||
| 						FlexibleMessageBox.Show("No Matches Found.", "Search");
 | ||
| 					}
 | ||
| 				}
 | ||
| 				btnTranCvtAllToTxt.Enabled = IncTransCvtAllToTextPerm();    // C2020-033: does user have access to at least one item
 | ||
| 			}
 | ||
| 			catch (Exception ex)
 | ||
| 			{
 | ||
| 				while (ex.InnerException != null)
 | ||
| 					ex = ex.InnerException;
 | ||
| 				string tmpmsg = (cbxBooleanTxtSrch.Checked && ex.Message.Contains("Syntax error") && ex.Message.Contains("full-text search")) ?
 | ||
| 					"Place \"\" around words that you are searching for, so that parser can better understand what you are trying to find" :
 | ||
| 					ex.Message;
 | ||
| 				FlexibleMessageBox.Show(tmpmsg, "Search Error: " + ex.GetType().Name);
 | ||
| 			}
 | ||
| 			finally
 | ||
| 			{
 | ||
| 				Cursor = savcursor;
 | ||
| 			}
 | ||
| 			//Console.WriteLine("{0} Milliseconds", TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalMilliseconds);
 | ||
| 			OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks)));
 | ||
| 			//if (VlnSettings.DebugMode)
 | ||
| 			//    MessageBox.Show(string.Format("{0} Milliseconds", TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalMilliseconds));
 | ||
| 		}
 | ||
| 
 | ||
| 		private void ClearResults()     // B2021-103 if no results when RNO only, clear results list.  (moved from btnSearch_Click)
 | ||
| 		{
 | ||
| 			if (tabSearchTypes.SelectedTab != tabSearchTypes.Tabs[4])
 | ||
| 			{
 | ||
| 				lbSrchResults.DataSource = null;
 | ||
| 				lbSrchResults.Items.Clear();
 | ||
| 				toolTip1.SetToolTip(lbSrchResults, null);
 | ||
| 			}
 | ||
| 			else        // C2020-033: Incoming Transiiotns
 | ||
| 			{
 | ||
| 				lbSrchResultsIncTrans.DataSource = null;
 | ||
| 				lbSrchResultsIncTrans.Items.Clear();
 | ||
| 				toolTip1.SetToolTip(lbSrchResultsIncTrans, null);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		// C2019-001: Search in RNO steps only
 | ||
| 		private void GetInRNOResults()
 | ||
| 		{
 | ||
| 			bool first = true;
 | ||
| 			ItemInfoList iil = null;
 | ||
| 
 | ||
| 			foreach (ItemInfo ii in SearchResults)
 | ||
| 			{
 | ||
| 				if (ii.SearchPath.Contains(".RNO."))
 | ||
| 				{
 | ||
| 					if (first)
 | ||
| 					{
 | ||
| 						iil = new ItemInfoList(ii);
 | ||
| 						first = false;
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						iil.AddItem(ii);
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			SearchResults = iil;
 | ||
| 			// B2021-075 - put up none found message for RNO only
 | ||
| 			if (SearchResults == null || SearchResults.Count == 0)
 | ||
| 			{
 | ||
| 				FlexibleMessageBox.Show("No Matches Found.", "Search");
 | ||
| 				ClearResults();     // B2021-103 Clear results list if none found.
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void AddMessageForEmptyAnnotations()
 | ||
| 		{
 | ||
| 			bool hasAnnot = false;
 | ||
| 
 | ||
| 			foreach (ItemInfo ii in SearchResults)
 | ||
| 			{
 | ||
| 				if (ii.ItemAnnotations != null && ii.ItemAnnotationCount > 0)
 | ||
| 				{
 | ||
| 					// RHM - can an iteminfo have an itemannotationcount>0 and not have searchannotationtext.
 | ||
| 					if (ii.SearchAnnotationText == null) ii.SearchAnnotationText = AnnotationInfo.Get(ii.ItemAnnotations[0].AnnotationID).SearchText;
 | ||
| 				}
 | ||
| 
 | ||
| 				if (ii.SearchAnnotationText == null) ii.SearchAnnotationText = "None - [" + ii.DisplayText + "]";
 | ||
| 				else
 | ||
| 				{
 | ||
| 					hasAnnot = true;
 | ||
| 				}
 | ||
| 			}
 | ||
| 			cmbResultsStyle.Items.Clear();
 | ||
| 			cmbResultsStyle.Items.Add(comboItem1);
 | ||
| 			cmbResultsStyle.Items.Add(comboItem2);
 | ||
| 			if (hasAnnot) cmbResultsStyle.Items.Add(comboItem3);
 | ||
| 			cmbResultsStyle.Items.Add(comboItem4);
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cbxTextSearchText_Leave(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			InsertSearchCriteria();
 | ||
| 		}
 | ||
| 
 | ||
| 		private void InsertSearchCriteria()
 | ||
| 		{
 | ||
| 			if (!cbxTextSearchText.Text.Equals(string.Empty))
 | ||
| 			{
 | ||
| 				string tstr = cbxTextSearchText.Text;
 | ||
| 				// if its already exists in the list - remove it
 | ||
| 				if (cbxTextSearchText.Items.Contains(tstr))
 | ||
| 					cbxTextSearchText.Items.Remove(tstr);
 | ||
| 				// Add the new criteria to the top of the list
 | ||
| 				cbxTextSearchText.Items.Insert(0, tstr);
 | ||
| 				// set the text to the new criteria
 | ||
| 				cbxTextSearchText.Text = tstr;
 | ||
| 				// If there are more than 10 remove the last one
 | ||
| 				if (cbxTextSearchText.Items.Count > 10)
 | ||
| 					cbxTextSearchText.Items.RemoveAt(10);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cbxSrchTypeUsage_CheckedChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			gpSrchText.Enabled = !cbxSrchTypeUsage.Checked;
 | ||
| 			if (!cbxSrchTypeUsage.Checked)
 | ||
| 				xpStepTypes.TitleStyle.BackColor1.Color = saveXpStepTypeTitleColor;
 | ||
| 			else
 | ||
| 			{
 | ||
| 				xpStepTypes.Expanded = true;
 | ||
| 				if (lstCheckedStepTypes.Count == 0)
 | ||
| 					xpStepTypes.TitleStyle.BackColor1.Color = Color.Crimson;
 | ||
| 				advTreeStepTypes.Focus();
 | ||
| 
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void rbtnSrchTxt_CheckedChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (rbtnSrchTxt.Checked)
 | ||
| 				cbxTextSearchText.Focus();
 | ||
| 		}
 | ||
| 
 | ||
| 		private void gpSrchText_EnabledChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (gpSrchText.Enabled)
 | ||
| 				gpSrchText.Style.BackColor = cbxBooleanTxtSrch.Checked ? Color.Orange : Color.Yellow;
 | ||
| 			else
 | ||
| 				gpSrchText.Style.BackColor = saveGpSrchTextColor;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void tabStepTypeSearch_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (rbtnSrchTxt.Checked)
 | ||
| 			{
 | ||
| 				cbxTextSearchText.Focus();
 | ||
| 				cbxBooleanTxtSrch_CheckedChanged(sender, e);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void ProcessEnterKey(object sender, KeyPressEventArgs e)
 | ||
| 		{
 | ||
| 			if (e.KeyChar == '\r') // enter key pressed
 | ||
| 			{
 | ||
| 				e.Handled = true;
 | ||
| 				btnSearch_Click(sender, e);
 | ||
| 				if (sender == cbxTextSearchText)
 | ||
| 					InsertSearchCriteria();
 | ||
| 				else
 | ||
| 					InsertAnnotationSearchCriteria();
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (ProcSetSelection)
 | ||
| 
 | ||
| 		private void advTreeProcSets_AfterCheck(object sender, DevComponents.AdvTree.AdvTreeCellEventArgs e)
 | ||
| 		{
 | ||
| 			// this method gets called if child nodes get checked by the code, return if doing this process.
 | ||
| 			if (checkingChildren)
 | ||
| 				return;
 | ||
| 
 | ||
| 			DevComponents.AdvTree.Node n = advTreeProcSets.SelectedNode;
 | ||
| 			dicSelectedFolderNodes[n] = n.Checked;
 | ||
| 
 | ||
| 			// if this tree node is checked, and there are children, check the children too.
 | ||
| 			if (n.Checked)
 | ||
| 			{
 | ||
| 				checkingChildren = true;
 | ||
| 				if (n.Nodes != null && n.Nodes.Count > 0 && n.Nodes[0].Text != DummyNodeText) CheckTreeNodeChildren(n.Nodes);
 | ||
| 				checkingChildren = false;
 | ||
| 			}
 | ||
| 			else
 | ||
|             {
 | ||
| 				//C2025-005 Find Step Elements
 | ||
| 				//uncheck the parents if there are any
 | ||
| 				DevComponents.AdvTree.Node tmp_n = n;
 | ||
| 				while (tmp_n.Parent != null)
 | ||
| 				{
 | ||
| 					tmp_n = tmp_n.Parent;
 | ||
| 					tmp_n.Checked = false;
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			// if the selected folder has a docversion, handle it:
 | ||
| 			if (n.Tag != SelectAllProcedureSetsText)
 | ||
| 			{
 | ||
| 				FolderInfo fi = (FolderInfo)n.Tag;
 | ||
| 				RefreshLstCheckedDocVersions();
 | ||
| 				RefreshStepTypes();// Refresh Step Types after Working Draft is checked.
 | ||
| 
 | ||
| 				if (lstCheckedDocVersions.Count == 1 && fi.FolderDocVersions != null && fi.FolderDocVersions.Count > 0)
 | ||
| 				{
 | ||
| 					Mydocversion = fi.FolderDocVersions[0];
 | ||
| 					StartAdvTreeStepTypesFillIn();// B2016-258 Hang after selecting a procedure if the Step Type panel is open on the search panel
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			SetupContextMenu();
 | ||
| 			buildSetToSearchPanelTitle();
 | ||
| 
 | ||
| 			//C2025-005 Find Step Elements
 | ||
| 			//Need to refresh the Doc List and Available Step Types
 | ||
| 			//if All Procedure Sets was selected
 | ||
| 			if (n.Tag == SelectAllProcedureSetsText)
 | ||
| 			{
 | ||
| 				if (n.Checked)
 | ||
| 				{
 | ||
| 					checkingChildren = true;
 | ||
| 					foreach (Node node in advTreeProcSets.Nodes[0].Nodes)
 | ||
| 					{
 | ||
| 						node.Checked = true;
 | ||
| 						CheckTreeNodeChildren(node.Nodes);
 | ||
| 					}
 | ||
| 					checkingChildren = false;
 | ||
| 				}
 | ||
| 				RefreshLstCheckedDocVersions();
 | ||
| 				RefreshStepTypes();
 | ||
| 			}
 | ||
| 
 | ||
| 		}
 | ||
| 
 | ||
| 		// check all folder nodes below this
 | ||
| 		private void CheckTreeNodeChildren(NodeCollection nodeCollection)
 | ||
| 		{
 | ||
| 			foreach (Node tn in nodeCollection)
 | ||
| 			{
 | ||
| 				tn.Checked = tn.Parent.Checked;
 | ||
| 
 | ||
| 				if (tn.Nodes != null && tn.Nodes.Count > 0 && tn.Nodes[0].Text != DummyNodeText)
 | ||
| 					CheckTreeNodeChildren(tn.Nodes);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		// The 'lstCheckedDocVersions' maintains a list of the docversions that are associated with folders that are checked
 | ||
| 		// on the search tree of folders, i.e. procedure sets that should be included in the search.
 | ||
| 		private void RefreshLstCheckedDocVersions()
 | ||
| 		{
 | ||
| 			lstCheckedDocVersions.Clear();
 | ||
| 			AddFromTreeNodes(advTreeProcSets.Nodes);        // add docversions to the list
 | ||
| 			LoadROComboTree();                                                  // reset the ro tree based on docversion selections.
 | ||
| 		}
 | ||
| 
 | ||
| 		private void AddFromTreeNodes(NodeCollection nodeCollection)
 | ||
| 		{
 | ||
| 			foreach (Node tn in nodeCollection)
 | ||
| 			{
 | ||
| 				AddFromTreeNode(tn);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void AddFromTreeNode(Node tn)
 | ||
| 		{
 | ||
| 			if (tn.Checked)
 | ||
| 			{
 | ||
| 				//tn.Style = DevComponents.AdvTree.NodeStyles.Apple;      // sets green background on selected folder(s)
 | ||
| 				//B2023-112:  Don't crash if on top 'All' node (did not have associated folder)
 | ||
| 				FolderInfo fi = tn.Tag as FolderInfo;
 | ||
| 				// if this folder has a docversion, use its id:
 | ||
| 				if (tn.Nodes != null && tn.Nodes.Count > 0 && tn.Nodes[0].Text != DummyNodeText)        // Folder has been expanded, so add its docversion list
 | ||
| 				{
 | ||
| 					if (fi != null && fi.FolderDocVersionCount > 0) lstCheckedDocVersions.Add(fi.FolderDocVersions[0]);
 | ||
| 				}
 | ||
| 				else    // it has not been expanded process all below.
 | ||
| 				{
 | ||
| 					//B2023-076: Do not process the "Select All" node
 | ||
| 					if (tn.Text != SelectAllProcedureSetsText && fi != null)
 | ||
| 						AddAllChildVersions(fi);
 | ||
| 				}
 | ||
| 			}
 | ||
| 			else  // not checked, set style so no background color
 | ||
| 			{
 | ||
| 				tn.Style = null;
 | ||
| 			}
 | ||
| 
 | ||
| 			if (tn.Nodes != null)
 | ||
| 				AddFromTreeNodes(tn.Nodes);
 | ||
| 		}
 | ||
| 
 | ||
| 		private void RemoveAllVersions(FolderInfo child)
 | ||
| 		{
 | ||
| 			RemoveAllChildVersions(child);
 | ||
| 			RefreshStepTypes(); // Refresh the Step Type TreeView
 | ||
| 		}
 | ||
| 
 | ||
| 		/// <summary>
 | ||
| 		/// RessetStepTypes - Clear Step Type Treeview
 | ||
| 		/// </summary>
 | ||
| 		private void ResetStepTypes()
 | ||
| 		{
 | ||
| 			ResetStepTypes("....select a procedure set for types to appear...");
 | ||
| 		}
 | ||
| 
 | ||
| 		//C2025-005 Find Step Elements
 | ||
| 		//improve messaging when multiple formats
 | ||
| 		private void ResetStepTypes(params string[] strs)
 | ||
| 		{
 | ||
| 			advTreeStepTypes.Nodes.Clear();
 | ||
| 			lstCheckedStepTypes.Clear();
 | ||
| 			lstCheckedStepTypesStr.Clear();
 | ||
| 			foreach (string str in strs)
 | ||
| 			{
 | ||
| 				Node newnode = new DevComponents.AdvTree.Node();
 | ||
| 				newnode.Text = str;
 | ||
| 				advTreeStepTypes.Nodes.Add(newnode);
 | ||
| 			}
 | ||
| 			buildStepTypePannelTitle();
 | ||
| 		}
 | ||
| 
 | ||
| 		private void AddAllVersions(FolderInfo child)
 | ||
| 		{
 | ||
| 			AddAllChildVersions(child);
 | ||
| 			RefreshStepTypes();
 | ||
| 		}
 | ||
| 
 | ||
| 		/// <summary>
 | ||
| 		/// RefreshStepTypes - Updates the StepType TreeView to allow step types to be specified.
 | ||
| 		/// </summary>
 | ||
| 		private void RefreshStepTypes()
 | ||
| 		{
 | ||
| 			if (lstCheckedDocVersions.Count == 0)
 | ||
| 			{
 | ||
| 				ResetStepTypes();
 | ||
| 				return;
 | ||
| 			}
 | ||
| 
 | ||
| 			string formatName = lstCheckedDocVersions[0].ActiveFormat.Name;
 | ||
| 
 | ||
| 			foreach (DocVersionInfo dvi in lstCheckedDocVersions)
 | ||
| 			{
 | ||
| 				if (formatName != dvi.ActiveFormat.Name)
 | ||
| 				{
 | ||
| 					//C2025-005 Find Step Elements
 | ||
| 					//improve messaging when multiple formats
 | ||
| 					string frmt1 = $"    Format is {formatName} before {dvi.MyFolder.Name}";
 | ||
| 					string frmt2 = $"    which begins format: {dvi.ActiveFormat.Name}";
 | ||
| 					ResetStepTypes("...folders selected include multiple formats.", frmt1, frmt2);
 | ||
| 					return;
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			_MyDocVersion = lstCheckedDocVersions[0];
 | ||
| 
 | ||
| 			// B2016-258 Hang after selecting a procedure if the Step Type panel is open on the search panel
 | ||
| 			StartAdvTreeStepTypesFillIn();
 | ||
| 		}
 | ||
| 
 | ||
| 		// remove all docversion children
 | ||
| 		private void RemoveAllChildVersions(FolderInfo myFolderInfo)
 | ||
| 		{
 | ||
| 			if (myFolderInfo.FolderDocVersionCount > 0)
 | ||
| 			{
 | ||
| 				foreach (DocVersionInfo dvi in myFolderInfo.FolderDocVersions)
 | ||
| 				{
 | ||
| 					if (lstCheckedDocVersions.Contains(dvi))
 | ||
| 						lstCheckedDocVersions.Remove(dvi);
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			if (myFolderInfo.ChildFolders != null)
 | ||
| 			{
 | ||
| 				foreach (FolderInfo folderChild in myFolderInfo.ChildFolders)
 | ||
| 				{
 | ||
| 					RemoveAllChildVersions(folderChild);
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		// add all docversion children
 | ||
| 		private void AddAllChildVersions(FolderInfo myFolderInfo)
 | ||
| 		{
 | ||
| 			if (myFolderInfo.FolderDocVersionCount > 0)
 | ||
| 			{
 | ||
| 				foreach (DocVersionInfo dvi in myFolderInfo.FolderDocVersions)
 | ||
| 				{
 | ||
| 					if (!lstCheckedDocVersions.Contains(dvi))
 | ||
| 						lstCheckedDocVersions.Add(dvi);
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			if (myFolderInfo.ChildFolders != null)
 | ||
| 			{
 | ||
| 				foreach (FolderInfo folderChild in myFolderInfo.ChildFolders)
 | ||
| 				{
 | ||
| 					AddAllChildVersions(folderChild);
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cbxTranFormatFillIn(string vid)
 | ||
| 		{
 | ||
| 			vid = vid.IndexOf(",") < 0 ? vid : vid.Substring(0, cbxTranVersion.Tag.ToString().IndexOf(","));
 | ||
| 
 | ||
| 			DocVersionInfo dvi = DocVersionInfo.Get(int.Parse(vid));
 | ||
| 			TransTypeList ttl = dvi.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList;
 | ||
| 
 | ||
| 			cbxTranFormat.Items.Clear();
 | ||
| 			cbxTranFormat.Items.Add("All");
 | ||
| 
 | ||
| 			for (int i = 0; i < ttl.MaxIndex; i++)
 | ||
| 			{
 | ||
| 				cbxTranFormat.Items.Add(new TransItem(ttl[i].TransMenu.Replace("?.", string.Empty), ttl[i].TransFormat.Replace("?.", string.Empty)));
 | ||
| 			}
 | ||
| 
 | ||
| 			cbxTranFormat.SelectedIndex = 0;
 | ||
| 			cbxTranCategory.Items.Clear();
 | ||
| 			cbxTranCategory.Items.Add("All");
 | ||
| 			cbxTranCategory.Items.Add("Internal");
 | ||
| 			cbxTranCategory.Items.Add("External");
 | ||
| 			cbxTranCategory.Items.Add("Outside");
 | ||
| 			cbxTranCategory.SelectedIndex = 0;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void xpSetToSearch_ExpandedChanged(object sender, ExpandedChangeEventArgs e)
 | ||
| 		{
 | ||
| 			buildSetToSearchPanelTitle();
 | ||
| 		}
 | ||
| 
 | ||
| 		private void buildSetToSearchPanelTitle()
 | ||
| 		{
 | ||
| 			// B2023-112: lstCheckedDocVersions has list of sets, if 'all' it is empty.  However, in order to get proc set tree to handle appropriate selections
 | ||
| 			//	and work with this list, check both the list count and the whether the 'all' is checked.
 | ||
| 			if (lstCheckedDocVersions.Count == 0 && advTreeProcSets.Nodes != null && (advTreeProcSets.Nodes.Count <=1 || (advTreeProcSets.Nodes.Count > 1 && advTreeProcSets.Nodes[0].Nodes != null)) && (advTreeProcSets.Nodes[0].Nodes.Count == 0 || (advTreeProcSets.Nodes[0].Nodes.Count > 0 && !advTreeProcSets.Nodes[0].Nodes[0].Checked)))
 | ||
| 			{
 | ||
| 				xpSetToSearch.TitleText = string.Format("No Procedure Sets Selected");
 | ||
| 				xpSetToSearch.TitleStyle.BackColor1.Color = Color.PapayaWhip;
 | ||
| 				btnSearch.Enabled = false;
 | ||
| 				tabSearchTypes.Enabled = false; // disable all the search tabs
 | ||
| 			}
 | ||
| 			else if (lstCheckedDocVersions.Count == 0)
 | ||
| 			{
 | ||
| 				xpSetToSearch.TitleText = string.Format("All Procedure Sets Selected");
 | ||
| 				xpSetToSearch.TitleStyle.BackColor1.Color = Color.PapayaWhip;
 | ||
| 				btnSearch.Enabled = true;
 | ||
| 				tabSearchTypes.Enabled = true; // enable all the search tabs
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				// display the number of selected procedure sets whether panel is expanded or not
 | ||
| 				xpSetToSearch.TitleText = string.Format("{0} Procedure Sets Selected", lstCheckedDocVersions.Count);
 | ||
| 				xpSetToSearch.TitleStyle.BackColor1.Color = Color.PapayaWhip;
 | ||
| 				btnSearch.Enabled = true;
 | ||
| 				tabSearchTypes.Enabled = true; // enable all the search tabs
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void advTreeProcSets_AfterNodeSelect(object sender, AdvTreeNodeEventArgs e)
 | ||
| 		{
 | ||
| 			DevComponents.AdvTree.Node n = advTreeProcSets.SelectedNode;
 | ||
| 
 | ||
| 			if (advTreeStepTypes.Nodes.Count == 1 && n.Checked)
 | ||
| 			{
 | ||
| 				if (n.Tag is DocVersionInfo) // Only set MyDocVersion if it is a DocVersion
 | ||
| 				{
 | ||
| 					Mydocversion = (DocVersionInfo)n.Tag;
 | ||
| 					StartAdvTreeStepTypesFillIn();// B2016-258 Hang after selecting a procedure if the Step Type panel is open on the search panel
 | ||
| 				}
 | ||
| 			}
 | ||
| 			// B2023-112:  If unchecking a procedure set, uncheck the 'All' node also
 | ||
| 			if (n.Checked)
 | ||
| 				advTreeProcSets.Nodes[0].Nodes[0].Checked = false;
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (StepTypeSelection)
 | ||
| 
 | ||
| 		private void advTreeStepTypes_AfterCheck(object sender, DevComponents.AdvTree.AdvTreeCellEventArgs e)
 | ||
| 		{
 | ||
| 			xpStepTypes.TitleStyle.BackColor1.Color = saveXpStepTypeTitleColor;
 | ||
| 			DevComponents.AdvTree.Node n = advTreeStepTypes.SelectedNode;
 | ||
| 
 | ||
| 			if (n == null)
 | ||
| 				return;
 | ||
| 
 | ||
| 			StepData sd = (StepData)n.Tag;
 | ||
| 
 | ||
| 			if (n.Checked)
 | ||
| 			{
 | ||
| 				//n.Style = DevComponents.AdvTree.NodeStyles.Apple;		// B2023-112: coloring of proc set tree nodes was not working correctly
 | ||
| 
 | ||
| 				if (sd == null)
 | ||
| 				{
 | ||
| 					//C2023-010: Since the tag is null for Word Sections and HLS types, we need to determine which one has been selected.  Word sections we need
 | ||
| 					//to process, but we need to ignore adding HLS types.
 | ||
| 					if (n.Text == "WORD Sections")
 | ||
| 					{
 | ||
| 						if (!lstCheckedStepTypesStr.Contains("WORD Sections"))
 | ||
| 						{
 | ||
| 							lstCheckedStepTypes.Add(0); //use zero to identify attachment search
 | ||
| 							lstCheckedStepTypesStr.Add("WORD Sections");
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 				else
 | ||
| 				{
 | ||
| 					if (!lstCheckedStepTypesStr.Contains(advTreeStepTypes.SelectedNode.Text))
 | ||
| 					{
 | ||
| 						lstCheckedStepTypes.Add((int)sd.Index);
 | ||
| 						lstCheckedStepTypesStr.Add(advTreeStepTypes.SelectedNode.Text);
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				n.Style = null;
 | ||
| 
 | ||
| 				if (sd == null)
 | ||
| 				{
 | ||
| 					//C2023-010: Since the tag is null for Word Sections and HLS types, we need to determine which one has been selected.  Word sections we need
 | ||
| 					//to process, but we need to ignore removing HLS types since they were not added in the previous process.
 | ||
| 					if (n.Text == "WORD Sections")
 | ||
| 					{
 | ||
| 						lstCheckedStepTypesStr.Remove("WORD Sections");
 | ||
| 						lstCheckedStepTypes.Remove(0);
 | ||
| 					}
 | ||
| 				}
 | ||
| 				else
 | ||
| 				{
 | ||
| 					lstCheckedStepTypes.Remove((int)sd.Index);
 | ||
| 					lstCheckedStepTypesStr.Remove(advTreeStepTypes.SelectedNode.Text);
 | ||
| 				}
 | ||
| 
 | ||
| 				//B2025-012 Find Step Elements
 | ||
| 				//uncheck the parents if there are any
 | ||
| 				DevComponents.AdvTree.Node tmp_n = n;
 | ||
| 				while (tmp_n.Parent != null)
 | ||
| 				{
 | ||
| 					tmp_n = tmp_n.Parent;
 | ||
| 					tmp_n.Checked = false;
 | ||
| 				}
 | ||
| 				//uncheck All Types
 | ||
| 				advTreeStepTypes.Nodes[0].Checked = false;
 | ||
| 			}
 | ||
| 
 | ||
| 			//C2023-010: Check if the node has children and if we need to process those children as well
 | ||
| 			if (n.HasChildNodes)
 | ||
| 			{
 | ||
| 				foreach (Node child in n.Nodes)
 | ||
| 				{
 | ||
| 					child.Checked = n.Checked;
 | ||
| 					advTreeStepTypes.SelectedNode = child;
 | ||
| 					advTreeStepTypes_AfterCheck(sender, null);
 | ||
| 				}
 | ||
| 			}
 | ||
| 			else if (n.Text == "All Types")
 | ||
| 			{
 | ||
| 				//B2025-012 Find Step Elements
 | ||
| 				//if checking / un-checking All Types
 | ||
| 				//Add Types to type list appropriately
 | ||
| 				if (n.Checked)
 | ||
| 				{
 | ||
| 					foreach (Node child in advTreeStepTypes.Nodes)
 | ||
| 					{
 | ||
| 						if (child.Text != "All Types")
 | ||
|                         {
 | ||
| 							child.Checked = true;
 | ||
| 							advTreeStepTypes.SelectedNode = child;
 | ||
| 							advTreeStepTypes_AfterCheck(sender, null);
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 				else
 | ||
|                 {
 | ||
| 					foreach (Node child in advTreeStepTypes.Nodes)
 | ||
| 					{
 | ||
| 						if (child.Text != "All Types")
 | ||
| 						{
 | ||
| 							child.Checked = false;
 | ||
| 							advTreeStepTypes.SelectedNode = child;
 | ||
| 							advTreeStepTypes_AfterCheck(sender, null);
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 
 | ||
| 			}
 | ||
| 
 | ||
| 			buildStepTypePannelTitle();
 | ||
| 
 | ||
| 			// B2021-100: Enable/disable the RNO Only checkbox & WORD Sections tree node in Step Elements to Search.
 | ||
| 			//	The only time the RNO Only checkbox is disabled is if the only selection in Step Elements to Search is WORD Sections.
 | ||
| 			cbxRnoOnly.Enabled = true;
 | ||
| 
 | ||
| 			if (OnlyWordSectTypeSel())
 | ||
| 				cbxRnoOnly.Checked = cbxRnoOnly.Enabled = false;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void xpStepTypes_ExpandedChanged(object sender, ExpandedChangeEventArgs e)
 | ||
| 		{
 | ||
| 			buildStepTypePannelTitle();
 | ||
| 		}
 | ||
| 
 | ||
| 		private void buildStepTypePannelTitle()
 | ||
| 		{
 | ||
| 			if (lstCheckedStepTypes.Count == 0)
 | ||
| 			{
 | ||
| 				if (xpStepTypes.Expanded)
 | ||
| 				{
 | ||
| 					xpStepTypes.TitleText = "Select Step Elements To Search"; //"Select Types To Search";
 | ||
| 					advTreeStepTypes.Focus();
 | ||
| 					advTreeStepTypes.Nodes[0].SelectedCell = advTreeStepTypes.Nodes[0].Cells[0];
 | ||
| 				}
 | ||
| 				else
 | ||
| 				{
 | ||
| 					xpStepTypes.TitleText = "Click Here To Search By Step Element"; //"Click Here To Search By Types";
 | ||
| 				}
 | ||
| 
 | ||
| 				xpStepTypes.TitleStyle.BackColor1.Color = saveXpStepTypeTitleColor;
 | ||
| 			}
 | ||
| 			else //lstCheckedStepTypes.Count > 0
 | ||
| 			{
 | ||
| 				// show how many selected whether panel is expanded or not
 | ||
| 				xpStepTypes.TitleText = string.Format("{0} Step Element{1} Selected", lstCheckedStepTypes.Count, (lstCheckedStepTypes.Count > 1) ? "s" : string.Empty); // B2018-132 changed second {0} to {1}
 | ||
| 				xpStepTypes.TitleStyle.BackColor1.Color = Color.PapayaWhip;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (ContextMenu)
 | ||
| 
 | ||
| 		private void btnSym_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			DevComponents.DotNetBar.ButtonItem b = (DevComponents.DotNetBar.ButtonItem)sender;
 | ||
| 
 | ||
| 			if (cbxTextSearchAnnotation.Focused)
 | ||
| 			{
 | ||
| 				cbxTextSearchAnnotation.SelectedText = (string)b.Text;
 | ||
| 			}
 | ||
| 			else if (cbxTextSearchText.Focused)
 | ||
| 			{
 | ||
| 				cbxTextSearchText.SelectedText = (string)b.Text;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cmFndTxtInsHardSp_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			// We use \u00A0 to represent a hard space because it show in the search text field as a blank
 | ||
| 			// It will get translated to a real hard space character prior to searching
 | ||
| 			if (cbxTextSearchAnnotation.Focused)
 | ||
| 			{
 | ||
| 				cbxTextSearchAnnotation.SelectedText = "\u00A0";
 | ||
| 			}
 | ||
| 			else if (cbxTextSearchText.Focused)
 | ||
| 			{
 | ||
| 				cbxTextSearchText.SelectedText = "\u00A0";
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cmFndTxtCut_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			Clipboard.Clear();
 | ||
| 			DataObject myDO = new DataObject(DataFormats.Text, cbxTextSearchAnnotation.Focused ? cbxTextSearchAnnotation.SelectedText : cbxTextSearchText.SelectedText);
 | ||
| 			Clipboard.SetDataObject(myDO);
 | ||
| 
 | ||
| 			// Need to check which combo box activated the context menu so that we know where to take/put selected text
 | ||
| 			if (cbxTextSearchAnnotation.Focused)
 | ||
| 			{
 | ||
| 				cbxTextSearchAnnotation.SelectedText = string.Empty;
 | ||
| 			}
 | ||
| 			else if (cbxTextSearchText.Focused)
 | ||
| 			{
 | ||
| 				cbxTextSearchText.SelectedText = string.Empty;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cmFndTxtCopy_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			// Need to check which combo box activated the context menu so that we know where to take/put selected text
 | ||
| 			DataObject myDO = new DataObject(DataFormats.Text, cbxTextSearchAnnotation.Focused ? cbxTextSearchAnnotation.SelectedText : cbxTextSearchText.SelectedText);
 | ||
| 
 | ||
| 			if (cbxTextSearchText.Focused || cbxTextSearchAnnotation.Focused)
 | ||
| 			{
 | ||
| 				Clipboard.Clear();
 | ||
| 				Clipboard.SetDataObject(myDO);
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private bool OnlyWordSectTypeSel()
 | ||
| 		{
 | ||
| 			// B2021-100: Enable/disable the RNO Only checkbox & WORD Sections tree node in Step Elements to Search.
 | ||
| 			//	lstCheckedStepTypes[x] = 0 for Word sections:
 | ||
| 			if (lstCheckedStepTypes != null && lstCheckedStepTypes.Count == 1 && lstCheckedStepTypes[0] == 0)
 | ||
| 				return true;
 | ||
| 
 | ||
| 			return false;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void CbxRnoOnly_Click(object sender, System.EventArgs e)
 | ||
| 		{
 | ||
| 			// C2021-028: RNO Only search, disable Word section tree node: 
 | ||
| 			// B2021 - 100: Enable / disable the RNO Only checkbox &WORD Sections tree node in Step Elements to Search.
 | ||
| 			if (tabSearchTypes.SelectedTab == tabTranSearch) return;
 | ||
| 
 | ||
| 			// B2021-122: null reference crash if clicking RNOOnly before anything else, i.e. tree set up with types.
 | ||
| 			if (wordSectionTreeNode == null) return;
 | ||
| 
 | ||
| 			wordSectionTreeNode.Enabled = true;
 | ||
| 			if (!cbxRnoOnly.Checked)    // checked turning on
 | ||
| 			{
 | ||
| 				// Set enabling on WORD Sections tree node in Step Elements to Search. If either no items are selected in tree or
 | ||
| 				//	just WORD Section is selected, then disable the WORD Section tree node.  Otherwise, i.e. other step types are selected
 | ||
| 				//	in tree, thus they must be searched using RNO Only so need to disable anything.
 | ||
| 				wordSectionTreeNode.Enabled = !(OnlyWordSectTypeSel() || (lstCheckedStepTypes != null && lstCheckedStepTypes.Count == 0));
 | ||
| 				if (!wordSectionTreeNode.Enabled) wordSectionTreeNode.Checked = false;
 | ||
| 			}
 | ||
| 			else  // turning off - WORD Sections tree node is enabled.
 | ||
| 			{
 | ||
| 				wordSectionTreeNode.Enabled = true;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cmFndTxtPaste_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			// Need to check which combo box activated the context menu so that we know where to take/put selected text
 | ||
| 			IDataObject myDO = Clipboard.GetDataObject();
 | ||
| 
 | ||
| 			if (myDO.GetDataPresent(DataFormats.Text))
 | ||
| 			{
 | ||
| 				if (cbxTextSearchAnnotation.Focused)
 | ||
| 				{
 | ||
| 					cbxTextSearchAnnotation.SelectedText = Clipboard.GetText();
 | ||
| 				}
 | ||
| 				else if (cbxTextSearchText.Focused)
 | ||
| 				{
 | ||
| 					cbxTextSearchText.SelectedText = Clipboard.GetText();
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnCMIFindText_PopupOpen(object sender, PopupOpenEventArgs e)
 | ||
| 		{
 | ||
| 			// the context menu is available with just a mouse hover, even if the combo box does not have focus
 | ||
| 			// ... set the focus to which ever combo box initiated the context menu
 | ||
| 			if (tabAnnotationSearch.IsSelected)
 | ||
| 			{
 | ||
| 				if (!cbxTextSearchAnnotation.Focused)
 | ||
| 					cbxTextSearchAnnotation.Focus();
 | ||
| 			}
 | ||
| 			else if (tabStepTypeSearch.IsSelected)
 | ||
| 			{
 | ||
| 				if (!cbxTextSearchText.Focused)
 | ||
| 					cbxTextSearchText.Focus();
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#region (Button/UI Event Handlers)
 | ||
| 
 | ||
| 		private void buttonItem2_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (cbxTextSearchAnnotation.Focused)
 | ||
| 				cbxTextSearchAnnotation.SelectedText = "*";
 | ||
| 			else if (cbxTextSearchText.Focused)
 | ||
| 				cbxTextSearchText.SelectedText = "*";
 | ||
| 		}
 | ||
| 
 | ||
| 		private void buttonItem3_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (cbxTextSearchAnnotation.Focused)
 | ||
| 				cbxTextSearchAnnotation.SelectedText = "?";
 | ||
| 			else if (cbxTextSearchText.Focused)
 | ||
| 				cbxTextSearchText.SelectedText = "?";
 | ||
| 
 | ||
| 		}
 | ||
| 
 | ||
| 		private void buttonItem4_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (cbxTextSearchAnnotation.Focused)
 | ||
| 				cbxTextSearchAnnotation.SelectedText = "?*";
 | ||
| 			else if (cbxTextSearchText.Focused)
 | ||
| 				cbxTextSearchText.SelectedText = "?*";
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cbxBooleanTxtSrch_CheckedChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			// If the Boolean search is not working - run the following two commands in SQL:
 | ||
| 			//  use veproms
 | ||
| 			//  ALTER FULLTEXT INDEX ON Contents START FULL POPULATION
 | ||
| 			//  ALTER FULLTEXT INDEX ON Documents START FULL POPULATION
 | ||
| 			//  use master
 | ||
| 			//Boolean search uses a list of noise, or STOP, words. This list can be found
 | ||
| 			// in file: C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData\noiseenu.txt.
 | ||
| 			// Another file exists in that directory, tsenu.xml, this is a thesaurus. RHM tried
 | ||
| 			// to use around 2010, but couldn't get it to work for words like 'dg' versus 'diesel generator',
 | ||
| 			// and 'sg' versus 'steam generator'.
 | ||
| 
 | ||
| 			if (cbxBooleanTxtSrch.Checked)
 | ||
| 			{
 | ||
| 				gpSrchText.Style.BackColor = Color.Orange;
 | ||
| 				btnCMIFindText.SubItems[1].SubItems[2].Visible = false;
 | ||
| 				btnCMIFindText.SubItems[1].SubItems[3].Visible = true;
 | ||
| 				cbxCaseSensitive.Enabled = false;
 | ||
| 				cbxIncROTextSrch.Enabled = false;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				gpSrchText.Style.BackColor = Color.Yellow;
 | ||
| 				btnCMIFindText.SubItems[1].SubItems[2].Visible = true;
 | ||
| 				btnCMIFindText.SubItems[1].SubItems[3].Visible = false;
 | ||
| 				cbxCaseSensitive.Enabled = true;
 | ||
| 				cbxIncROTextSrch.Enabled = true;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void cbxBooleanAnoTxtSrch_CheckedChanged(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (cbxBooleanAnoTxtSrch.Checked)
 | ||
| 			{
 | ||
| 				gpSrchAnnoText.Style.BackColor = Color.Orange;
 | ||
| 				btnCMIFindText.SubItems[1].SubItems[2].Visible = false;
 | ||
| 				btnCMIFindText.SubItems[1].SubItems[3].Visible = true;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				gpSrchAnnoText.Style.BackColor = Color.Yellow;
 | ||
| 				btnCMIFindText.SubItems[1].SubItems[2].Visible = true;
 | ||
| 				btnCMIFindText.SubItems[1].SubItems[3].Visible = false;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnAND_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (cbxTextSearchAnnotation.Focused)
 | ||
| 				cbxTextSearchAnnotation.SelectedText = " AND ";
 | ||
| 			else if (cbxTextSearchText.Focused)
 | ||
| 				cbxTextSearchText.SelectedText = " AND ";
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnOR_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (cbxTextSearchAnnotation.Focused)
 | ||
| 				cbxTextSearchAnnotation.SelectedText = " OR ";
 | ||
| 			else if (cbxTextSearchText.Focused)
 | ||
| 				cbxTextSearchText.SelectedText = " OR ";
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnNOT_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (cbxTextSearchAnnotation.Focused)
 | ||
| 				cbxTextSearchAnnotation.SelectedText = " NOT ";
 | ||
| 			else if (cbxTextSearchText.Focused)
 | ||
| 				cbxTextSearchText.SelectedText = " NOT ";
 | ||
| 		}
 | ||
| 
 | ||
| 		private void tabAnnotationSearch_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			cbxAnnoTypes.Focus();
 | ||
| 			cbxBooleanAnoTxtSrch_CheckedChanged(sender, e);
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnClearSearchResults_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			if (tabSearchTypes.SelectedTab == tabIncTrans)  // C2020-033: Clear the Incoming Transitions list box
 | ||
| 			{
 | ||
| 				lbSrchResultsIncTrans.DataSource = null;
 | ||
| 				lbSrchResultsIncTrans.Items.Clear();
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				lbSrchResults.DataSource = null;
 | ||
| 			}
 | ||
| 
 | ||
| 			_SearchResults = null;
 | ||
| 			DisplayResults();
 | ||
| 			btnTranCvtAllToTxt.Enabled = false;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnLoadSearchResults_Click(object sender, System.EventArgs e)
 | ||
| 		{
 | ||
| 			_fromLoad = true;
 | ||
| 			_LoadingList = true;
 | ||
| 			ofdSearchResults.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\VEPROMS";
 | ||
| 
 | ||
| 			if (ofdSearchResults.ShowDialog(this) == DialogResult.OK)
 | ||
| 			{
 | ||
| 				lbSrchResults.DataSource = null;
 | ||
| 				lbSrchResults.Items.Clear();
 | ||
| 				toolTip1.SetToolTip(lbSrchResults, null);
 | ||
| 				string unitPrefix = string.Empty;
 | ||
| 				if (Mydocversion != null)
 | ||
| 					unitPrefix = Mydocversion.DocVersionConfig.Unit_ProcedureNumber;
 | ||
| 				if (unitPrefix.EndsWith("#"))
 | ||
| 					unitPrefix = unitPrefix.Replace("#", string.Empty);
 | ||
| 				Cursor = Cursors.WaitCursor;
 | ||
| 
 | ||
| 				try   // B2021-045: don't crash if xml file cannot be loaded.
 | ||
| 				{
 | ||
| 					SearchResults = ItemInfoList.GetByContentID(0);
 | ||
| 					// C2021-006: removed all file type options except xml
 | ||
| 					System.Xml.XmlDocument xd = new System.Xml.XmlDocument();
 | ||
| 					xd.Load(ofdSearchResults.FileName);
 | ||
| 					// B2020-107: Add missing attributes/nodes for loading of search results, include procsets & steptypes:
 | ||
| 					System.Xml.XmlNodeList nlp = xd.SelectNodes("search/procsets/set");
 | ||
| 					if (nlp != null)
 | ||
| 					{
 | ||
| 						DocVersionInfo tmpdvi = Mydocversion;
 | ||
| 						DocVersionInfo fromLoadFiledvi = null;
 | ||
| 						foreach (System.Xml.XmlNode nd in nlp)
 | ||
| 						{
 | ||
| 							int folderID = int.Parse(nd.Attributes.GetNamedItem("fid").InnerText);
 | ||
| 							FolderInfo fi = FolderInfo.Get(folderID);
 | ||
| 							_MyDocVersion = fi.FolderDocVersions[0];
 | ||
| 							if (fromLoadFiledvi == null) fromLoadFiledvi = _MyDocVersion;
 | ||
| 							advTreeProcSetsPreSelect();
 | ||
| 						}
 | ||
| 						foreach (System.Xml.XmlNode nd in nlp)
 | ||
| 						{
 | ||
| 							int folderID = int.Parse(nd.Attributes.GetNamedItem("fid").InnerText);
 | ||
| 							FolderInfo fi = FolderInfo.Get(folderID);
 | ||
| 							Node tnode = advTreeProcSets.FindNodeByDataKey(folderID);
 | ||
| 							if (tnode != null) tnode.Checked = true;
 | ||
| 						}
 | ||
| 						Mydocversion = tmpdvi == null ? fromLoadFiledvi : tmpdvi;
 | ||
| 					}
 | ||
| 
 | ||
| 					AdvTreeStepTypesFillIn();
 | ||
| 					System.Xml.XmlNodeList nl1 = xd.SelectNodes("search/StepType/type");
 | ||
| 
 | ||
| 					if (nl1 != null)
 | ||
| 					{
 | ||
| 						foreach (System.Xml.XmlNode nd in nl1)
 | ||
| 						{
 | ||
| 							string stptype = nd.Attributes.GetNamedItem("str").InnerText;
 | ||
| 							Node tnode = advTreeStepTypes.FindNodeByText(stptype);
 | ||
| 							if (tnode != null)
 | ||
| 							{
 | ||
| 								tnode.Checked = true;
 | ||
| 								xpStepTypes.TitleStyle.BackColor1.Color = saveXpStepTypeTitleColor;
 | ||
| 								lstCheckedStepTypesStr.Add(stptype);
 | ||
| 								StepData sd = (StepData)tnode.Tag;
 | ||
| 								lstCheckedStepTypes.Add((int)sd.Index);
 | ||
| 							}
 | ||
| 						}
 | ||
| 
 | ||
| 						string typstr = null;
 | ||
| 						foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : typstr + ", " + s;
 | ||
| 						TypesSelected = "Filtered By:  " + ((typstr != null) ? typstr : "All Step Types");
 | ||
| 						ReportTitle = "Step Element Report"; //"Proms - Search by Type: " + typstr;
 | ||
| 						TypesSelected = "Filtered By:  " + typstr;
 | ||
| 						advTreeStepTypes.RefreshItems();
 | ||
| 						buildStepTypePannelTitle();
 | ||
| 					}
 | ||
| 
 | ||
| 					cmbResultsStyle.Text = xd.SelectSingleNode("search/results/@style").InnerText;
 | ||
| 					int sti = int.Parse(xd.SelectSingleNode("search/criteria/@index").InnerText);
 | ||
| 					switch (sti)
 | ||
| 					{
 | ||
| 						case 0: //text or steptypes
 | ||
| 							{
 | ||
| 								System.Xml.XmlNode xn = xd.SelectSingleNode("search/criteria/@text");
 | ||
| 								tabSearchTypes.SelectedTab = tabStepTypeSearch;
 | ||
| 
 | ||
| 								if (xn != null) // text search
 | ||
| 								{
 | ||
| 									cbxTextSearchText.Text = xn.InnerText;
 | ||
| 									cbxCaseSensitive.Checked = bool.Parse(xd.SelectSingleNode("search/criteria/@case").InnerText);
 | ||
| 									cbxIncROTextSrch.Checked = bool.Parse(xd.SelectSingleNode("search/criteria/@ro").InnerText);
 | ||
| 									cbxByWord.Checked = bool.Parse(xd.SelectSingleNode("search/criteria/@byword").InnerText);
 | ||
| 								}
 | ||
| 								else   // B2020-107: Add in step type search
 | ||
| 								{
 | ||
| 									cbxSrchTypeUsage.Checked = true;
 | ||
| 								}
 | ||
| 
 | ||
| 								System.Xml.XmlNodeList nl = xd.SelectNodes("search/results/item");
 | ||
| 								foreach (System.Xml.XmlNode nd in nl)
 | ||
| 								{
 | ||
| 									int itemID = int.Parse(nd.Attributes.GetNamedItem("id").InnerText);
 | ||
| 									ItemInfo ii = ItemInfo.Get(itemID);
 | ||
| 									if (ii.SearchAnnotationText == null && ii.ItemAnnotations != null) ii.SearchAnnotationText = AnnotationInfo.Get(ii.ItemAnnotations[0].AnnotationID).SearchText;
 | ||
| 									SearchResults.AddItemInfo(ii);
 | ||
| 								}
 | ||
| 								lbSrchResults.DataSource = SearchResults;
 | ||
| 								DisplayResults();
 | ||
| 								break;
 | ||
| 							}
 | ||
| 
 | ||
| 						case 1: //annotation
 | ||
| 							{
 | ||
| 								cbxAnnoTypes.Text = xd.SelectSingleNode("search/criteria/@type").InnerText;
 | ||
| 								cbxTextSearchAnnotation.Text = xd.SelectSingleNode("search/criteria/@text").InnerText;
 | ||
| 								cbxCaseSensitiveAnnoText.Checked = bool.Parse(xd.SelectSingleNode("search/criteria/@case").InnerText);
 | ||
| 								tabSearchTypes.SelectedTab = tabAnnotationSearch;
 | ||
| 								cmbResultsStyle.Text = xd.SelectSingleNode("search/results/@style").InnerText;
 | ||
| 								System.Xml.XmlNodeList nl = xd.SelectNodes("search/results/item");
 | ||
| 
 | ||
| 								foreach (System.Xml.XmlNode nd in nl)
 | ||
| 								{
 | ||
| 									int itemID = int.Parse(nd.Attributes.GetNamedItem("id").InnerText);
 | ||
| 									ItemInfo ii = ItemInfo.Get(itemID);
 | ||
| 									// B2020-107: The following was needed to set the Step Path result type for annotations
 | ||
| 									if (ii.SearchAnnotationText == null && ii.ItemAnnotations != null)
 | ||
| 									{
 | ||
| 										ii.SearchAnnotationText = AnnotationInfo.Get(ii.ItemAnnotations[0].AnnotationID).SearchText;
 | ||
| 										ii.SearchAnnotationID = ii.ItemAnnotations[0].AnnotationID;
 | ||
| 									}
 | ||
| 									SearchResults.AddItemInfo(ii);
 | ||
| 								}
 | ||
| 
 | ||
| 								lbSrchResults.DataSource = SearchResults;
 | ||
| 								DisplayResults();
 | ||
| 								break;
 | ||
| 							}
 | ||
| 
 | ||
| 						case 2: //referenced object
 | ||
| 						case 3: // transitions
 | ||
| 							{
 | ||
| 								FlexibleMessageBox.Show(this, "Loading Referenced Objects and Transitions searches is under construction.", "Under Construction", MessageBoxButtons.OK);
 | ||
| 								break;
 | ||
| 							}
 | ||
| 
 | ||
| 						case 4: // Incoming transitions
 | ||
| 							{
 | ||
| 								tabSearchTypes.SelectedTab = tabIncTrans;
 | ||
| 								cmbResultsStyle.Text = xd.SelectSingleNode("search/results/@style").InnerText;
 | ||
| 								string tmpi = xd.SelectSingleNode("search/results/@toid").InnerText;
 | ||
| 								SearchIncTransII = ItemInfo.Get(Convert.ToInt32(tmpi));
 | ||
| 								System.Xml.XmlNodeList nl = xd.SelectNodes("search/results/item");
 | ||
| 								foreach (System.Xml.XmlNode nd in nl)
 | ||
| 								{
 | ||
| 									int itemID = int.Parse(nd.Attributes.GetNamedItem("id").InnerText);
 | ||
| 									ItemInfo ii = ItemInfo.Get(itemID);
 | ||
| 									if (ii.SearchAnnotationText == null && ii.ItemAnnotations != null) ii.SearchAnnotationText = AnnotationInfo.Get(ii.ItemAnnotations[0].AnnotationID).SearchText;
 | ||
| 									SearchResults.AddItemInfo(ii);
 | ||
| 								}
 | ||
| 								lbSrchResultsIncTrans.DataSource = SearchResults;
 | ||
| 								DisplayResults();
 | ||
| 								break;
 | ||
| 							}
 | ||
| 					}
 | ||
| 				}
 | ||
| 				catch (Exception ex)
 | ||
| 				{
 | ||
| 					FlexibleMessageBox.Show("An error occurred while reading the xml file.\r\n\r\nThis can happen when the file selected for the Load is not saved\r\n" +
 | ||
| 						"from a PROMS Search or if some of the steps no longer exist.", "Search Load Failed", MessageBoxButtons.OK);
 | ||
| 				}
 | ||
| 
 | ||
| 				Cursor = Cursors.Default;
 | ||
| 			}
 | ||
| 
 | ||
| 			btnTranCvtAllToTxt.Enabled = IncTransCvtAllToTextPerm();  // C2020-033: does user have access to at least one item
 | ||
| 			_LoadingList = false;
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnSaveSearchResults_Click(object sender, System.EventArgs e)
 | ||
| 		{
 | ||
| 			ICollection<ItemInfo> myList = lbSrchResults.DataSource as ICollection<ItemInfo>;
 | ||
| 
 | ||
| 			if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4])
 | ||
| 			{
 | ||
| 				myList = lbSrchResultsIncTrans.DataSource as ICollection<ItemInfo>;   // C2020-033: use Incoming transition list
 | ||
| 			}
 | ||
| 
 | ||
| 			if (tabSearchTypes.SelectedTabIndex == 2 || tabSearchTypes.SelectedTabIndex == 3)   // ROs & Transitions are not coded yet
 | ||
| 			{
 | ||
| 				FlexibleMessageBox.Show(this, "Saving Referenced Objects and Transitions searches is under construction.", "Under Construction", MessageBoxButtons.OK);
 | ||
| 				return;
 | ||
| 			}
 | ||
| 
 | ||
| 			sfdSearchResults.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\VEPROMS";
 | ||
| 
 | ||
| 			if (sfdSearchResults.ShowDialog(this) == DialogResult.OK)
 | ||
| 			{
 | ||
| 				// C2021-006: removed all file type options except xml
 | ||
| 				System.Xml.XmlDocument xd = new System.Xml.XmlDocument();
 | ||
| 				System.Xml.XmlElement xe = xd.CreateElement("search");
 | ||
| 				xd.AppendChild(xe);
 | ||
| 				xe = xd.CreateElement("criteria");
 | ||
| 				xd.DocumentElement.AppendChild(xe);
 | ||
| 				System.Xml.XmlAttribute xa = xd.CreateAttribute("index");
 | ||
| 				int sti = tabSearchTypes.SelectedTabIndex;
 | ||
| 				xa.InnerText = sti.ToString();
 | ||
| 				xe.Attributes.SetNamedItem(xa);
 | ||
| 				// B2020-107: save procedures sets & step types
 | ||
| 				// do procsets selected
 | ||
| 				System.Xml.XmlElement xp = null;
 | ||
| 				System.Xml.XmlElement xst = null;
 | ||
| 
 | ||
| 				if (sti != 4)  // C2020-033: no procsets or step types for Incoming transitions
 | ||
| 				{
 | ||
| 					if (lstCheckedDocVersions != null && lstCheckedDocVersions.Count > 0)
 | ||
| 					{
 | ||
| 						xp = xd.CreateElement("procsets");
 | ||
| 
 | ||
| 						foreach (DocVersionInfo dvi in lstCheckedDocVersions)
 | ||
| 						{
 | ||
| 							System.Xml.XmlElement xee = xd.CreateElement("set");
 | ||
| 							xa = xd.CreateAttribute("fid");
 | ||
| 							xa.InnerText = dvi.MyFolder.FolderID.ToString();
 | ||
| 							xee.Attributes.SetNamedItem(xa);
 | ||
| 							xp.AppendChild(xee);
 | ||
| 						}
 | ||
| 					}
 | ||
| 
 | ||
| 					if (lstCheckedStepTypesStr != null && lstCheckedStepTypesStr.Count > 0)
 | ||
| 					{
 | ||
| 						xst = xd.CreateElement("StepType");
 | ||
| 
 | ||
| 						foreach (string str in lstCheckedStepTypesStr)      // Limited by step types
 | ||
| 						{
 | ||
| 							System.Xml.XmlElement xee = xd.CreateElement("type");
 | ||
| 							xa = xd.CreateAttribute("str");
 | ||
| 							xa.InnerText = str;
 | ||
| 							xee.Attributes.SetNamedItem(xa);
 | ||
| 							xst.AppendChild(xee);
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 
 | ||
| 				switch (sti)
 | ||
| 				{
 | ||
| 					case 0: //text
 | ||
| 						if (!cbxSrchTypeUsage.Checked)  // text search
 | ||
| 						{
 | ||
| 							xa = xd.CreateAttribute("text");
 | ||
| 							xa.InnerText = cbxTextSearchText.Text;
 | ||
| 							xe.Attributes.SetNamedItem(xa);
 | ||
| 							xa = xd.CreateAttribute("case");
 | ||
| 							xa.InnerText = cbxCaseSensitive.Checked.ToString();
 | ||
| 							xe.Attributes.SetNamedItem(xa);
 | ||
| 							xa = xd.CreateAttribute("ro");
 | ||
| 							xa.InnerText = cbxIncROTextSrch.Checked.ToString();
 | ||
| 							xe.Attributes.SetNamedItem(xa);
 | ||
| 							xa = xd.CreateAttribute("byword");
 | ||
| 							xa.InnerText = cbxByWord.Checked.ToString();
 | ||
| 							xe.Attributes.SetNamedItem(xa);
 | ||
| 							xd.DocumentElement.AppendChild(xe);
 | ||
| 						}
 | ||
| 
 | ||
| 						if (xp != null) xd.DocumentElement.AppendChild(xp);     // want criteria as first xml node
 | ||
| 						if (xst != null) xd.DocumentElement.AppendChild(xst);   //   do procsets & steptypes after
 | ||
| 																				// do results
 | ||
| 						xe = xd.CreateElement("results");
 | ||
| 						xa = xd.CreateAttribute("style");
 | ||
| 						xa.InnerText = cmbResultsStyle.Text;
 | ||
| 						xe.Attributes.SetNamedItem(xa);
 | ||
| 
 | ||
| 						foreach (ItemInfo ii in myList)
 | ||
| 						{
 | ||
| 							System.Xml.XmlElement xee = xd.CreateElement("item");
 | ||
| 							xa = xd.CreateAttribute("id");
 | ||
| 							xa.InnerText = ii.ItemID.ToString();
 | ||
| 							xee.Attributes.SetNamedItem(xa);
 | ||
| 							xe.AppendChild(xee);
 | ||
| 						}
 | ||
| 
 | ||
| 						xd.DocumentElement.AppendChild(xe);
 | ||
| 						xd.Save(sfdSearchResults.FileName);
 | ||
| 						break;
 | ||
| 
 | ||
| 					case 1: //annotation
 | ||
| 						xa = xd.CreateAttribute("type");
 | ||
| 						xa.InnerText = cbxAnnoTypes.Text;
 | ||
| 						xe.Attributes.SetNamedItem(xa);
 | ||
| 						xa = xd.CreateAttribute("text");
 | ||
| 						xa.InnerText = cbxTextSearchAnnotation.Text;
 | ||
| 						xe.Attributes.SetNamedItem(xa);
 | ||
| 						xa = xd.CreateAttribute("case");
 | ||
| 						xa.InnerText = cbxCaseSensitiveAnnoText.Checked.ToString();
 | ||
| 						xe.Attributes.SetNamedItem(xa);
 | ||
| 						xd.DocumentElement.AppendChild(xe);
 | ||
| 						if (xp != null) xd.DocumentElement.AppendChild(xp);     // want criteria as first xml node
 | ||
| 						if (xst != null) xd.DocumentElement.AppendChild(xst);   //   do procsets & steptypes after
 | ||
| 						xe = xd.CreateElement("results");
 | ||
| 						xa = xd.CreateAttribute("style");
 | ||
| 						xa.InnerText = cmbResultsStyle.Text;
 | ||
| 						xe.Attributes.SetNamedItem(xa);
 | ||
| 
 | ||
| 						foreach (ItemInfo ii in myList)
 | ||
| 						{
 | ||
| 							System.Xml.XmlElement xee = xd.CreateElement("item");
 | ||
| 							xa = xd.CreateAttribute("id");
 | ||
| 							xa.InnerText = ii.ItemID.ToString();
 | ||
| 							xee.Attributes.SetNamedItem(xa);
 | ||
| 							xe.AppendChild(xee);
 | ||
| 						}
 | ||
| 
 | ||
| 						xd.DocumentElement.AppendChild(xe);
 | ||
| 						xd.Save(sfdSearchResults.FileName);
 | ||
| 						break;
 | ||
| 
 | ||
| 					case 2: // ro
 | ||
| 					case 3: // transitions
 | ||
| 						FlexibleMessageBox.Show(this, "Saving Search Results for this search type is under construction.", "Under Construction", MessageBoxButtons.OK);
 | ||
| 						break;
 | ||
| 
 | ||
| 					case 4: // C2020-033: Incoming Transitions
 | ||
| 						xe = xd.CreateElement("results");
 | ||
| 						xa = xd.CreateAttribute("style");
 | ||
| 						xa.InnerText = cmbResultsStyle.Text;
 | ||
| 						xe.Attributes.SetNamedItem(xa);
 | ||
| 						xa = xd.CreateAttribute("toid");
 | ||
| 						xa.InnerText = SearchIncTransII.ItemID.ToString();
 | ||
| 						xe.Attributes.SetNamedItem(xa);
 | ||
| 
 | ||
| 						foreach (ItemInfo ii in myList)
 | ||
| 						{
 | ||
| 							System.Xml.XmlElement xee = xd.CreateElement("item");
 | ||
| 							xa = xd.CreateAttribute("id");
 | ||
| 							xa.InnerText = ii.ItemID.ToString();
 | ||
| 							xee.Attributes.SetNamedItem(xa);
 | ||
| 							xe.AppendChild(xee);
 | ||
| 						}
 | ||
| 
 | ||
| 						xd.DocumentElement.AppendChild(xe);
 | ||
| 						xd.Save(sfdSearchResults.FileName);
 | ||
| 						break;
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnCopySearchResults_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			ICollection<ItemInfo> myList = lbSrchResults.DataSource as ICollection<ItemInfo>;
 | ||
| 			if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4]) myList = lbSrchResultsIncTrans.DataSource as ICollection<ItemInfo>;
 | ||
| 			StringBuilder sb = new StringBuilder();
 | ||
| 			sb.Append("\"Location\"\t\"Type\"\t\"Text\"\t\"High-Level\"\t\"Annotations\"");
 | ||
| 			List<int> ItemsProcessed = new List<int>();
 | ||
| 
 | ||
| 			foreach (ItemInfo myItem in myList)
 | ||
| 			{
 | ||
| 				if (!ItemsProcessed.Contains(myItem.ItemID))
 | ||
| 				{
 | ||
| 					ItemsProcessed.Add(myItem.ItemID);
 | ||
| 					sb.Append(string.Format("\r\n\"{0}\"\t\"{1}\"\t\"{2}\"\t\"{3}\"", myItem.ShortPath, myItem.ToolTip,
 | ||
| 						myItem.DisplayText, !myItem.IsSection && !myItem.IsHigh ? (myItem.MyHLS == null ? string.Empty : myItem.MyHLS.DisplayText) : string.Empty));
 | ||
| 					if (myItem.ItemAnnotationCount > 0)
 | ||
| 						foreach (AnnotationInfo myAnnotation in myItem.ItemAnnotations)
 | ||
| 							sb.Append(string.Format("\t\"{0}\"", myAnnotation.SearchText));
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			Clipboard.Clear();
 | ||
| 			Clipboard.SetText(sb.ToString());
 | ||
| 			FlexibleMessageBox.Show("Results Copied to Clipboard", "Copy Results", MessageBoxButtons.OK, MessageBoxIcon.Information);
 | ||
| 		}
 | ||
| 
 | ||
| 		private void btnPrnSrchRslts_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			string sortedBy = string.Empty;
 | ||
| 			if (cbSorted.Checked)
 | ||
| 				sortedBy = string.Format("Sorted By: {0}", cmbResultsStyle.Text); //C2019-013 pass in sorted by information
 | ||
| 			ICollection<ItemInfo> srchres = lbSrchResults.DataSource as ICollection<ItemInfo>;
 | ||
| 			// C2020-033: If on the Incoming Transitions tab, use that list.
 | ||
| 			if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4]) srchres = lbSrchResultsIncTrans.DataSource as ICollection<ItemInfo>;
 | ||
| 			OnPrintRequest(new DisplaySearchEventArgs(ReportTitle, TypesSelected, SearchString, srchres, sortedBy));
 | ||
| 		}
 | ||
| 
 | ||
| 		private void panSearchButtons_Resize(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			cmbResultsStyle.Left = labelX1.Right + 3;
 | ||
| 			cmbResultsStyle.Width = btnClearSearchResults.Left - cmbResultsStyle.Left - 3;
 | ||
| 		}
 | ||
| 
 | ||
| 		// C2020-033: Convert All (that have permissions) Incoming Transitions to text
 | ||
| 		private void btnTranCvtAllToTxt_Click(object sender, EventArgs e)
 | ||
| 		{
 | ||
| 			Cursor = Cursors.WaitCursor;
 | ||
| 			List<int> itmsEditable = TranCvtCheckPermission(true);      // Get list based on permissions
 | ||
| 			if (itmsEditable == null || itmsEditable.Count == 0)
 | ||
| 			{
 | ||
| 				Cursor = Cursors.Default;
 | ||
| 				return;
 | ||
| 			}
 | ||
| 			TranCvtToTxt(itmsEditable);
 | ||
| 			Cursor = Cursors.Default;
 | ||
| 			fromTranCvtBtn = true;
 | ||
| 			UpdateSearchIncTransResults();  // B2021-009: Research after convert transitions to text
 | ||
| 			fromTranCvtBtn = false;
 | ||
| 		}
 | ||
| 
 | ||
| 		// C22020-033: Use IncTransCvtAllToTextPerm to see if user has at least edit permissions to 1 in list.  This
 | ||
| 		//	is used to see if Convert All button is enabled.
 | ||
| 		private bool IncTransCvtAllToTextPerm()
 | ||
| 		{
 | ||
| 			if (_SearchResults == null) return false;
 | ||
| 			int cnt = 0;
 | ||
| 			bool allowNonAdmin = IncTranCvtPerm();
 | ||
| 			foreach (ItemInfo ii in _SearchResults)
 | ||
| 			{
 | ||
| 				if (allowNonAdmin || UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion)) return true;
 | ||
| 			}
 | ||
| 			return false;
 | ||
| 		}
 | ||
| 
 | ||
| 		#endregion
 | ||
| 
 | ||
| 		#endregion
 | ||
| 	}
 | ||
| 
 | ||
| 	#region AnnotationTypeSearch Class
 | ||
| 
 | ||
| 	// this class is used to generate the list of annotations to search.
 | ||
| 	// this also allow us to add a dummy type which is used to search for all annotations
 | ||
| 	public class AnnotationTypeSearch
 | ||
| 	{
 | ||
| 		private string _Name;
 | ||
| 		public string Name
 | ||
| 		{
 | ||
| 			get { return _Name; }
 | ||
| 			set { _Name = value; }
 | ||
| 		}
 | ||
| 		private string _ID;
 | ||
| 		public string ID
 | ||
| 		{
 | ||
| 			get { return _ID; }
 | ||
| 			set { _ID = value; }
 | ||
| 		}
 | ||
| 		public AnnotationTypeSearch(string name, string id)
 | ||
| 		{
 | ||
| 			_Name = name;
 | ||
| 			_ID = id;
 | ||
| 		}
 | ||
| 
 | ||
| 	}
 | ||
| 
 | ||
| 	#endregion
 | ||
| 
 | ||
| 	#region DisplaySearchEventArgs Class
 | ||
| 
 | ||
| 	public class DisplaySearchEventArgs
 | ||
| 	{
 | ||
| 		private string _ReportTitle;
 | ||
| 		public string ReportTitle
 | ||
| 		{
 | ||
| 			get { return _ReportTitle; }
 | ||
| 			set { _ReportTitle = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		private string _SearchString = null;
 | ||
| 		public string SearchString
 | ||
| 		{
 | ||
| 			get { return _SearchString; }
 | ||
| 			set { _SearchString = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		private string _TypesSelected;
 | ||
| 		public string TypesSelected
 | ||
| 		{
 | ||
| 			get { return _TypesSelected; }
 | ||
| 			set { _TypesSelected = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		private string _SortedBy = null;
 | ||
| 		public string SortedBy // C2019-013 pass in sorted by information to print report 
 | ||
| 		{
 | ||
| 			get { return _SortedBy; }
 | ||
| 			set { _SortedBy = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		private ICollection<ItemInfo> _MyItemInfoList;
 | ||
| 		public ICollection<ItemInfo> MyItemInfoList
 | ||
| 		{
 | ||
| 			get { return _MyItemInfoList; }
 | ||
| 			set { _MyItemInfoList = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		private TimeSpan _HowLong = TimeSpan.FromTicks(0);
 | ||
| 		public TimeSpan HowLong
 | ||
| 		{
 | ||
| 			get { return _HowLong; }
 | ||
| 			set { _HowLong = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		private string _PaperSize;
 | ||
| 		public string PaperSize // C2020-002 paper size is now set in the format files
 | ||
| 		{
 | ||
| 			get { return _PaperSize; }
 | ||
| 			set { _PaperSize = value; }
 | ||
| 		}
 | ||
| 
 | ||
| 		public DisplaySearchEventArgs(TimeSpan howLong)
 | ||
| 		{
 | ||
| 			HowLong = howLong;
 | ||
| 		}
 | ||
| 
 | ||
| 		public DisplaySearchEventArgs(string reportTitle, string typesSelected, string searchString, ICollection<ItemInfo> myItemInfoList, string sortedBy)
 | ||
| 		{
 | ||
| 			_ReportTitle = reportTitle;
 | ||
| 			_TypesSelected = typesSelected;
 | ||
| 			_MyItemInfoList = myItemInfoList;
 | ||
| 			_SearchString = searchString;
 | ||
| 			_SortedBy = sortedBy; // C2019-013 pass in sorted by information
 | ||
| 
 | ||
| 			foreach (ItemInfo tmpII in myItemInfoList)
 | ||
| 				if (tmpII != null && tmpII.ActiveFormat != null)
 | ||
| 				{
 | ||
| 					_PaperSize = tmpII.ActiveFormat.PlantFormat.FormatData.PDFPageSize.PaperSize; // C2020-002 paper size is now set in the format files
 | ||
| 					break;
 | ||
| 				}
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	#endregion
 | ||
| 
 | ||
| 	public delegate void DisplaySearchEvent(object sender, DisplaySearchEventArgs args);
 | ||
| }
 |