1261 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1261 lines
		
	
	
		
			39 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 Events
 | |
| 		public event DisplayReportsEvent PrintRequest;
 | |
| 		private void OnPrintRequest(DisplayReportsEventArgs args)
 | |
| 		{
 | |
| 			if (PrintRequest != null)
 | |
| 				PrintRequest(this, args);
 | |
| 		}
 | |
| 		#endregion
 | |
| 		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 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 "";
 | |
| 			}
 | |
| 		}
 | |
| 		private DocVersionInfo _MyDocVersion;
 | |
| 		public DocVersionInfo Mydocversion
 | |
| 		{
 | |
| 			get { return _MyDocVersion; }
 | |
| 			set
 | |
| 			{
 | |
| 				_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;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		private ROFSTLookup _MyROFSTLookup;
 | |
| 		public ROFSTLookup MyROFSTLookup
 | |
| 		{
 | |
| 			get { return _MyROFSTLookup; }
 | |
| 			set
 | |
| 			{
 | |
| 				//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();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private ItemInfoList _ReportResult;
 | |
| 		public ItemInfoList ReportResult
 | |
| 		{
 | |
| 			get { return _ReportResult; }
 | |
| 			set
 | |
| 			{
 | |
| 				_ReportResult = value;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private Dictionary<string, string> AccIDROIDdic = new Dictionary<string, string>();
 | |
| 
 | |
| 		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())
 | |
| 					{
 | |
| 						rtnStr = _MyRODbID.ToString() + ":" + string.Format("{0}", rodbi.dbiID.ToString("X4"));
 | |
| 						//ROList.Add(rtnStr);
 | |
| 						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)
 | |
| 				{
 | |
| 					//rtnStr = _MyRODbID.ToString() + ":" + string.Format("{0}", ((ROFSTLookup.rodbi)rolkup).dbiID.ToString("X4"));
 | |
| 					ROFSTLookup.rodbi rodbi = (ROFSTLookup.rodbi)rolkup;
 | |
| 					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;
 | |
| 					//rtnStr = _MyRODbID.ToString() + ":" + GetROChildren(rolkup).TrimEnd(',');
 | |
| 					PutROChildrenInDictionary(_MyRODbID.ToString() + ":", rolkup);
 | |
| 				}
 | |
| 				//else if (rolkup is ROFSTLookup.rogrp)
 | |
| 				//    Console.WriteLine("RO Group");
 | |
| 				//else if (rolkup is ROFSTLookup.roHdr)
 | |
| 				//    Console.WriteLine("RO Header");
 | |
| 				//ROList.Add(rtnStr);
 | |
| 			}
 | |
| 			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]);
 | |
| 		}
 | |
| 		static int blankKeyCnt = 0;
 | |
| 		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);
 | |
| 			if (chld.children == null) // 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
 | |
| 				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 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
 | |
| 					if (roc.children != null && (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
 | |
| 				{
 | |
| 					foreach (ROFSTLookup.rodbi rodbi in _MyROFSTLookup.GetRODatabaseList())
 | |
| 					{
 | |
| 						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;
 | |
| 					chld = ch.children;
 | |
| 					rtnStr = _MyRODbID.ToString() + ":" + GetROChildren(rolkup).TrimEnd(',');
 | |
| 				}
 | |
| 				//else if (rolkup is ROFSTLookup.rogrp)
 | |
| 				//    Console.WriteLine("RO Group");
 | |
| 				//else if (rolkup is ROFSTLookup.roHdr)
 | |
| 				//    Console.WriteLine("RO Header");
 | |
| 				ROList.Add(rtnStr);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// same function as GetROsToSearch in DisplaySearch.cs
 | |
| 		private string GetROChildren(object roObj)
 | |
| 		{
 | |
| 			ROFSTLookup.rochild chld = (ROFSTLookup.rochild)roObj;
 | |
| 			string rtnstr = "";
 | |
| 			if (chld.children == null) // 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
 | |
| 					if (roc.children != null && (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;
 | |
| 		}
 | |
| 		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;
 | |
| 		}
 | |
| 
 | |
| 		public void SelectReferencedObjectTab()
 | |
| 		{
 | |
| 			tabROReports.PerformClick();
 | |
| 		}
 | |
| 
 | |
| 		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();
 | |
| 		}
 | |
| 		#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;
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		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 = "VLN_DUMMY";
 | |
| 					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);
 | |
| 
 | |
| 			// 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
 | |
| 		}
 | |
| 		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, load children
 | |
| 			DevComponents.AdvTree.Node tn = null;
 | |
| 			if (par.Nodes.Count > 0) tn = par.Nodes[0];
 | |
| 			if (tn.Text == "VLN_DUMMY")		// 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 = "VLN_DUMMY";
 | |
| 							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
 | |
| 		public void advTreeROFillIn(bool blSeachTabClicked)
 | |
| 		{
 | |
| 			DevComponents.AdvTree.Node topnode = null;
 | |
| 			advTreeRO.Nodes.Clear();
 | |
| 			if (_MyROFSTLookup == null) return;
 | |
| 			advTreeRO.BeforeExpand += new AdvTreeNodeCancelEventHandler(advTreeRO_BeforeExpand);
 | |
| 			advTreeRO.AfterExpand += 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);
 | |
| 
 | |
| 			for (int i = 0; i < _MyROFSTLookup.myHdr.myDbs.Length; i++)
 | |
| 			{
 | |
| 				DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node();
 | |
| 				tn.Text = _MyROFSTLookup.myHdr.myDbs[i].dbiTitle;
 | |
| 				tn.Tag = _MyROFSTLookup.myHdr.myDbs[i];
 | |
| 				tn.CheckBoxVisible = true;
 | |
| 				topnode.Nodes.Add(tn);
 | |
| 				AddDummyGroup(_MyROFSTLookup.myHdr.myDbs[i], tn);
 | |
| 			}
 | |
| 
 | |
| 
 | |
| 			//foreach (FolderInfo fic in fi.ChildFolders)
 | |
| 			//{
 | |
| 			//    DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node();
 | |
| 			//    newnode.Text = fic.ToString();
 | |
| 			//    newnode.Tag = fic;
 | |
| 
 | |
| 			//    cntnd++;
 | |
| 			//    if (fic.ChildFolderCount > 0 || fic.FolderDocVersionCount > 0)		// allow for '+' for tree expansion
 | |
| 			//    {
 | |
| 			//        DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node();
 | |
| 			//        tnt.Text = "VLN_DUMMY";
 | |
| 			//        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);
 | |
| 
 | |
| 			//// 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
 | |
| 		}
 | |
| 
 | |
| 		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 = "VLN_DUMMY_FOR_TREE";
 | |
| 				tn.Nodes.Add(tmp);
 | |
| 			}
 | |
| 		}
 | |
| 		private void advTreeRO_BeforeExpand(object sender, DevComponents.AdvTree.AdvTreeNodeCancelEventArgs e)
 | |
| 		{
 | |
| 			LoadChildren(e.Node);
 | |
| 		}
 | |
| 
 | |
| 		private void LoadChildren(DevComponents.AdvTree.Node tn)
 | |
| 		{
 | |
| 			object tag = tn.Tag;
 | |
| 			if (tn.HasChildNodes && tn.Nodes[0].Text != "VLN_DUMMY_FOR_TREE") return;  // already loaded.
 | |
| 			if (tn.HasChildNodes && tn.Nodes[0].Text == "VLN_DUMMY_FOR_TREE") tn.Nodes[0].Remove();
 | |
| 			ROFSTLookup.rochild[] chld = null;
 | |
| 
 | |
| 			if (tn.Tag is ROFSTLookup.rodbi)
 | |
| 			{
 | |
| 				ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag;
 | |
| 				chld = db.children;
 | |
| 			}
 | |
| 			else if (tn.Tag is ROFSTLookup.rochild)
 | |
| 			{
 | |
| 				ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag;
 | |
| 				chld = ch.children;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				Console.WriteLine("error - no type");
 | |
| 				return;
 | |
| 			}
 | |
| 			// if children, add dummy node
 | |
| 			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;
 | |
| 					// if this is a group, i.e. type 0, add a dummy node
 | |
| 					if (chld[i].type == 0 && chld[i].children == null)
 | |
| 						//skip it.
 | |
| 						// TODO: KBR how to handle this?
 | |
| 						//Console.WriteLine("ro junk");
 | |
| 						continue;
 | |
| 					else if (chld[i].value == null && (cbxROUsage.Checked || 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 = "VLN_DUMMY_FOR_TREE";
 | |
| 						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);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			//ProgressBar_Clear();
 | |
| 		}
 | |
| 		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 static Regex _RegExGetNumber = new Regex(@"^ *[+-]?[.,0-9]+(E[+-]?[0-9]+)?");
 | |
| 		private bool GreaterValue(string value1, string value2)
 | |
| 		{
 | |
| 			return DisplayRO.GreaterValue(value1, value2);
 | |
| 			//  Match match1 = _RegExGetNumber.Match(value1);
 | |
| 			//  Match match2 = _RegExGetNumber.Match(value2);
 | |
| 			//  if (match1.Success && match2.Success) // Compare the numeric value
 | |
| 			//  {
 | |
| 			//    double dbl1 = double.Parse(match1.ToString());
 | |
| 			//    double dbl2 = double.Parse(match2.ToString());
 | |
| 			//    return dbl1 > dbl2;
 | |
| 			//  }
 | |
| 			//  return String.Compare(value1, value2, true) > 0;
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		#endregion
 | |
| 
 | |
| 		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 + "\"";
 | |
| 				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 indefinately
 | |
| 				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)
 | |
| 		{
 | |
| 			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));
 | |
| 			}
 | |
| 			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);
 | |
| 				OnPrintRequest(new DisplayReportsEventArgs("Complete RO Report", "Complete RO Report", roDataFile, MyROFSTLookup, cbxComplete.Checked, this.Mydocversion.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta, cbxIncldMissingROs.Checked));
 | |
| 			}
 | |
| 			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, "");
 | |
| 				if (!usageSortedByProcedure) // sort on ROs
 | |
| 				{
 | |
| 					Csla.SortedBindingList<ItemInfo> sortedResults = new Csla.SortedBindingList<ItemInfo>(SearchResults);
 | |
| 					sortedResults.ApplySort("FoundROID", ListSortDirection.Ascending);
 | |
| 					OnPrintRequest(new DisplayReportsEventArgs("Referenced Objects Usage By RO", "RO Usage", sortedResults, usageSortedByProcedure, cbxIncldMissingROs.Checked));
 | |
| 				}
 | |
| 				else
 | |
| 					OnPrintRequest(new DisplayReportsEventArgs("Referenced Objects Usage By Procedure", "RO Usage", SearchResults, usageSortedByProcedure, cbxIncldMissingROs.Checked));
 | |
| 			}
 | |
| 			else if (cbxTransFromProcs.Checked)
 | |
| 			{
 | |
| 			}
 | |
| 			else if (cbxTransToProcs.Checked)
 | |
| 			{
 | |
| 			}
 | |
| 			Cursor = curcur;
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 	public class DisplayReportsEventArgs
 | |
| 	{
 | |
| 		private string _ReportTitle;
 | |
| 		public string ReportTitle
 | |
| 		{
 | |
| 			get { return _ReportTitle; }
 | |
| 			set { _ReportTitle = value; }
 | |
| 		}
 | |
| 		private string _TypesSelected;
 | |
| 		public string TypesSelected
 | |
| 		{
 | |
| 			get { return _TypesSelected; }
 | |
| 			set { _TypesSelected = value; }
 | |
| 		}
 | |
| 		private ICollection<ItemInfo> _MyItemInfoList;
 | |
| 		public ICollection<ItemInfo> MyItemInfoList
 | |
| 		{
 | |
| 			get { return _MyItemInfoList; }
 | |
| 			set { _MyItemInfoList = value; }
 | |
| 		}
 | |
| 		private bool _SortUsageByProcedure;
 | |
| 		public bool SortUsageByProcedure
 | |
| 		{
 | |
| 			get { return _SortUsageByProcedure; }
 | |
| 			set { _SortUsageByProcedure = value; }
 | |
| 		}
 | |
| 		private string _RODataFile = "";
 | |
| 		public string RODataFile
 | |
| 		{
 | |
| 			get { return _RODataFile; }
 | |
| 			set { _RODataFile = value; }
 | |
| 		}
 | |
| 		private bool _CompleteROReport = true;
 | |
| 		public bool CompleteROReport
 | |
| 		{
 | |
| 			get { return _CompleteROReport; }
 | |
| 			set { _CompleteROReport = value; }
 | |
| 		}
 | |
| 		private ROFSTLookup _rofstLookup;
 | |
| 		public ROFSTLookup RofstLookup
 | |
| 		{
 | |
| 			get { return _rofstLookup; }
 | |
| 			set { _rofstLookup = value; }
 | |
| 		}
 | |
| 		private List<string> _ROListForReport;
 | |
| 
 | |
| 		public List<string> ROListForReport
 | |
| 		{
 | |
| 			get { return _ROListForReport; }
 | |
| 			set { _ROListForReport = value; }
 | |
| 		}
 | |
| 		private bool _IncludeMissingROs = true;
 | |
| 
 | |
| 		public bool IncludeMissingROs
 | |
| 		{
 | |
| 			get { return _IncludeMissingROs; }
 | |
| 			set { _IncludeMissingROs = value; }
 | |
| 		}
 | |
| 		private bool _ConvertCaretToDelta = true;
 | |
| 
 | |
| 		public bool ConvertCaretToDelta
 | |
| 		{
 | |
| 			get { return _ConvertCaretToDelta; }
 | |
| 			set { _ConvertCaretToDelta = value; }
 | |
| 		}
 | |
| 		private bool _IncludeEmptyROFields = true;
 | |
| 
 | |
| 		public bool IncludeEmptyROFields
 | |
| 		{
 | |
| 			get { return _IncludeEmptyROFields; }
 | |
| 			set { _IncludeEmptyROFields = value; }
 | |
| 		}
 | |
| 		public DisplayReportsEventArgs(string reportTitle, string typesSelected, ICollection<ItemInfo> myItemInfoList, bool sortByProcedure, bool includeMissingROs)
 | |
| 		{
 | |
| 			// RO Usage Report
 | |
| 			_ReportTitle = reportTitle;
 | |
| 			_TypesSelected = typesSelected;
 | |
| 			_MyItemInfoList = myItemInfoList;
 | |
| 			_SortUsageByProcedure = sortByProcedure;
 | |
| 			_IncludeMissingROs = includeMissingROs;
 | |
| 
 | |
| 		}
 | |
| 		public DisplayReportsEventArgs(string reportTitle, string typesSelected, string roDataFile, ROFSTLookup rofstLookUp, bool completeROReport, bool convertCaretToDelta, bool includeEmptyROFields)
 | |
| 		{
 | |
| 			_ReportTitle = reportTitle;
 | |
| 			_TypesSelected = typesSelected;
 | |
| 			_RODataFile = roDataFile;
 | |
| 			_CompleteROReport = completeROReport;
 | |
| 			_ConvertCaretToDelta = convertCaretToDelta;
 | |
| 			_rofstLookup = rofstLookUp;
 | |
| 			_IncludeEmptyROFields = includeEmptyROFields;
 | |
| 		}
 | |
| 		public DisplayReportsEventArgs(string reportTitle, string typesSelected, ROFSTLookup rofstLookUp, List<string> roListForReport)
 | |
| 		{
 | |
| 			// RO Summary Report
 | |
| 			_ReportTitle = reportTitle;
 | |
| 			_TypesSelected = typesSelected;
 | |
| 			_rofstLookup = rofstLookUp;
 | |
| 			_ROListForReport = roListForReport;
 | |
| 		}
 | |
| 	}
 | |
| 	public delegate void DisplayReportsEvent(object sender, DisplayReportsEventArgs args);
 | |
| 	public class AlphanumComparatorFast : IComparer<string>
 | |
| 	{
 | |
| 		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;
 | |
| 		}
 | |
| 
 | |
| 		// sample usage
 | |
| 		//            List<string> marks = new List<string>();
 | |
| 		//            marks.Add("M'00Z1");
 | |
| 		//            marks.Add("M'0A27");
 | |
| 		//            marks.Add("M'00Z0");
 | |
| 		//            marks.Add("0000A27");
 | |
| 		//            marks.Add("100Z0");
 | |
| 
 | |
| 		//string[] Markings = marks.ToArray();
 | |
| 
 | |
| 		//            Array.Sort(Markings, new AlphanumComparatorFast());
 | |
| 	}
 | |
| 
 | |
| 
 | |
| }
 |