using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Xml; using System.Text.RegularExpressions; using log4net; using VEPROMS.CSLA.Library; using Volian.Controls.Library; using C1.Win.C1FlexGrid; using System.Data.SqlClient; namespace ConvertLocalAlarms { public partial class frmConvertLocalAlarms : Form { public frmConvertLocalAlarms() { InitializeComponent(); } private void SetDatabaseConnection() { Database.VEPROMS_Connection = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=True",tbServer.Text,cmbDatabase.SelectedText ); } private void btnBrowse_Click(object sender, EventArgs e) { FileInfo fi = new FileInfo(tbFileName.Text); ofd.InitialDirectory = fi.DirectoryName; ofd.FileName = fi.Name; if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { tbFileName.Text = ofd.FileName; ProcessTxt(); } } private void ProcessTxtFile(string fileName) { //FileInfo fi = new FileInfo(fileName); //StreamReader sr = fi.OpenText(); //ProcessHeader(sr); //ProcTextAll = tbPROMS.Text = sr.ReadToEnd(); //HasSpecialCharacters(ProcTextAll); //sr.Close(); //SaveTree(ProcTextAll, ProcNumber, ProcTitle); FileInfo fi = new FileInfo(fileName); FileStream sr = fi.OpenRead(); byte[] buffer = new byte[fi.Length]; sr.Read(buffer, 0, (int) fi.Length); string str = Encoding.UTF7.GetString(buffer).Replace("\x95", "\u2022"); ProcessHeader(str); int headercount = str.IndexOf("Setpoint"); headercount = str.IndexOf("\r\n", headercount); ProcTextAll = tbPROMS.Text = str.Substring(headercount + 2); sr.Close(); SaveTree(ProcTextAll, ProcNumber, ProcTitle); } Regex regHeader = new Regex("([ A-Z.a-z]+) = '([^']+)'.*", RegexOptions.Compiled); private void ProcessHeader(string str) { ProcNumber=""; ProcTitle=""; int offset = 0; int linelength = 0; for (int i = 0; i < 5; i++) { linelength = str.IndexOf("\r\n",offset)-offset; string txt = str.Substring(offset,linelength); offset += linelength + 2; Match m = regHeader.Match(txt); switch (i) { case 0: break; case 1: if(m.Groups[1].Value == "Alarm") ProcTitle = m.Groups[2].Value; break; case 2: if(m.Groups[1].Value == "AlarmID") ProcNumber = m.Groups[2].Value; break; case 3: break; case 4: break; } } } private void ProcessTxt() { ProcessTxtFile(tbFileName.Text); } //private void ProcessXML() //{ // //string fileName = tbFileName.Text; // //ProcessXmlFile(fileName); //} //private void ProcessXmlFile(string fileName) //{ // //UpdateHTML = false; // //tbXML.Clear(); // //UpdateHTML = true; // //XmlDocument xDoc = new XmlDocument(); // //xDoc.Load(fileName); // //XmlNode xn = xDoc.DocumentElement.LastChild.LastChild.LastChild; // //string html = GetHtml(xn); // //tbXML.Text = html; //} //private static string GetHtml(XmlNode xn) //{ // XmlNode pr = xn.PreviousSibling; // XmlAttribute xa; // string html = xn.Attributes["content"].Value; // while (pr != null && pr.Name == "NoteInstruction") // { // html = MergeHTML(pr.Attributes["content"].Value, html); // pr = pr.PreviousSibling; // } // return html; //} //private static string MergeHTML(string part1, string part2) //{ // part1 = part1.Replace(""; //public string HtmlPrefix //{ // get { return _HtmlPrefix; } // set { _HtmlPrefix = value; } //} //private void XMLChanged(string xml) //{ // Application.DoEvents(); // xml = "\n" + xml; // xml = xml.Replace(HtmlPrefix, ""); // //xml = xml.Replace("\x09", "[Tab]"); // //xml = xml.Replace("text-indent:0px;\">", "text-indent:0px;\">\r\n"); // //xml = xml.Replace(" \x09", "\r\n "); // //xml = xml.Replace("\x09", " "); // xml = Regex.Replace(xml, "
", "
"); // xml = Regex.Replace(xml, "
", "
"); // xml = Regex.Replace(xml, "\\]+\\>", ""); // xml = Regex.Replace(xml, "\\", ""); // xml = Regex.Replace(xml, "\\[ \r\n]+\\

]+\\>", "
\r\n"); // xml = Regex.Replace(xml, "\\

]+\\>", "
\r\n"); // xml = Regex.Replace(xml, @"
[ \t\r\n]+\[", @"\line ["); // xml = Regex.Replace(xml, "\\

", ""); // xml = Regex.Replace(xml, @"\]\t{4,5}", "]\r\n"); // xml = Regex.Replace(xml, "
\t+(?![[\\u2022])", " "); // xml = Regex.Replace(xml, "
\t+(?![[\\u2022])", " "); // xml = Regex.Replace(xml, "\t\t+", " "); // xml = Regex.Replace(xml, "
", "\r\n"); // xml = Regex.Replace(xml, "\r\n +", "\r\n"); // xml = Regex.Replace(xml, "(\r\n){2,}", "\r\n"); // //aml = Regex.Replace(xml," // Application.DoEvents(); // byte[] bytes = Encoding.UTF8.GetBytes(xml); // MemoryStream ms = new MemoryStream(); // ms.Write(bytes, 0, bytes.Length); // ms.Position = 0; // XmlDocument xDoc2 = new XmlDocument(); // xDoc2.Load(ms); // //FileInfo fi = new FileInfo("C:\\Temp\\Alarm.xml"); // //StreamWriter sw = fi.CreateText(); // //sw.Write(xml); // //sw.Close(); // //XmlDocument xDoc2 = new XmlDocument(); // //// Lookfor special characters // ////FindSpecialCharacters(xml); // //xDoc2.Load(fi.FullName); // XmlNode xn3 = xDoc2.ChildNodes[1].ChildNodes[1].ChildNodes[0]; // string prcSerialNoFldName = GetProcInfo(xn3, 0, 0, 0); // string prcSerialNoValue = GetProcInfo(xn3, 0, 1, 0); // SerialNo = int.Parse(prcSerialNoValue); // string prcTitleFldName = GetProcInfo(xn3, 1, 0, 0); // string prcTitleValue = GetProcInfo(xn3, 1, 1, 0); // string prcNumberFldName = GetProcInfo(xn3, 2, 0, 0); // string prcNumberValue = GetProcInfo(xn3, 2, 1, 0); // string prcSourceFldName = GetProcInfo(xn3, 3, 0, 0); // string prcSourceValue = GetProcInfo(xn3, 3, 1, 0); // string prcSetpointFldName = GetProcInfo(xn3, 4, 0, 0); // string prcSetpointValue = GetProcInfo(xn3, 4, 1, 0); // ProcNumber = prcNumberValue; // ProcTitle = prcTitleValue; // // Skip First Node // UpdateHTML = false; // tbPROMS.Clear(); // tbPROMS.AppendText(string.Format("{0} = '{1}'\r\n",prcSerialNoFldName,prcSerialNoValue)); // tbPROMS.AppendText(string.Format("{0} = '{1}'\r\n",prcTitleFldName,prcTitleValue)); // tbPROMS.AppendText(string.Format("{0} = '{1}'\r\n",prcNumberFldName,prcNumberValue)); // tbPROMS.AppendText(string.Format("{0} = '{1}'\r\n",prcSourceFldName,prcSourceValue)); // tbPROMS.AppendText(string.Format("{0} = '{1}'\r\n",prcSetpointFldName,prcSetpointValue)); // StringBuilder sbAllText = new StringBuilder(); // for (int i = 1; i < xDoc2.ChildNodes[1].ChildNodes[1].ChildNodes.Count; i++) // { // XmlNode xn2 = xDoc2.ChildNodes[1].ChildNodes[1].ChildNodes[i]; // sbAllText.Append(xn2.OuterXml); // } // tbPROMS.AppendText(sbAllText.ToString().Replace(" ", "\xB7")); // SaveTree(sbAllText.ToString(), prcNumberValue, prcTitleValue); // ProcTextAll = sbAllText.ToString(); // UpdateHTML = true; //} String ProcTextAll; //int SerialNo; String ProcNumber; String ProcTitle; private void SaveTree(string text, string procNumber, string procTitle) { tv.Nodes.Clear(); MemoryStream ms = GetMemoryStream(text); using (TextReader tr = new StreamReader(ms)) { Dictionary lookup = new Dictionary(); lookup.Add(0, tv.Nodes.Add(string.Format("{0} - {1}", procNumber, procTitle))); int level = 0; int lastLevel = 0; int lastIndent = 0; int extra = 0; string lastTab = ""; Queue enQueue = null; Queue deQueue = null; while (tr.Peek() >= 0 || deQueue != null) { string lineText; if (deQueue != null) { extra = 1; lineText = deQueue.Dequeue(); if (deQueue.Count == 0) deQueue = null; } else { extra = 0; lineText = tr.ReadLine(); if (lineText == "NOTE") enQueue = new Queue(); if (lineText.StartsWith("")) { enQueue = new Queue(); enQueue.Enqueue("NOTE"); } lineText = lineText.Replace("", ""); } // Strip XML Tags lineText = Regex.Replace(lineText, "<[^<>]+>", ""); if (lineText.Replace("\t", "") != "") { Match m = Regex.Match(lineText, @"^(\t*)([1-9][0-9]*\.0|[1-9][0-9]*\.[1-9][0-9]*|[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*|\u2022)([\t ]+)([^\u2022]*)$", RegexOptions.Multiline); string tab = m.Groups[2].Value; int indent = m.Groups[1].Value.Length; if (indent == 0 && tab.EndsWith(".0")) // High Level Step { level = 1; if (deQueue == null && enQueue != null) { deQueue = enQueue; enQueue = null; } } else if (Regex.IsMatch(tab, "[1-9][0-9]*[.0-9]*")) // Substep { level = 1 + tab.Length - tab.Replace(".","").Length; if (deQueue == null && enQueue != null) { deQueue = enQueue; enQueue = null; } } else if (tab == "") // Paragraph { if (Regex.IsMatch(lineText, "(NOTE|NOTES|CAUTION|CAUTIONS)")) extra = 0; level = lastLevel + 1; } else if (tab == "\u2022")//bullet level = indent + 2; if (level < lastLevel) while (level < lastLevel) lookup.Remove(lastLevel--); string txt = string.Format("{0}|{1}||{2}", m.Groups[1].Value, m.Groups[2].Value, m.Groups[4].Value); if (txt == "|||") txt = lineText; if (enQueue == null) { if (level > lookup.Count - extra) extra = 0; if(level + extra -1 == lookup.Count) Console.WriteLine("Problems {0}, {1}",procNumber,txt); else if (lookup.Count <= level) lookup.Add(level + extra, lookup[level + extra - 1].Nodes.Add(txt)); else lookup[level + extra] = lookup[level + extra - 1].Nodes.Add(txt); } else { enQueue.Enqueue(lineText); } lastTab = tab; lastLevel = level; lastIndent = indent; } } } } //private ItemInfo FindPrevious(SortedDictionary dicSerialNo, int serialNo) //{ // ItemInfo lastItem = null; // foreach (int serno in dicSerialNo.Keys) // { // if (serno > serialNo) // return lastItem; // lastItem = dicSerialNo[serno]; // } // return lastItem; //} private bool runOne = true; private static MemoryStream GetMemoryStream(string text) { byte[] bytes = Encoding.UTF8.GetBytes(text); MemoryStream ms = new MemoryStream(bytes); ms.Position = 0; return ms; } //private string GetProcInfo(XmlNode xn3, int p1, int p2, int p3) //{ // return xn3.ChildNodes[p1].ChildNodes[p2].ChildNodes[p3].Value.Trim("\r\n ".ToCharArray()); //} //private bool _UpdateHTML = true; //public bool UpdateHTML //{ // get { return _UpdateHTML; } // set { _UpdateHTML = value; } //} private string IndentifySpecialCharacters(string txt) { StringBuilder sb = new StringBuilder(); foreach (char c in txt) { if (((int)c) < 32 || ((int)c) > 256) sb.Append(string.Format("[x{0:X4}]", (int)c)); else sb.Append(c == ' ' ? '\xb7' : c); } return sb.ToString(); } private void btnRun_Click(object sender, EventArgs e) { ProcessTxt(); } //Regex regColorCode = new Regex(@"(\<[^<>]+\>)([^<>]*)", RegexOptions.Singleline); //Regex regColorCodeText = new Regex("(\t*)([^\t]*)", RegexOptions.Singleline); //private void ColorCoded(string str) //{ // rtbXML.Clear(); // Color fColor = Color.PaleTurquoise; // Color fNext = Color.PaleTurquoise; // foreach(Match m in regColorCode.Matches(str)) // { // string fmt = m.Groups[1].Value; // string txt = m.Groups[2].Value; // if (fmt.StartsWith("") // fNext = Color.PaleTurquoise; // else if (fmt == "
") // fColor = Color.PeachPuff; // else if (fmt == "

") // fColor = Color.LightPink; // AddToXML(fmt, fColor); // fColor = fNext; // foreach (Match mm in regColorCodeText.Matches(txt)) // { // string tabs = mm.Groups[1].Value; // string nontabs = mm.Groups[2].Value; // AddToXML(tabs, Color.Khaki); // AddToXML(nontabs, Color.Yellow); // } // } //} //private void AddToXML(string txt, Color fColor) //{ // if(txt=="") return; // rtbXML.SelectionStart = rtbXML.TextLength; // rtbXML.SelectionBackColor = fColor; // rtbXML.SelectedText = txt; //} private double GetMyOrder(Csla.SortedBindingList myList, string DVIFolderName) { double lastNum = 0; // Console.WriteLine("--->>> FolderName {0} Insert Count {1}",DVIFolderName, myList.Count); foreach (FolderInfo myFolder in myList) { // Console.WriteLine("--->>> FolderName {0} Insert Name {1} Insert Order {2}",DVIFolderName, myFolder.Name, myFolder.ManualOrder); if (myFolder.Name.CompareTo(DVIFolderName) >= 0) return (lastNum + (double)myFolder.ManualOrder) / 2.0; lastNum = myFolder.ManualOrder ?? 1.0; } return lastNum + 1; } private void tmr_Tick(object sender, EventArgs e) { tmr.Enabled = false; // If timer on the its ready to proccess int idnew = 0; string str = AutoFolder; if (str != null && str.Length > 5) { DirectoryInfo di = new DirectoryInfo(str); DocVersionInfo dvi = DocVersionInfo.Get((int)cmbDocVersion.SelectedValue); VEPROMS.CSLA.Library.FolderInfo grandParent = dvi.ActiveParent.ActiveParent as FolderInfo; using (VEPROMS.CSLA.Library.Folder flder = MakeFolder(str, grandParent)) { ROFstInfo fst = dvi.DocVersionAssociations[0].MyROFst; flder.ManualOrder = 0; double myOrder = GetMyOrder(grandParent.SortedChildFolders, str); flder.ManualOrder = myOrder; //Console.WriteLine("myOrder = {0}, flder = {1}", myOrder, flder.ManualOrder); flder.Save(); // create a a DocVersion using (DocVersion dv = DocVersion.MakeDocVersion(flder, "Working Draft", null, null, null, null)) { dv.DocVersionAssociations.Add(fst.Get()); dv.Save(); idnew = dv.VersionID; } } ProcessFolder(di, DocVersionInfo.Get(idnew)); } this.Close(); } private static Folder MakeFolder(string str, VEPROMS.CSLA.Library.FolderInfo grandParent) { int num = 0; foreach(FolderInfo chld in grandParent.ChildFolders) { if(chld.Name.StartsWith(str)) { if(chld.Name.StartsWith(str + ".")) { string str2=chld.Name.Substring(str.Length+1); num = Math.Max(int.Parse(str2)+1,num); } else num=1; } } return Folder.MakeFolder(grandParent.Get(), null, str+(num==0?"":"." + num.ToString()), str, str.Substring(12, 2), null, 1, null); } private static string _AutoFolder = null; private static string AutoFolder { get { if (_AutoFolder == null) { _AutoFolder = System.Environment.CommandLine; _AutoFolder = _AutoFolder.Substring(_AutoFolder.IndexOf(@".exe"" ") + 6).Trim(" \t\r\n".ToCharArray()); } if (_AutoFolder.Length < 1) return null; return _AutoFolder; } } private void frmConvertAlarms_Load(object sender, EventArgs e) { _MyFlexGrid = new VlnFlexGrid(); LoadSettings(); SetEventHandlers(); string str = AutoFolder; if (str != null && str.Length > 5) { tmr.Enabled = true; } } private void SetEventHandlers() { tbFileName.TextChanged += tbFileName_TextChanged; Move += frmConvertAlarms_Move; Resize += frmConvertAlarms_Resize; sc1.SplitterMoved += sc1_SplitterMoved; //sc2.SplitterMoved += sc2_SplitterMoved; tbServer.TextChanged+=tbServer_TextChanged; cmbDatabase.TextChanged+=cmbDatabase_TextChanged; cmbDatabase.Click += cmbDatabase_Click; cmbDocVersion.TextChanged+=cmbDocVersion_TextChanged; //BuildTableCombo(); //BuildProcedureSetCombo(); } void cmbDatabase_Click(object sender, EventArgs e) { Properties.Settings.Default.Database = cmbDatabase.Text; Properties.Settings.Default.Save(); BuildProcedureSetCombo(); } private void BuildProcedureSetCombo() { DocVersionInfoList dvil = DocVersionInfoList.Get(); cmbDocVersion.DataSource = dvil; cmbDocVersion.DisplayMember = "SearchDVPath"; cmbDocVersion.ValueMember = "VersionId"; } private void cmbDocVersion_TextChanged(object sender, EventArgs e) { Properties.Settings.Default.ProcedureSet = (int) cmbDocVersion.SelectedValue; Properties.Settings.Default.Save(); } private void cmbDatabase_TextChanged(object sender, EventArgs e) { Properties.Settings.Default.Database = cmbDatabase.Text; Properties.Settings.Default.Save(); BuildProcedureSetCombo(); } private void tbServer_TextChanged(object sender, EventArgs e) { Properties.Settings.Default.SqlServer = tbServer.Text; Properties.Settings.Default.Save(); string db = cmbDatabase.Text; try { BuildDatabaseCombo(); } catch (Exception ex) { tsslStatus.Text = ex.Message; } } private void BuildDatabaseCombo() { string tmp = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=True",tbServer.Text,"MASTER"); SqlConnection cn = new SqlConnection(tmp); cn.Open(); // SqlDataAdapter da = new SqlDataAdapter("select name from sysdatabases where name like 'VEP%' order by name", cn); //SqlDataAdapter da = new SqlDataAdapter("select name, case when object_id('[' + name + ']..Items') is null then 'Not PROMS' when object_id('[' + name + ']..Revisions') is not null then 'Approval' when object_id('[' + name + ']..ContentAudits') is not null then 'Change Manager' else 'Original' end functionality from sysdatabases where name not in ('master','model','msdb','tempdb') order by name", cn); SqlDataAdapter da = new SqlDataAdapter("select name, 'Approval' functionality from sysdatabases where name not in ('master','model','msdb','tempdb') order by name", cn); da.SelectCommand.CommandTimeout = 300; // 300 sec timeout DataSet ds = new DataSet(); try { da.Fill(ds); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.GetType().Name, ex.Message); throw (new Exception("Cannot Load Data List", ex)); } cn.Close(); //System.Windows.Forms.ContextMenuStrip cms = new System.Windows.Forms.ContextMenuStrip(); //cms.Items.Add("Choose Database"); //System.Windows.Forms.ToolStripMenuItem tsmi = cms.Items[0] as System.Windows.Forms.ToolStripMenuItem; //tsmi.BackColor = System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.ActiveCaption);// System.Drawing.Color.Pink; //tsmi.ForeColor = System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.ActiveCaptionText); //tsmi.Font = new System.Drawing.Font(tsmi.Font, System.Drawing.FontStyle.Bold); foreach (DataRow dr in ds.Tables[0].Rows) { if (dr["functionality"].ToString() == "Approval") cmbDatabase.Items.Add( dr["name"].ToString()); } } void frmConvertAlarms_Resize(object sender, EventArgs e) { Properties.Settings.Default.Size = Size; Properties.Settings.Default.Save(); } void frmConvertAlarms_Move(object sender, EventArgs e) { Properties.Settings.Default.Location = Location; Properties.Settings.Default.Save(); } void tbFileName_TextChanged(object sender, EventArgs e) { Properties.Settings.Default.FileName = tbFileName.Text; Properties.Settings.Default.Save(); } private void sc1_SplitterMoved(object sender, SplitterEventArgs e) { Properties.Settings.Default.Split1 = sc1.SplitterDistance; Properties.Settings.Default.Save(); } private void LoadSettings() { Size = Properties.Settings.Default.Size; Location = Properties.Settings.Default.Location; if (Properties.Settings.Default.FileName != null && Properties.Settings.Default.FileName != "") { FileInfo fi = new FileInfo(Properties.Settings.Default.FileName); tbFileName.Text = fi.FullName; } sc1.SplitterDistance = Properties.Settings.Default.Split1; tbServer.Text = Properties.Settings.Default.SqlServer; cmbDatabase.Text = Properties.Settings.Default.Database; try { BuildDatabaseCombo(); Database.VEPROMS_Connection = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=True", tbServer.Text, cmbDatabase.Text); BuildProcedureSetCombo(); cmbDocVersion.SelectedValue = Properties.Settings.Default.ProcedureSet; } catch (Exception ex) { tsslStatus.Text = ex.Message; } } private void tsslStatus_Click(object sender, EventArgs e) { } //private void rtbXML_SelectionChanged(object sender, EventArgs e) //{ //} //private void tbXML_TextChanged(object sender, EventArgs e) //{ // if (UpdateHTML) // { // htmlChanged(tbXML.Text); // XMLChanged(tbXML.Text); // ColorCoded(tbXML.Text); // } //} //private bool _UpdateTbXML = true; //public bool UpdateTbXML //{ // get { return _UpdateTbXML; } // set { _UpdateTbXML = value; } //} //private void rtbXML_TextChanged(object sender, EventArgs e) //{ // //if (UpdateHTML) // //{ // // UpdateHTML = false; // // htmlChanged(rtbXML.Text); // // XMLChanged(rtbXML.Text); // // tbXML.Text = rtbXML.Text; // // UpdateHTML = true; // //} //} private void btnConvert_Click(object sender, EventArgs e) { DocVersionInfo dvi = DocVersionInfo.Get((int)cmbDocVersion.SelectedValue); try { SaveProcedure(ProcTextAll, ProcNumber, ProcTitle, dvi); } catch (Exception ex) { Console.WriteLine("Error: {0}.{1} {2} {3}",dvi.MyFolder.Name,ProcNumber, ex.GetType().Name, ex.Message); } } //SortedDictionary dicSerialNo; private void btnAll_Click(object sender, EventArgs e) { //dicSerialNo = new SortedDictionary(); FileInfo fi = new FileInfo(tbFileName.Text); DirectoryInfo di = fi.Directory; // Loop through list DocVersionInfo dvi = DocVersionInfo.Get((int)cmbDocVersion.SelectedValue); ProcessFolder(di,dvi); } private void ProcessFolder(DirectoryInfo di, DocVersionInfo dvi) { runOne = false; // Get List of files //DocVersionInfo dvi = DocVersionInfo.Get((int)cmbDocVersion.SelectedValue); foreach (FileInfo f in di.GetFiles("*.txt")) { if (f.Name.StartsWith("AlarmData") == false && f.Name.Length > 14) { tsslStatus.Text = f.Name; Application.DoEvents(); // Process each file try { ProcessTxtFile(f.FullName); // Convert each file //SaveProcedure(ProcTextAll, ProcNumber, ProcTitle, SerialNo); SaveProcedure(ProcTextAll, ProcNumber, ProcTitle, dvi); } catch (Exception ex) { Console.WriteLine("Error: {0}.{1} {2} {3}", di.Name, f.Name, ex.GetType().Name, ex.Message); } //SaveProcedure(ProcTextAll, ProcNumber, ProcTitle, dvi); } } runOne = true; } private void statusStrip1_Click(object sender, EventArgs e) { if (tbPROMS.SelectedText != "") { tsslStatus.Text = string.Format("Selection = '{0}'", IndentifySpecialCharacters(tbPROMS.SelectedText)); Clipboard.Clear(); Clipboard.SetText(IndentifySpecialCharacters(tbPROMS.SelectedText)); } } private void statusStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (tbPROMS.SelectedText != "") { tsslStatus.Text = string.Format("Selection = '{0}'", IndentifySpecialCharacters(tbPROMS.SelectedText)); Clipboard.Clear(); Clipboard.SetText(IndentifySpecialCharacters(tbPROMS.SelectedText)); } } } }