1480 lines
		
	
	
		
			44 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1480 lines
		
	
	
		
			44 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 System.IO;
 | 
						|
using VEPROMS.CSLA.Library;
 | 
						|
using DevComponents.DotNetBar;
 | 
						|
using DevComponents.AdvTree;
 | 
						|
using System.Text.RegularExpressions;
 | 
						|
using Volian.Base.Library;
 | 
						|
 | 
						|
 | 
						|
namespace Volian.Controls.Library
 | 
						|
{
 | 
						|
	public partial class DisplayReports : UserControl
 | 
						|
	{
 | 
						|
		#region Public Events/Handlers
 | 
						|
 | 
						|
		public event DisplayReportsEvent PrintRequest;
 | 
						|
 | 
						|
		private void OnPrintRequest(DisplayReportsEventArgs args)
 | 
						|
		{
 | 
						|
			if (PrintRequest != null)
 | 
						|
				PrintRequest(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";
 | 
						|
 | 
						|
		private List<DocVersionInfo> lstCheckedDocVersions = new List<DocVersionInfo>();
 | 
						|
		private List<object> lstCheckedROs = new List<object>();
 | 
						|
		private List<ItemInfoList> lstReportResults = new List<ItemInfoList>();
 | 
						|
		private List<string> ROList = new List<string>();
 | 
						|
		private List<object> lstROObj = new List<object>();
 | 
						|
		private int _MyRODbID;
 | 
						|
 | 
						|
		private DocVersionInfo _MyDocVersion;
 | 
						|
		private ROFSTLookup _MyROFSTLookup;
 | 
						|
		private ItemInfoList _ReportResult;
 | 
						|
		private Dictionary<string, string> AccIDROIDdic = new Dictionary<string, string>();
 | 
						|
		static int blankKeyCnt = 0;
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Properties
 | 
						|
		
 | 
						|
		private string DocVersionList
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				// append list of document versions to search
 | 
						|
				if (lstCheckedDocVersions.Count > 0)
 | 
						|
				{
 | 
						|
					string strRtnStr = "";
 | 
						|
					// get list of doc versions to search
 | 
						|
					foreach (DocVersionInfo dvi in lstCheckedDocVersions)
 | 
						|
					{
 | 
						|
						strRtnStr += string.Format(",{0}", dvi.VersionID.ToString());
 | 
						|
					}
 | 
						|
					return strRtnStr.Substring(1);
 | 
						|
				}
 | 
						|
				return "";
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		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 reproducable..
 | 
						|
						// 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;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		
 | 
						|
		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
 | 
						|
				//if (!Visible) return;		// don't reset anything if the form is invisible.
 | 
						|
				_MyROFSTLookup = value;			// define the tree nodes based on this rofst
 | 
						|
				advTreeROFillIn(true);
 | 
						|
				//LoadROComboTree();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public ItemInfoList ReportResult
 | 
						|
		{
 | 
						|
			get { return _ReportResult; }
 | 
						|
			set
 | 
						|
			{
 | 
						|
				_ReportResult = value;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Constructors
 | 
						|
 | 
						|
		public DisplayReports()
 | 
						|
		{
 | 
						|
			InitializeComponent();
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
 | 
						|
			cmbxROUsageSort.SelectedIndex = 0;
 | 
						|
			tabTransitionReports.Visible = false;
 | 
						|
			cbxComplete.Enabled = true;
 | 
						|
			cbxSummary.Enabled = true;
 | 
						|
 | 
						|
			if (cbxROUsage.Checked)
 | 
						|
				cbxIncldMissingROs.Text = "Include Missing ROs (red ? in the editor)";
 | 
						|
			else if (cbxComplete.Checked)
 | 
						|
				cbxIncldMissingROs.Text = "Include Empty RO Fields";
 | 
						|
 | 
						|
			cbxIncldMissingROs.Checked = false;// !cbxSummary.Checked;
 | 
						|
			cbxIncldMissingROs.Visible = cbxROUsage.Checked || cbxComplete.Checked;
 | 
						|
			cbxSortBySetpointID.Checked = false;
 | 
						|
			cbxSortBySetpointID.Visible = cbxComplete.Checked || cbxSummary.Checked;
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Public Methods
 | 
						|
		
 | 
						|
		public void SelectReferencedObjectTab()
 | 
						|
		{
 | 
						|
			tabROReports.PerformClick();
 | 
						|
		}
 | 
						|
 | 
						|
		public void advTreeROFillIn(bool blSeachTabClicked)
 | 
						|
		{
 | 
						|
			DevComponents.AdvTree.Node topnode = null;
 | 
						|
			advTreeRO.Nodes.Clear();
 | 
						|
 | 
						|
			if (_MyROFSTLookup == null) return;
 | 
						|
 | 
						|
			advTreeRO.BeforeExpand -= new AdvTreeNodeCancelEventHandler(advTreeRO_BeforeExpand);
 | 
						|
			advTreeRO.BeforeExpand += new AdvTreeNodeCancelEventHandler(advTreeRO_BeforeExpand);
 | 
						|
			advTreeRO.AfterExpand -= new AdvTreeNodeEventHandler(advTreeRO_AfterExpandorCollapse);
 | 
						|
			advTreeRO.AfterExpand += new AdvTreeNodeEventHandler(advTreeRO_AfterExpandorCollapse);
 | 
						|
			advTreeRO.AfterCollapse -= new AdvTreeNodeEventHandler(advTreeRO_AfterExpandorCollapse);
 | 
						|
			advTreeRO.AfterCollapse += new AdvTreeNodeEventHandler(advTreeRO_AfterExpandorCollapse);
 | 
						|
 | 
						|
			topnode = new DevComponents.AdvTree.Node();
 | 
						|
			topnode.Text = "All Referenced Objects";
 | 
						|
			topnode.Tag = null;
 | 
						|
			topnode.CheckBoxVisible = true;
 | 
						|
 | 
						|
			advTreeRO.Nodes.Add(topnode);
 | 
						|
 | 
						|
			ROFSTLookup.rodbi[] dbs = _MyROFSTLookup.GetRODatabaseList(true);
 | 
						|
 | 
						|
			if (dbs != null && dbs.Length > 0)
 | 
						|
			{
 | 
						|
				for (int i = 0; i < dbs.Length; i++)
 | 
						|
				{
 | 
						|
					DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node();
 | 
						|
					ROFSTLookup.rodbi db = dbs[i];
 | 
						|
 | 
						|
					tn.Text = db.dbiTitle;
 | 
						|
					tn.Tag = db;
 | 
						|
					tn.CheckBoxVisible = true;
 | 
						|
					topnode.Nodes.Add(tn);
 | 
						|
 | 
						|
					AddDummyGroup(db, tn);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public void advTreeProcSetsFillIn(bool blSeachTabClicked)
 | 
						|
		{
 | 
						|
			DevComponents.AdvTree.Node topnode = null;
 | 
						|
			int cntnd = 0;
 | 
						|
			VETreeNode vtn = VETreeNode.GetFolder(1);
 | 
						|
			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;
 | 
						|
			advTreeProcSets.Nodes.Add(topnode);
 | 
						|
			//advTreeProcSets.AfterNodeInsert += new TreeNodeCollectionEventHandler(advTreeProcSets_AfterNodeInsert);
 | 
						|
 | 
						|
 | 
						|
			foreach (FolderInfo fic in fi.SortedChildFolders)
 | 
						|
			{
 | 
						|
				DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node();
 | 
						|
				newnode.Text = fic.ToString();
 | 
						|
				newnode.Tag = fic;
 | 
						|
 | 
						|
				//int tmp;
 | 
						|
				//if (topnode == null)
 | 
						|
				//{
 | 
						|
				//    newnode.Text = "Available Procedure Sets";
 | 
						|
				//    tmp = advTreeProcSets.Nodes.Add(newnode);
 | 
						|
				//    topnode = newnode;
 | 
						|
				//}
 | 
						|
				//else
 | 
						|
				//{
 | 
						|
				//    newnode.Selectable = true;
 | 
						|
				//    newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter;
 | 
						|
				//    newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox;
 | 
						|
				//    newnode.CheckBoxThreeState = false;
 | 
						|
				//    newnode.CheckBoxVisible = true;
 | 
						|
				//    tmp = topnode.Nodes.Add(newnode);
 | 
						|
				//}
 | 
						|
				cntnd++;
 | 
						|
				if (fic.ChildFolderCount > 0 || fic.FolderDocVersionCount > 0)      // allow for '+' for tree expansion
 | 
						|
				{
 | 
						|
					DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node();
 | 
						|
					tnt.Text = DummyNodeText;
 | 
						|
					newnode.Nodes.Add(tnt);
 | 
						|
					topnode.Nodes.Add(newnode);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			// 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;
 | 
						|
			}
 | 
						|
 | 
						|
			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
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Private Methods
 | 
						|
		
 | 
						|
		private void GenerateAccIDSortedROList()
 | 
						|
		{
 | 
						|
			//Dictionary<string, string> AccIDROIDdic = new Dictionary<string, string>();
 | 
						|
			List<string> AccPgIDsList = new List<string>();
 | 
						|
			AccIDROIDdic.Clear();
 | 
						|
 | 
						|
			string rtnStr = "";
 | 
						|
			ROFSTLookup.rochild[] chld = null;
 | 
						|
			ROFSTLookup.rochild ch;
 | 
						|
			ROList.Clear();
 | 
						|
 | 
						|
			foreach (object rolkup in lstCheckedROs)
 | 
						|
			{
 | 
						|
				if (rolkup == null) // All Referenced Objects selected, return list of RO databases
 | 
						|
				{
 | 
						|
					foreach (ROFSTLookup.rodbi rodbi in _MyROFSTLookup.GetRODatabaseList(true))
 | 
						|
					{
 | 
						|
						rtnStr = _MyRODbID.ToString() + ":" + string.Format("{0}", rodbi.dbiID.ToString("X4"));
 | 
						|
 | 
						|
						if (rodbi.children != null)
 | 
						|
						{
 | 
						|
							foreach (ROFSTLookup.rochild roc in rodbi.children)
 | 
						|
							{
 | 
						|
								PutROChildrenInDictionary(_MyRODbID.ToString() + ":", roc);
 | 
						|
							}
 | 
						|
						}
 | 
						|
						else
 | 
						|
						{
 | 
						|
							ROList.Add(rtnStr);
 | 
						|
						}
 | 
						|
					}
 | 
						|
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				else if (rolkup is ROFSTLookup.rodbi)
 | 
						|
				{
 | 
						|
					ROFSTLookup.rodbi rodbi = (ROFSTLookup.rodbi)rolkup;
 | 
						|
 | 
						|
					//Try to lazy load the children - B2022-026 RO Memory Reduction code
 | 
						|
					if (rodbi.children == null || rodbi.children.Length <= 0)
 | 
						|
						rodbi.children = MyROFSTLookup.GetRoChildrenByID(rodbi.ID, rodbi.dbiID, true);
 | 
						|
 | 
						|
					if (rodbi.children != null)
 | 
						|
					{
 | 
						|
						foreach (ROFSTLookup.rochild roc in rodbi.children)
 | 
						|
						{
 | 
						|
							PutROChildrenInDictionary(_MyRODbID.ToString() + ":", roc);
 | 
						|
						}
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						ROList.Add(_MyRODbID.ToString() + ":" + string.Format("{0}", rodbi.dbiID.ToString("X4")));
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else if (rolkup is ROFSTLookup.rochild)
 | 
						|
				{
 | 
						|
					ch = (ROFSTLookup.rochild)rolkup;
 | 
						|
					chld = ch.children;
 | 
						|
 | 
						|
					//Try to lazy load the children - B2022-026 RO Memory Reduction code
 | 
						|
					if (ch.children == null || ch.children.Length <= 0)
 | 
						|
						ch.children = MyROFSTLookup.GetRoChildrenByRoid(ch.roid, true);
 | 
						|
 | 
						|
					PutROChildrenInDictionary(_MyRODbID.ToString() + ":", rolkup);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			foreach (string k in AccIDROIDdic.Keys)
 | 
						|
			{
 | 
						|
				AccPgIDsList.Add(k);
 | 
						|
			}
 | 
						|
 | 
						|
			string[] AccPgIdListArray = AccPgIDsList.ToArray();
 | 
						|
			Array.Sort(AccPgIdListArray, new AlphanumComparatorFast());
 | 
						|
 | 
						|
			foreach (string accid in AccPgIdListArray)
 | 
						|
			{
 | 
						|
				ROList.Add(AccIDROIDdic[accid]);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private string GetNextBlankKey()
 | 
						|
		{
 | 
						|
			return string.Format(" _{0}", blankKeyCnt++);
 | 
						|
		}
 | 
						|
 | 
						|
		private void PutROChildrenInDictionary(string rodbidPrefix, object roObj)
 | 
						|
		{
 | 
						|
			ROFSTLookup.rochild chld = (ROFSTLookup.rochild)roObj;
 | 
						|
			string rtnstr = rodbidPrefix;// "";
 | 
						|
			string keystr = ((chld.appid == "") ? GetNextBlankKey() : chld.appid) + chld.roid.Substring(0,4);
 | 
						|
 | 
						|
			//Try to lazy load the children - B2022-026 RO Memory Reduction
 | 
						|
			if (chld.children == null || chld.children.Length <= 0)
 | 
						|
				chld.children = MyROFSTLookup.GetRoChildrenByRoid(chld.roid, true);
 | 
						|
 | 
						|
			// If still no children - B2022-026 RO Memory Reduction code - check children length
 | 
						|
			if (chld.children == null || chld.children.Length <= 0) // get a single ROID
 | 
						|
			{
 | 
						|
				rtnstr = rodbidPrefix + string.Format("{0}", chld.roid);
 | 
						|
				if (rtnstr.Length == 12) rtnstr += "0000"; // last four digits are used for multiple return values
 | 
						|
				// B2023-094: Don't crash when trying to add another ro if it has same key.  Note that this is coming in as an RO but is really a group.  
 | 
						|
				if (!AccIDROIDdic.ContainsKey(keystr))AccIDROIDdic.Add(keystr, rtnstr);
 | 
						|
			}
 | 
						|
			else if (!cbxROUsage.Checked && chld.children[0].ParentID == 0)
 | 
						|
			{
 | 
						|
				rtnstr = rodbidPrefix + string.Format("{0},", chld.roid); // doing a RO Summary or RO Complete report - don't want children that are multiple return values
 | 
						|
				AccIDROIDdic.Add(keystr, rtnstr);
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				// spin through the child list and get the ROIDs.
 | 
						|
				// if the child has children, then call this function recursively 
 | 
						|
				for (int i = 0; i < chld.children.Length; i++)
 | 
						|
				{
 | 
						|
					ROFSTLookup.rochild roc = chld.children[i];
 | 
						|
 | 
						|
					//Try to lazy load the children - B2022-026 RO Memory Reduction code
 | 
						|
					if (roc.children == null || roc.children.Length <= 0)
 | 
						|
						roc.children = MyROFSTLookup.GetRoChildrenByRoid(roc.roid, true);
 | 
						|
 | 
						|
					// Don't get the children if we are doing a RO Summary or RO Complete report & children are the multiple return values
 | 
						|
					if (roc.children != null && roc.children.Length > 0 && (cbxROUsage.Checked || roc.children[0].ParentID != 0))
 | 
						|
					{
 | 
						|
						PutROChildrenInDictionary(rodbidPrefix, roc);
 | 
						|
					}
 | 
						|
					else if (roc.appid != null && roc.appid != "")
 | 
						|
					{
 | 
						|
						rtnstr = rodbidPrefix + string.Format("{0}", roc.roid);
 | 
						|
						keystr = ((roc.appid == "") ? GetNextBlankKey() : roc.appid) + chld.roid.Substring(0, 4);
 | 
						|
 | 
						|
						if (AccIDROIDdic.ContainsKey(keystr))  // For duplicates, append the parent title (B2017-011) so adding to dictionary doesn't crash.
 | 
						|
						{
 | 
						|
							keystr = keystr + "|" + chld.title;
 | 
						|
						}
 | 
						|
 | 
						|
						AccIDROIDdic.Add(keystr, rtnstr);
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void GenerateROList()
 | 
						|
		{
 | 
						|
			string rtnStr = "";
 | 
						|
			ROFSTLookup.rochild[] chld = null;
 | 
						|
			ROFSTLookup.rochild ch;
 | 
						|
			ROList.Clear();
 | 
						|
 | 
						|
			foreach (object rolkup in lstCheckedROs)
 | 
						|
			{
 | 
						|
				if (rolkup == null) // All Referenced Objects selected, return list of RO databases
 | 
						|
				{
 | 
						|
					// B2022-026 RO Memory Reduction code - added flag to load all children
 | 
						|
					foreach (ROFSTLookup.rodbi rodbi in _MyROFSTLookup.GetRODatabaseList(true))
 | 
						|
					{
 | 
						|
						rtnStr = _MyRODbID.ToString() + ":" + string.Format("{0}", rodbi.dbiID.ToString("X4"));
 | 
						|
						ROList.Add(rtnStr);
 | 
						|
					}
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				else if (rolkup is ROFSTLookup.rodbi)
 | 
						|
				{
 | 
						|
					rtnStr = _MyRODbID.ToString() + ":" + string.Format("{0}", ((ROFSTLookup.rodbi)rolkup).dbiID.ToString("X4"));
 | 
						|
				}
 | 
						|
				else if (rolkup is ROFSTLookup.rochild)
 | 
						|
				{
 | 
						|
					ch = (ROFSTLookup.rochild)rolkup;
 | 
						|
 | 
						|
					//Try to lazy load the children - B2022-026 RO Memory Reduction code
 | 
						|
					if (ch.children == null || ch.children.Length <= 0)
 | 
						|
						ch.children = MyROFSTLookup.GetRoChildrenByRoid(ch.roid, true);
 | 
						|
 | 
						|
					chld = ch.children;
 | 
						|
 | 
						|
					rtnStr = _MyRODbID.ToString() + ":" + GetROChildren(rolkup).TrimEnd(','); // GetROChildren(rolkup).TrimEnd(',') grabs the children of the selected item
 | 
						|
				}
 | 
						|
				
 | 
						|
				ROList.Add(rtnStr);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// same function as GetROsToSearch in DisplaySearch.cs
 | 
						|
		private string GetROChildren(object roObj)
 | 
						|
		{
 | 
						|
			ROFSTLookup.rochild chld = (ROFSTLookup.rochild)roObj;
 | 
						|
			string rtnstr = "";
 | 
						|
 | 
						|
			//Try to lazy load the children - B2022-026 RO Memory Reduction code
 | 
						|
			if (chld.children == null || chld.children.Length <= 0)
 | 
						|
				chld.children = MyROFSTLookup.GetRoChildrenByRoid(chld.roid, true);
 | 
						|
 | 
						|
			// If still no children
 | 
						|
			if (chld.children == null || chld.children.Length <= 0) // get a single ROID
 | 
						|
			{
 | 
						|
				rtnstr += string.Format("{0}", chld.roid);
 | 
						|
				if (rtnstr.Length == 12) rtnstr += "0000"; // last four digits are used for multiple return values
 | 
						|
			}
 | 
						|
			else if (!cbxROUsage.Checked && chld.children[0].ParentID == 0)
 | 
						|
			{
 | 
						|
				rtnstr += string.Format("{0},", chld.roid); // doing a RO Summary or RO Complete report - don't want children that are multiple return values
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{ // spin through the child list and get the ROIDs.
 | 
						|
				// if the child has children, then call this function recursivly 
 | 
						|
				foreach (ROFSTLookup.rochild roc in chld.children)
 | 
						|
				{
 | 
						|
					// Don't get the children if we are doing a RO Summary or RO Complete report & children are the multiple return values
 | 
						|
					// B2022-062: Proms crashes on Complete or Summary RO report without 'Sort by SetpointID'.  With new ROfst logic,
 | 
						|
					//	need to check for children length > 0 also.
 | 
						|
					if (roc.children != null &&  roc.children.Length > 0 && (cbxROUsage.Checked || roc.children[0].ParentID != 0))
 | 
						|
						rtnstr += GetROChildren(roc);
 | 
						|
					else
 | 
						|
						rtnstr += string.Format("{0},", roc.roid);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return rtnstr;
 | 
						|
		}
 | 
						|
 | 
						|
		private string GetListOfROs(bool keepRODbID)
 | 
						|
		{
 | 
						|
			string rtnStr = "";
 | 
						|
			string strRODbID = "";
 | 
						|
			int cnt = 0;
 | 
						|
			foreach (string rostr in ROList)
 | 
						|
			{
 | 
						|
				int ndxOf = rostr.IndexOf(":");
 | 
						|
				if (ndxOf > 0)
 | 
						|
				{
 | 
						|
					string tstr = rostr.Substring(0, ndxOf + 1);
 | 
						|
					if (tstr != strRODbID && keepRODbID)
 | 
						|
					{
 | 
						|
						strRODbID = tstr;
 | 
						|
						rtnStr += rostr;
 | 
						|
					}
 | 
						|
					else
 | 
						|
						rtnStr += rostr.Substring(ndxOf + 1);
 | 
						|
				}
 | 
						|
				else
 | 
						|
					rtnStr += rostr;
 | 
						|
				if (rtnStr.EndsWith(",")) rtnStr = rtnStr.Substring(0, rtnStr.Length - 1);
 | 
						|
				if (++cnt < ROList.Count)
 | 
						|
					rtnStr += ",";
 | 
						|
			}
 | 
						|
			return rtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		private void AddSelectedROChildren(DevComponents.AdvTree.NodeCollection chldrn)
 | 
						|
		{
 | 
						|
			if (chldrn.Count > 0)
 | 
						|
			{
 | 
						|
				foreach (DevComponents.AdvTree.Node n in chldrn)
 | 
						|
				{
 | 
						|
					if (n.Checked)
 | 
						|
						lstCheckedROs.Add(n.Tag);
 | 
						|
					else
 | 
						|
						AddSelectedROChildren(n.Nodes);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void BuildCheckedROsList()
 | 
						|
		{
 | 
						|
			lstCheckedROs.Clear();
 | 
						|
			if (advTreeRO.Nodes.Count == 0) return;
 | 
						|
 | 
						|
			DevComponents.AdvTree.Node node = advTreeRO.Nodes[0];
 | 
						|
			if (node.Checked) // top node (all Referenced Objects) selected
 | 
						|
				lstCheckedROs.Add(node.Tag);
 | 
						|
			else
 | 
						|
				AddSelectedROChildren(node.Nodes);
 | 
						|
		}
 | 
						|
 | 
						|
		private void EnableOrDisablePrintButton()
 | 
						|
		{
 | 
						|
			switch (tctrlReports.SelectedTabIndex)
 | 
						|
			{
 | 
						|
				case 0: // Transition Reports
 | 
						|
					btnPrintReport.Enabled = (lstCheckedDocVersions.Count > 0);
 | 
						|
					break;
 | 
						|
 | 
						|
				case 1: // Referenced Objects Reports
 | 
						|
					BuildCheckedROsList();  // this list is sent to the report generator
 | 
						|
					if (cbxROUsage.Checked)
 | 
						|
						btnPrintReport.Enabled = (lstCheckedDocVersions.Count > 0 && lstCheckedROs.Count > 0);
 | 
						|
					else
 | 
						|
						btnPrintReport.Enabled = ((cbxComplete.Checked || cbxSummary.Checked) && lstCheckedROs.Count > 0);
 | 
						|
					break;
 | 
						|
			}
 | 
						|
 | 
						|
			if (cbxROUsage.Checked)
 | 
						|
				cbxIncldMissingROs.Text = "Include Missing ROs (red ? in the editor)";
 | 
						|
			else if (cbxComplete.Checked)
 | 
						|
				cbxIncldMissingROs.Text = "Include Empty RO Fields";
 | 
						|
 | 
						|
			//cbxIncldMissingROs.Checked = cbxROUsage.Checked || cbxComplete.Checked;
 | 
						|
			cbxIncldMissingROs.Visible = cbxROUsage.Checked || cbxComplete.Checked;
 | 
						|
			cbxSortBySetpointID.Visible = cbxComplete.Checked || cbxSummary.Checked;
 | 
						|
			labelX1.Visible = cmbxROUsageSort.Visible = !cbxSortBySetpointID.Visible;
 | 
						|
		}
 | 
						|
 | 
						|
		private void tabTransitionReports_Click(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			xpSetToReport.Enabled = true;
 | 
						|
			xpSetToReport.Expanded = true;
 | 
						|
			xpSelROs.Expanded = false;
 | 
						|
			xpSelROs.Enabled = false;
 | 
						|
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
		}
 | 
						|
 | 
						|
		private void tabROReports_Click(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			xpSetToReport.Enabled = cbxROUsage.Checked;
 | 
						|
			xpSetToReport.Expanded = cbxROUsage.Checked;
 | 
						|
			labelX1.Visible = cmbxROUsageSort.Visible = cbxROUsage.Checked;
 | 
						|
			xpSelROs.Enabled = true;
 | 
						|
			xpSelROs.Expanded = true;
 | 
						|
			cbxIncldMissingROs.Checked = false;// !cbxSummary.Checked;
 | 
						|
			cbxSortBySetpointID.Checked = false;
 | 
						|
			cbxSortBySetpointID.Visible = !cbxROUsage.Checked;
 | 
						|
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
		}
 | 
						|
 | 
						|
		private void cbxROUsage_CheckedChanged(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			xpSetToReport.Enabled = cbxROUsage.Checked;
 | 
						|
			xpSetToReport.Expanded = cbxROUsage.Checked;
 | 
						|
			labelX1.Visible = cmbxROUsageSort.Visible = cbxROUsage.Checked;
 | 
						|
 | 
						|
			// reset the RO tree and clear anything that was selected
 | 
						|
			advTreeROFillIn(true);
 | 
						|
			lstCheckedROs.Clear();
 | 
						|
 | 
						|
			cbxIncldMissingROs.Checked = false;// !cbxSummary.Checked;
 | 
						|
			cbxSortBySetpointID.Checked = false;
 | 
						|
			cbxSortBySetpointID.Visible = !cbxROUsage.Checked;
 | 
						|
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
		}
 | 
						|
 | 
						|
		private void DisplayReports_Load(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			tabTransitionReports.PerformClick();
 | 
						|
		}
 | 
						|
 | 
						|
		// when a node is checked (selected) then uncheck any of its children
 | 
						|
		private void UncheckChildren(DevComponents.AdvTree.NodeCollection chldrn)
 | 
						|
		{
 | 
						|
			if (chldrn.Count > 0)
 | 
						|
			{
 | 
						|
				foreach (DevComponents.AdvTree.Node n in chldrn)
 | 
						|
				{
 | 
						|
					if (n.Checked)
 | 
						|
						n.Checked = false;
 | 
						|
					else
 | 
						|
						UncheckChildren(n.Nodes);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// when a node is checked (selected), uncheck the parents, grand parents, great grand parents, etc.
 | 
						|
		private void UncheckParents(DevComponents.AdvTree.Node pNode)
 | 
						|
		{
 | 
						|
			while (pNode != null)
 | 
						|
			{
 | 
						|
				if (pNode.Checked) pNode.Checked = false;
 | 
						|
				pNode = pNode.Parent;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void advTreeRO_AfterCheck(object sender, AdvTreeCellEventArgs e)
 | 
						|
		{
 | 
						|
			DevComponents.AdvTree.Node n = advTreeRO.SelectedNode;
 | 
						|
 | 
						|
			if (n.Checked)
 | 
						|
			{
 | 
						|
				UncheckChildren(n.Nodes);
 | 
						|
				UncheckParents(n.Parent);
 | 
						|
			}
 | 
						|
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
		}
 | 
						|
 | 
						|
		private void cbxTransToProcs_CheckedChanged(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
		}
 | 
						|
 | 
						|
		private void cbxTransFromProcs_CheckedChanged(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
		}
 | 
						|
 | 
						|
		private void cbxComplete_CheckedChanged(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			cbxIncldMissingROs.Checked = false;// !cbxSummary.Checked;
 | 
						|
			cbxSortBySetpointID.Checked = false;
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
		}
 | 
						|
 | 
						|
		private void cbxSummary_CheckedChanged(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
		}
 | 
						|
 | 
						|
		private string BuildRODataFile(string ROList)
 | 
						|
		{
 | 
						|
			DocVersionInfo MyDVI = Mydocversion;
 | 
						|
			string roDataFile = "PRINT.TMP";
 | 
						|
 | 
						|
			if (VlnSettings.ReleaseMode.Equals("DEMO"))
 | 
						|
			{
 | 
						|
				MessageBox.Show("Referenced Object Reports not available in the Demo version.", "PROMS Demo Version");
 | 
						|
				return "";
 | 
						|
			}
 | 
						|
 | 
						|
			//string roapp = Environment.GetEnvironmentVariable("roapp");
 | 
						|
			string roapp = Volian.Base.Library.ExeInfo.GetROEditorPath(); // get the path to the RO Editor Executable
 | 
						|
			if (roapp == null)
 | 
						|
			{
 | 
						|
				MessageBox.Show("Could not find path to Ro Editor, check 'roapp' environment variable");
 | 
						|
				return "";
 | 
						|
			}
 | 
						|
 | 
						|
			if (MyDVI == null || MyDVI.DocVersionAssociationCount < 1)
 | 
						|
			{
 | 
						|
				MessageBox.Show("Could not find associated path for ro data.", "No RO Data", MessageBoxButtons.OK, MessageBoxIcon.Information);
 | 
						|
				return "";
 | 
						|
			}
 | 
						|
 | 
						|
			//string roloc = "\"" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.FolderPath + "\" " + "\"" + ROList + "\"";
 | 
						|
			if (!Directory.Exists(MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.FolderPath))
 | 
						|
			{
 | 
						|
				MessageBox.Show(string.Format("RO Database directory does not exist: {0}", MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.FolderPath));
 | 
						|
				return "";
 | 
						|
			}
 | 
						|
 | 
						|
			string cmpRptExePath = roapp.Substring(0, roapp.LastIndexOf("\\")) + "\\CmpRpt.exe ";
 | 
						|
			roDataFile = MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.FolderPath + "\\" + roDataFile;
 | 
						|
 | 
						|
			try
 | 
						|
			{
 | 
						|
				if (File.Exists(roDataFile)) File.Delete(roDataFile);
 | 
						|
				Application.DoEvents();
 | 
						|
 | 
						|
				string fname = VlnSettings.TemporaryFolder + "\\ROCompleteRprt.txt";
 | 
						|
				FileInfo fi = new FileInfo(fname);
 | 
						|
				using (StreamWriter sw = fi.CreateText())
 | 
						|
				{
 | 
						|
					sw.Write(ROList);
 | 
						|
					sw.Close();
 | 
						|
				}
 | 
						|
 | 
						|
				string roloc = "\"" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.FolderPath + "\" \"/f=" + fname + "\"";
 | 
						|
				// C2017-003: ro data in sql server, check for sql connection string
 | 
						|
				if (MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString != "cstring") roloc = roloc + " \"/sql=" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString + "\"";
 | 
						|
 | 
						|
				// C2021-026 pass in Parent/Child information (list of the children)
 | 
						|
				// B2022-019 look at all DocVersions to find ParentChild information
 | 
						|
				//           to ensure we pass in Parent/Child even when not coming from a Parent/Child procedure set
 | 
						|
				DocVersionInfoList dvil = DocVersionInfoList.Get();
 | 
						|
				foreach (DocVersionInfo dvi in dvil)
 | 
						|
				{
 | 
						|
					DocVersionConfig dvc = dvi.DocVersionConfig as DocVersionConfig;
 | 
						|
					if (dvc != null && dvc.Unit_Name != "" && dvc.Unit_Count > 1) // B2021-089 only pass in applicability info if defined for more than one unit
 | 
						|
						roloc += " \"/PC=" + dvc.Unit_Name + "\"";
 | 
						|
					break;
 | 
						|
				}
 | 
						|
 | 
						|
				System.Diagnostics.Process p = System.Diagnostics.Process.Start(cmpRptExePath, roloc);
 | 
						|
				// need to wait, sometimes the Print.tmp file that is generated is not available
 | 
						|
				p.WaitForExit(); // without arguments, this will wait indefinitely
 | 
						|
				Application.DoEvents();
 | 
						|
			}
 | 
						|
			catch (Exception ex)
 | 
						|
			{
 | 
						|
				while (ex.InnerException != null)
 | 
						|
					ex = ex.InnerException;
 | 
						|
				string tmpmsg = ex.Message;
 | 
						|
				MessageBox.Show(tmpmsg, "RO Report Error: " + ex.GetType().Name);
 | 
						|
			}
 | 
						|
			return roDataFile;
 | 
						|
		}
 | 
						|
 | 
						|
		private void btnPrintReport_Click(object sender, EventArgs e)
 | 
						|
		{
 | 
						|
			string paperSize = "Letter";
 | 
						|
 | 
						|
			if (Mydocversion != null && Mydocversion.ActiveFormat != null)
 | 
						|
				paperSize = Mydocversion.ActiveFormat.PlantFormat.FormatData.PDFPageSize.PaperSize; // C2020-002 paper size is now set in the format files
 | 
						|
 | 
						|
			//B2019-144 Set the document text color to Red (overlay) or Black (normal)
 | 
						|
			Color lastColor = MSWordToPDF.OverrideColor;// B2019-144 Remember override color
 | 
						|
			if (MSWordToPDF.OverrideColor != Color.Black)
 | 
						|
				MSWordToPDF.OverrideColor = Color.Black;
 | 
						|
 | 
						|
			Cursor curcur = Cursor;
 | 
						|
			Cursor = Cursors.WaitCursor;
 | 
						|
 | 
						|
			if (cbxSummary.Checked) // RO Summary Report
 | 
						|
			{
 | 
						|
				if (cbxSortBySetpointID.Checked)
 | 
						|
					GenerateAccIDSortedROList();
 | 
						|
				else
 | 
						|
					GenerateROList();
 | 
						|
 | 
						|
				OnPrintRequest(new DisplayReportsEventArgs("RO Summary Report", "RO Summary Report", MyROFSTLookup, ROList, paperSize));
 | 
						|
			}
 | 
						|
			else if (cbxComplete.Checked) // Complete RO Report
 | 
						|
			{
 | 
						|
				if (cbxSortBySetpointID.Checked)
 | 
						|
					GenerateAccIDSortedROList();
 | 
						|
				else
 | 
						|
					GenerateROList();
 | 
						|
 | 
						|
				string ROList = GetListOfROs(false);//don't include the RODbID in the RO list
 | 
						|
				string roDataFile = BuildRODataFile(ROList);
 | 
						|
 | 
						|
				// B2023-028: RO report generates report with error when RO path not set.  Return if datafile is not set
 | 
						|
				//	by BuildRODataFile
 | 
						|
				if (roDataFile == null || roDataFile == "")
 | 
						|
				{
 | 
						|
					Cursor = curcur;		// B2023-094:  restore cursor (was wait).  Not part of bug, found during fix
 | 
						|
					return;
 | 
						|
				}
 | 
						|
 | 
						|
				if (Mydocversion != null)
 | 
						|
					OnPrintRequest(new DisplayReportsEventArgs("Complete RO Report", "Complete RO Report", roDataFile, MyROFSTLookup, cbxComplete.Checked, Mydocversion.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta, cbxIncldMissingROs.Checked, paperSize));
 | 
						|
			}
 | 
						|
			else if (cbxROUsage.Checked)
 | 
						|
			{
 | 
						|
				bool usageSortedByProcedure = (cmbxROUsageSort.SelectedIndex == 1);
 | 
						|
				GenerateROList();
 | 
						|
				string SearchString = GetListOfROs(true);// Include the RODbID in the RO list
 | 
						|
				ItemInfoList SearchResults = ItemInfoList.GetListFromROReport(DocVersionList, "", SearchString, "");
 | 
						|
 | 
						|
				List<ItemInfo> sortedResults = SearchResults.SortedList(!usageSortedByProcedure);
 | 
						|
				OnPrintRequest(new DisplayReportsEventArgs("Referenced Objects Usage By RO", "RO Usage", sortedResults, usageSortedByProcedure, cbxIncldMissingROs.Checked, paperSize));
 | 
						|
			}
 | 
						|
			else if (cbxTransFromProcs.Checked)
 | 
						|
			{
 | 
						|
			}
 | 
						|
			else if (cbxTransToProcs.Checked)
 | 
						|
			{
 | 
						|
			}
 | 
						|
 | 
						|
			Cursor = curcur;
 | 
						|
			//B2019-144 Set the document text color to Red (overlay) or Black (normal)
 | 
						|
			if (MSWordToPDF.OverrideColor != lastColor)// B2019-144 Restore override color
 | 
						|
				MSWordToPDF.OverrideColor = lastColor;
 | 
						|
		}
 | 
						|
 | 
						|
		#region (Procedure List)
 | 
						|
 | 
						|
		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;
 | 
						|
			newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter;
 | 
						|
			newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox;
 | 
						|
			newnode.CheckBoxThreeState = false;
 | 
						|
			newnode.CheckBoxVisible = chxbxvisable;
 | 
						|
			return newnode;
 | 
						|
		}
 | 
						|
 | 
						|
		private 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;
 | 
						|
						par.Nodes.Add(newnode);
 | 
						|
						if (fic.HasChildren)		// allow for '+' for tree expansion
 | 
						|
						{
 | 
						|
							DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node();
 | 
						|
							tnt.Text = DummyNodeText;
 | 
						|
							newnode.Nodes.Add(tnt);
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else if (fi.FolderDocVersionCount > 0)
 | 
						|
				{
 | 
						|
					foreach (DocVersionInfo dv in fi.FolderDocVersions)
 | 
						|
					{
 | 
						|
						DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node();
 | 
						|
						newnode.Text = dv.ToString();
 | 
						|
						newnode.Tag = dv;
 | 
						|
						newnode.Selectable = true;
 | 
						|
						newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter;
 | 
						|
						newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox;
 | 
						|
						newnode.CheckBoxThreeState = false;
 | 
						|
						newnode.CheckBoxVisible = true;
 | 
						|
						par.Nodes.Add(newnode);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void advTreeProcSets_AfterCheck(object sender, DevComponents.AdvTree.AdvTreeCellEventArgs e)
 | 
						|
		{
 | 
						|
			DevComponents.AdvTree.Node n = advTreeProcSets.SelectedNode;
 | 
						|
			if (n.Checked)
 | 
						|
			{
 | 
						|
				n.Style = DevComponents.AdvTree.NodeStyles.Apple;
 | 
						|
				lstCheckedDocVersions.Add((DocVersionInfo)n.Tag);
 | 
						|
				if (lstCheckedDocVersions.Count == 1)//Mydocversion == null)
 | 
						|
				{
 | 
						|
					Mydocversion = (DocVersionInfo)n.Tag;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				n.Style = null;
 | 
						|
				lstCheckedDocVersions.Remove((DocVersionInfo)n.Tag);
 | 
						|
				if (lstCheckedDocVersions.Count == 1)
 | 
						|
				{
 | 
						|
					if (Mydocversion != lstCheckedDocVersions[0])
 | 
						|
					{
 | 
						|
						Mydocversion = lstCheckedDocVersions[0];
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					if (lstCheckedDocVersions.Count == 0)
 | 
						|
						Mydocversion = null;
 | 
						|
					// do this if either none, or more than one procedure set selected
 | 
						|
					//advTreeStepTypes.Nodes.Clear();
 | 
						|
					//lstCheckedStepTypes.Clear();
 | 
						|
					//lstCheckedStepTypesStr.Clear();
 | 
						|
					//Node newnode = new DevComponents.AdvTree.Node();
 | 
						|
					//newnode.Text = "....select a procedure set for types to appear...";
 | 
						|
					//advTreeStepTypes.Nodes.Add(newnode);
 | 
						|
					//buildStepTypePannelTitle();
 | 
						|
				}
 | 
						|
			}
 | 
						|
			//// Enable the RO combo list only if at least one procedure set node
 | 
						|
			//// is selected
 | 
						|
			//cmboTreeROs.Enabled = (lstCheckedDocVersions.Count > 0);
 | 
						|
			//gpFindROs.Enabled = cmboTreeROs.Enabled;
 | 
						|
 | 
						|
			//SetupContextMenu();
 | 
						|
 | 
						|
			//buildSetToSearchPanelTitle();
 | 
						|
			EnableOrDisablePrintButton();
 | 
						|
		}
 | 
						|
 | 
						|
		private void advTreeProcSets_AfterNodeSelect(object sender, AdvTreeNodeEventArgs e)
 | 
						|
		{
 | 
						|
			DevComponents.AdvTree.Node n = advTreeProcSets.SelectedNode;
 | 
						|
		}
 | 
						|
 | 
						|
		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"
 | 
						|
			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;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		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;
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region (RO Tree)
 | 
						|
 | 
						|
		private void AddDummyGroup(ROFSTLookup.rodbi rodbi, DevComponents.AdvTree.Node tn)
 | 
						|
		{
 | 
						|
			if (rodbi.children != null && rodbi.children.Length > 0)
 | 
						|
			{
 | 
						|
				DevComponents.AdvTree.Node tmp = new DevComponents.AdvTree.Node();
 | 
						|
				tmp.Text = DummyNodeText;
 | 
						|
				tn.Nodes.Add(tmp);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void advTreeRO_BeforeExpand(object sender, DevComponents.AdvTree.AdvTreeNodeCancelEventArgs e)
 | 
						|
		{
 | 
						|
			LoadChildren(e.Node);
 | 
						|
		}
 | 
						|
 | 
						|
		private void LoadChildren(DevComponents.AdvTree.Node tn)
 | 
						|
		{
 | 
						|
			//Check if node has already been loaded
 | 
						|
			if (tn.HasChildNodes && tn.Nodes[0].Text != DummyNodeText) return;  // already loaded.
 | 
						|
			if (tn.HasChildNodes && tn.Nodes[0].Text == DummyNodeText) tn.Nodes[0].Remove();
 | 
						|
 | 
						|
			object tag = tn.Tag;
 | 
						|
			ROFSTLookup.rochild[] chld = null;
 | 
						|
 | 
						|
			if (tn.Tag is ROFSTLookup.rodbi)
 | 
						|
			{
 | 
						|
				ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag;
 | 
						|
 | 
						|
				//Try to lazy load the children - B2022-026 RO Memory Reduction code
 | 
						|
				if (db.children == null || db.children.Length <= 0)
 | 
						|
					db.children = MyROFSTLookup.GetRoChildrenByID(db.ID, db.dbiID, true);
 | 
						|
 | 
						|
				chld = db.children;
 | 
						|
			}
 | 
						|
			else if (tn.Tag is ROFSTLookup.rochild)
 | 
						|
			{
 | 
						|
				ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag;
 | 
						|
 | 
						|
				//Try to lazy load the children - B2022-026 RO Memory Reduction code
 | 
						|
				if (ch.children == null || ch.children.Length <= 0)
 | 
						|
					ch.children = MyROFSTLookup.GetRoChildrenByRoid(ch.roid, true);
 | 
						|
 | 
						|
				chld = ch.children;
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				Console.WriteLine("error - no type");
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			// if children, add dummy node
 | 
						|
			// B2022-026 RO Memory Reduction code - check child 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;
 | 
						|
 | 
						|
					// Try to Lazy Load children - B2022-026 RO Memory Reduction code
 | 
						|
					if (chld[i].children == null || chld[i].children.Length <= 0)
 | 
						|
						chld[i].children = MyROFSTLookup.GetRoChildrenByRoid(chld[i].roid, true);
 | 
						|
 | 
						|
					// if this is a group, i.e. type 0, add a dummy node
 | 
						|
					if (chld[i].type == 0 && chld[i].children == null)
 | 
						|
					{
 | 
						|
						// Ignore: Junk Scenario
 | 
						|
						continue;
 | 
						|
					}
 | 
						|
					// B2023-094: don't crash if chld[i].children count is 0, signals an empty group
 | 
						|
					else if (chld[i].value == null && (cbxROUsage.Checked || (chld[i].children != null && chld[i].children.Length > 0 && chld[i].children[0].ParentID != 0)))
 | 
						|
					{
 | 
						|
						tmp = new DevComponents.AdvTree.Node();
 | 
						|
						tmp.Text = chld[i].title;
 | 
						|
						tmp.Tag = chld[i];
 | 
						|
						tmp.CheckBoxVisible = true;
 | 
						|
						int index = FindIndex(tn.Nodes, tmp.Text);
 | 
						|
						tn.Nodes.Insert(index, tmp);
 | 
						|
						DevComponents.AdvTree.Node sub = new DevComponents.AdvTree.Node();
 | 
						|
						sub.Text = DummyNodeText;
 | 
						|
						tmp.Nodes.Add(sub);
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						tmp = new DevComponents.AdvTree.Node();
 | 
						|
						tmp.Text = chld[i].title;
 | 
						|
						tmp.Tag = chld[i];
 | 
						|
						tmp.CheckBoxVisible = true;
 | 
						|
						int index = FindIndex(tn.Nodes, tmp.Text);
 | 
						|
						tn.Nodes.Insert(index, tmp);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void advTreeRO_AfterExpandorCollapse(object sender, AdvTreeNodeEventArgs e)
 | 
						|
		{
 | 
						|
			Node bottomNode = BottomTreeNode(advTreeRO.Nodes);
 | 
						|
			Node lastNode = advTreeRO.Nodes[advTreeRO.Nodes.Count - 1];
 | 
						|
 | 
						|
			int top = advTreeRO.Nodes[0].Bounds.Top;
 | 
						|
			int bottom = bottomNode.Bounds.Bottom + 5;
 | 
						|
			int hScrollBarHeight = advTreeRO.HScrollBar != null ? advTreeRO.HScrollBar.Height : 0;
 | 
						|
			bottom = bottomNode.Bounds.Bottom + 5;
 | 
						|
			advTreeRO.Size = new Size(advTreeRO.Size.Width, Math.Min(525, bottom - top + hScrollBarHeight));
 | 
						|
 | 
						|
			if (advTreeRO.VScrollBar != null && bottom < advTreeRO.Size.Height)
 | 
						|
			{
 | 
						|
				int yLookFor = (bottom - advTreeRO.Size.Height) + 2 * hScrollBarHeight;
 | 
						|
				Node topNode = FindTreeNodeAt(advTreeRO.Nodes, yLookFor);
 | 
						|
 | 
						|
				if (topNode != null)
 | 
						|
					topNode.EnsureVisible();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		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 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);
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#endregion
 | 
						|
	}
 | 
						|
 | 
						|
	#region DisplayReportsEventArgs Class
 | 
						|
 | 
						|
	public class DisplayReportsEventArgs
 | 
						|
	{
 | 
						|
		#region Fields
 | 
						|
 | 
						|
		private string _ReportTitle;
 | 
						|
		private string _TypesSelected;
 | 
						|
		private ICollection<ItemInfo> _MyItemInfoList;
 | 
						|
		private bool _SortUsageByProcedure;
 | 
						|
		private string _RODataFile = "";
 | 
						|
		private bool _CompleteROReport = true;
 | 
						|
		private ROFSTLookup _rofstLookup;
 | 
						|
		private List<string> _ROListForReport;
 | 
						|
		private bool _IncludeMissingROs = true;
 | 
						|
		private bool _ConvertCaretToDelta = true;
 | 
						|
		private bool _IncludeEmptyROFields = true;
 | 
						|
		private string _PaperSize = "Letter";
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Properties
 | 
						|
 | 
						|
		public string ReportTitle
 | 
						|
		{
 | 
						|
			get { return _ReportTitle; }
 | 
						|
			set { _ReportTitle = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public string TypesSelected
 | 
						|
		{
 | 
						|
			get { return _TypesSelected; }
 | 
						|
			set { _TypesSelected = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ICollection<ItemInfo> MyItemInfoList
 | 
						|
		{
 | 
						|
			get { return _MyItemInfoList; }
 | 
						|
			set { _MyItemInfoList = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool SortUsageByProcedure
 | 
						|
		{
 | 
						|
			get { return _SortUsageByProcedure; }
 | 
						|
			set { _SortUsageByProcedure = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public string RODataFile
 | 
						|
		{
 | 
						|
			get { return _RODataFile; }
 | 
						|
			set { _RODataFile = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool CompleteROReport
 | 
						|
		{
 | 
						|
			get { return _CompleteROReport; }
 | 
						|
			set { _CompleteROReport = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ROFSTLookup RofstLookup
 | 
						|
		{
 | 
						|
			get { return _rofstLookup; }
 | 
						|
			set { _rofstLookup = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public List<string> ROListForReport
 | 
						|
		{
 | 
						|
			get { return _ROListForReport; }
 | 
						|
			set { _ROListForReport = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool IncludeMissingROs
 | 
						|
		{
 | 
						|
			get { return _IncludeMissingROs; }
 | 
						|
			set { _IncludeMissingROs = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool ConvertCaretToDelta
 | 
						|
		{
 | 
						|
			get { return _ConvertCaretToDelta; }
 | 
						|
			set { _ConvertCaretToDelta = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool IncludeEmptyROFields
 | 
						|
		{
 | 
						|
			get { return _IncludeEmptyROFields; }
 | 
						|
			set { _IncludeEmptyROFields = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public string PaperSize // C2020-002 paper size is now set in the format files
 | 
						|
		{
 | 
						|
			get { return _PaperSize; }
 | 
						|
			set { _PaperSize = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Constructors
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// RO Usage Report
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="reportTitle"></param>
 | 
						|
		/// <param name="typesSelected"></param>
 | 
						|
		/// <param name="myItemInfoList"></param>
 | 
						|
		/// <param name="sortByProcedure"></param>
 | 
						|
		/// <param name="includeMissingROs"></param>
 | 
						|
		/// <param name="paperSize"></param>
 | 
						|
		public DisplayReportsEventArgs(string reportTitle, string typesSelected, ICollection<ItemInfo> myItemInfoList, bool sortByProcedure, bool includeMissingROs, string paperSize)
 | 
						|
		{
 | 
						|
			_ReportTitle = reportTitle;
 | 
						|
			_TypesSelected = typesSelected;
 | 
						|
			_MyItemInfoList = myItemInfoList;
 | 
						|
			_SortUsageByProcedure = sortByProcedure;
 | 
						|
			_IncludeMissingROs = includeMissingROs;
 | 
						|
			_PaperSize = paperSize; // C2020-002 paper size is now set in the format files
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// RO Complete
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="reportTitle"></param>
 | 
						|
		/// <param name="typesSelected"></param>
 | 
						|
		/// <param name="roDataFile"></param>
 | 
						|
		/// <param name="rofstLookUp"></param>
 | 
						|
		/// <param name="completeROReport"></param>
 | 
						|
		/// <param name="convertCaretToDelta"></param>
 | 
						|
		/// <param name="includeEmptyROFields"></param>
 | 
						|
		/// <param name="paperSize"></param>
 | 
						|
		public DisplayReportsEventArgs(string reportTitle, string typesSelected, string roDataFile, ROFSTLookup rofstLookUp, bool completeROReport, bool convertCaretToDelta, bool includeEmptyROFields, string paperSize)
 | 
						|
		{
 | 
						|
			_ReportTitle = reportTitle;
 | 
						|
			_TypesSelected = typesSelected;
 | 
						|
			_RODataFile = roDataFile;
 | 
						|
			_CompleteROReport = completeROReport;
 | 
						|
			_ConvertCaretToDelta = convertCaretToDelta;
 | 
						|
			_rofstLookup = rofstLookUp;
 | 
						|
			_IncludeEmptyROFields = includeEmptyROFields;
 | 
						|
			_PaperSize = paperSize; // C2020-002 paper size is now set in the format files
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// RO Summary Report
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="reportTitle"></param>
 | 
						|
		/// <param name="typesSelected"></param>
 | 
						|
		/// <param name="rofstLookUp"></param>
 | 
						|
		/// <param name="roListForReport"></param>
 | 
						|
		/// <param name="paperSize"></param>
 | 
						|
		public DisplayReportsEventArgs(string reportTitle, string typesSelected, ROFSTLookup rofstLookUp, List<string> roListForReport, string paperSize)
 | 
						|
		{
 | 
						|
			_ReportTitle = reportTitle;
 | 
						|
			_TypesSelected = typesSelected;
 | 
						|
			_rofstLookup = rofstLookUp;
 | 
						|
			_ROListForReport = roListForReport;
 | 
						|
			_PaperSize = paperSize; // C2020-002 paper size is now set in the format files
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
	}
 | 
						|
 | 
						|
	#endregion
 | 
						|
 | 
						|
	public delegate void DisplayReportsEvent(object sender, DisplayReportsEventArgs args);
 | 
						|
 | 
						|
	#region AlphanumComparatorFast Class
 | 
						|
 | 
						|
	public class AlphanumComparatorFast : IComparer<string>
 | 
						|
	{
 | 
						|
		#region Public Methods
 | 
						|
		
 | 
						|
		public List<string> GetList(string s1)
 | 
						|
		{
 | 
						|
			List<string> SB1 = new List<string>();
 | 
						|
			string st1, st2, st3;
 | 
						|
			st1 = "";
 | 
						|
			bool flag = char.IsDigit(s1[0]);
 | 
						|
 | 
						|
			foreach (char c in s1)
 | 
						|
			{
 | 
						|
				if (flag != char.IsDigit(c) || !(char.IsDigit(c) || char.IsLetter(c)))// || c == '\'')
 | 
						|
				{
 | 
						|
					if (st1 != "")
 | 
						|
						SB1.Add(st1);
 | 
						|
					st1 = "";
 | 
						|
					flag = char.IsDigit(c);
 | 
						|
				}
 | 
						|
				if (char.IsDigit(c))
 | 
						|
				{
 | 
						|
					st1 += c;
 | 
						|
				}
 | 
						|
				if (char.IsLetter(c))
 | 
						|
				{
 | 
						|
					st1 += c;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			SB1.Add(st1);
 | 
						|
			return SB1;
 | 
						|
		}
 | 
						|
 | 
						|
		public int Compare(string x, string y)
 | 
						|
		{
 | 
						|
			string s1 = x;// as string;
 | 
						|
			if (s1 == null)
 | 
						|
			{
 | 
						|
				return 0;
 | 
						|
			}
 | 
						|
			string s2 = y;// as string;
 | 
						|
			if (s2 == null)
 | 
						|
			{
 | 
						|
				return 0;
 | 
						|
			}
 | 
						|
			if (s1 == s2)
 | 
						|
			{
 | 
						|
				return 0;
 | 
						|
			}
 | 
						|
			int len1 = s1.Length;
 | 
						|
			int len2 = s2.Length;
 | 
						|
			int marker1 = 0;
 | 
						|
			int marker2 = 0;
 | 
						|
 | 
						|
			// Walk through two the strings with two markers.
 | 
						|
			List<string> str1 = GetList(s1);
 | 
						|
			List<string> str2 = GetList(s2);
 | 
						|
			while (str1.Count != str2.Count)
 | 
						|
			{
 | 
						|
				if (str1.Count < str2.Count)
 | 
						|
				{
 | 
						|
					str1.Add("");
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					str2.Add("");
 | 
						|
				}
 | 
						|
			}
 | 
						|
			int x1 = 0; int res = 0; int x2 = 0; string y2 = "";
 | 
						|
			bool status = false;
 | 
						|
			string y1 = ""; bool s1Status = false; bool s2Status = false;
 | 
						|
			//s1status ==false then string ele int;
 | 
						|
			//s2status ==false then string ele int;
 | 
						|
			int result = 0;
 | 
						|
			for (int i = 0; i < str1.Count && i < str2.Count; i++)
 | 
						|
			{
 | 
						|
				status = int.TryParse(str1[i].ToString(), out res);
 | 
						|
				if (res == 0)
 | 
						|
				{
 | 
						|
					y1 = str1[i].ToString();
 | 
						|
					s1Status = false;
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					x1 = Convert.ToInt32(str1[i].ToString());
 | 
						|
					s1Status = true;
 | 
						|
				}
 | 
						|
 | 
						|
				status = int.TryParse(str2[i].ToString(), out res);
 | 
						|
				if (res == 0)
 | 
						|
				{
 | 
						|
					y2 = str2[i].ToString();
 | 
						|
					s2Status = false;
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					x2 = Convert.ToInt32(str2[i].ToString());
 | 
						|
					s2Status = true;
 | 
						|
				}
 | 
						|
				//checking --the data comparision
 | 
						|
				if (!s2Status && !s1Status)    //both are strings
 | 
						|
				{
 | 
						|
					result = str1[i].CompareTo(str2[i]);
 | 
						|
				}
 | 
						|
				else if (s2Status && s1Status) //both are intergers
 | 
						|
				{
 | 
						|
					if (x1 == x2)
 | 
						|
					{
 | 
						|
						if (str1[i].ToString().Length < str2[i].ToString().Length)
 | 
						|
						{
 | 
						|
							result = 1;
 | 
						|
						}
 | 
						|
						else if (str1[i].ToString().Length > str2[i].ToString().Length)
 | 
						|
							result = -1;
 | 
						|
						else
 | 
						|
							result = 0;
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						int st1ZeroCount = str1[i].ToString().Trim().Length - str1[i].ToString().TrimStart(new char[] { '0' }).Length;
 | 
						|
						int st2ZeroCount = str2[i].ToString().Trim().Length - str2[i].ToString().TrimStart(new char[] { '0' }).Length;
 | 
						|
						if (st1ZeroCount > st2ZeroCount)
 | 
						|
							result = -1;
 | 
						|
						else if (st1ZeroCount < st2ZeroCount)
 | 
						|
							result = 1;
 | 
						|
						else
 | 
						|
							result = x1.CompareTo(x2);
 | 
						|
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					result = str1[i].CompareTo(str2[i]);
 | 
						|
				}
 | 
						|
				if (result == 0)
 | 
						|
				{
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				else
 | 
						|
					break;
 | 
						|
 | 
						|
			}
 | 
						|
			return result;
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
	}
 | 
						|
 | 
						|
	#endregion
 | 
						|
}
 |