Move from volian.controls.library (should be deleted from volian.controls.library )
		
			
				
	
	
		
			307 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.Text.RegularExpressions;
 | |
| 
 | |
| namespace VEPROMS.CSLA.Library
 | |
| {
 | |
| 	public class OutlineRTFTable
 | |
| 	{
 | |
| 		public OutlineRTFTable(string rtf, bool withBorder)
 | |
| 		{
 | |
| 			Rtf = rtf;
 | |
| 			WithBorder = withBorder;
 | |
| 		}
 | |
| 		private string _Rtf;
 | |
| 		public string Rtf
 | |
| 		{
 | |
| 			get { return _Rtf; }
 | |
| 			set { _Rtf = value; }
 | |
| 		}
 | |
| 		private bool _WithBorder;
 | |
| 		public bool WithBorder
 | |
| 		{
 | |
| 			get { return _WithBorder; }
 | |
| 			set { _WithBorder = value; }
 | |
| 		}
 | |
| 		private RtfLines _Lines;
 | |
| 		public RtfLines Lines
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				if (_Lines == null)
 | |
| 					_Lines = new RtfLines(Rtf);
 | |
| 				return _Lines;
 | |
| 			}
 | |
| 		}
 | |
| 		public void OutlineTable()
 | |
| 		{
 | |
| 			int maxWidth = Lines.MaximumWidth;// Determine maximum width
 | |
| 			// spaces here if not an outlined table:
 | |
| 			Lines.Pad(maxWidth, WithBorder ? @"\u9474?" : " "); // Pad the lines to the appropriate width
 | |
| 			Lines.Insert(0, new RtfLine(maxWidth, WithBorder ? @"\u9484?" : " ", WithBorder ? @"\u9472?" : " ", WithBorder ? @"\u9488?" : " ")); // Insert top line
 | |
| 			Lines.Add(new RtfLine(maxWidth, WithBorder ? @"\u9492?" : " ", WithBorder ? @"\u9472?" : " ", WithBorder ? @"\u9496?" : " ")); // Insert bottom line
 | |
| 			Lines.ReplaceLines(WithBorder);
 | |
| 		}
 | |
| 		public override string ToString()
 | |
| 		{
 | |
| 			return Lines.ToString();
 | |
| 		}
 | |
| 	}
 | |
| 	public class RtfLines : List<RtfLine>
 | |
| 	{
 | |
| 		public static Regex _RegReplaceLine = new Regex(@"\\line((\\[^ \[\]\\\(\)]*) )");
 | |
| 		public RtfLines(string text)
 | |
| 		{
 | |
| 			// replace RTF \line with crlf
 | |
| 			string txt = _RegReplaceLine.Replace(text, "$1\r\n");
 | |
| 			// split text into lines
 | |
| 			string[] breaks = { "\r\n" };
 | |
| 			string[] lines = txt.Split(breaks, StringSplitOptions.None);
 | |
| 			//string lastLine = lines[lines.Length - 1];
 | |
| 			foreach (string line in lines)
 | |
| 				Add(new RtfLine(line.Replace("\\bullet","*")));
 | |
| 		}
 | |
| 		public int MaximumWidth
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				int retval = 0;
 | |
| 				foreach (RtfLine myLine in this)
 | |
| 					if (myLine.MaximumWidth > retval) retval = myLine.MaximumWidth;
 | |
| 				return retval;
 | |
| 			}
 | |
| 		}
 | |
| 		public void Pad(int maxWidth, string edge)
 | |
| 		{
 | |
| 			foreach (RtfLine myLine in this)
 | |
| 				myLine.Pad(maxWidth, edge);
 | |
| 
 | |
| 		}
 | |
| 		public override string ToString()
 | |
| 		{
 | |
| 			StringBuilder sb = new StringBuilder();
 | |
| 			string sep = "";
 | |
| 			foreach (RtfLine myLine in this)
 | |
| 			{
 | |
| 				sb.Append(sep + myLine.ToString());
 | |
| 				sep = "\r\n";
 | |
| 			}
 | |
| 			return sb.ToString();
 | |
| 		}
 | |
| 		private static Regex _RegRightCheck = new Regex(@"-|\\u9472?|\\u8209\?");
 | |
| 		private static Regex _RegAboveCheck = new Regex(@"\||\\u9474\?|\\u9492\?|\\u9516\?|\\u9532\?|\\u9500\?|\\u9484\?|\\u9524\?|\\u9488\?|\\u9508\?");
 | |
| 		private static Regex _RegLeftCheck = new Regex(@"-|\\u9472\?|\\u9508\?|\\u9516\?|\\u9500\?|\\u9532\?|\\u9484\?|\\u9488\?|\\u9492\?|\\u8209\?");
 | |
| 		private static Regex _RegBelowCheck = new Regex(@"\||\\u9474\?");
 | |
| 
 | |
| 		private static Regex _RegRightCheck1 = new Regex(@"\\u9474\?");
 | |
| 		private static Regex _RegAboveCheck1 = new Regex(@"\\u9472\?|\\u8209\?");
 | |
| 		private static Regex _RegLeftCheck1 = new Regex(@"\\u9474\?");
 | |
| 		private static Regex _RegBelowCheck1 = new Regex(@"\\u9472\?|\\u8209\?");
 | |
| 
 | |
| 		private static Regex _RegHorizontalCheck = new Regex(@"-|\\u9472\?|\\u8209\?");
 | |
| 		private static Regex _RegVerticalCheck = new Regex(@"\||\\u9474\?");
 | |
| 		static private string[] TableCharsU = {
 | |
| 			"\x0",			// HEX"\x0",   //    No character	
 | |
| 			@"\u9472?",		// HEX@"\u2500",//	-  Horizontal line		- 16-bit char: '\xC4'
 | |
| 			@"\u9474?",		// HEX@"\u2502",// |  Vertical line			- 16-bit char: '\xB3'
 | |
| 			@"\u9492?",		// HEX@"\u2514",// L  Bottom Left corner	- 16-bit char: '\xC0'
 | |
| 			@"\u9472?",		// HEX@"\u2500",//	-  Horizontal line		- 16-bit char: '\xC4'
 | |
| 			@"\u9472?",		// HEX@"\u2500",//	-  Horizontal line		- 16-bit char: '\xC4'
 | |
| 			@"\u9496?",		// HEX@"\u2518",//    Bottom Right Corner	- 16-bit char: '\xD9'
 | |
| 			@"\u9524?",		// HEX@"\u2534",//    Bottom Tee			- 16-bit char: '\xC1'
 | |
| 			@"\u9474?",		// HEX@"\u2502",// |  Vertical Bar			- 16-bit char: '\xB3'
 | |
| 			@"\u9484?",		// HEX@"\u250c",//    Upper Left corner		- 16-bit char: '\xDA'
 | |
| 			@"\u9474?",		// HEX@"\u2502",// |  Vertical Bar			- 16-bit char: '\xB3'
 | |
| 			@"\u9500?",		// HEX@"\u251c",//    Left Tee				- 16-bit char: '\xC3'
 | |
| 			@"\u9488?",		// HEX@"\u2510",//    Upper Right corner	- 16-bit char: '\xBF'
 | |
| 			@"\u9516?",		// HEX@"\u252c",// T  Top Tee				- 16-bit char: '\xC2'
 | |
| 			@"\u9508?",		// HEX@"\u2524",//    Right Tee				- 16-bit char: '\xB4'
 | |
| 			@"\u9532?",		// HEX@"\u253c" //  +  Plus					- 16-bit char: '\xC5'
 | |
| 		};
 | |
| 		internal void ReplaceLines(bool withBorder)
 | |
| 		{
 | |
| 			int maxWidth = this[0].Count;
 | |
| 			for (int row = 1; row < Count - 1; row++)
 | |
| 			{
 | |
| 				RtfLine lineAbove = this[row - 1];
 | |
| 				RtfLine line = this[row];
 | |
| 				RtfLine lineBelow = this[row + 1];
 | |
| 				for (int col = 1; col < maxWidth - 1; col++)
 | |
| 				{
 | |
| 					RtfPiece curPiece = line[col];
 | |
| 					string current = curPiece.Text;
 | |
| 					bool horizontal = _RegHorizontalCheck.IsMatch(current); // Horizontal
 | |
| 					bool vertical = _RegVerticalCheck.IsMatch(current); // Vertical
 | |
| 					if (horizontal || vertical)
 | |
| 					{
 | |
| 						int index = _RegRightCheck.IsMatch(line[col + 1].Text) ||
 | |
| 							(horizontal && _RegRightCheck1.IsMatch(line[col + 1].Text)) ? 1 : 0; // Right
 | |
| 						index += _RegAboveCheck.IsMatch(lineAbove[col].Text) ||
 | |
| 							(vertical && _RegAboveCheck1.IsMatch(lineAbove[col].Text)) ? 2 : 0; // Above
 | |
| 						index += _RegLeftCheck.IsMatch(line[col - 1].Text) ||
 | |
| 							(horizontal && _RegLeftCheck1.IsMatch(line[col - 1].Text)) ? 4 : 0; // Left
 | |
| 						index += _RegBelowCheck.IsMatch(lineBelow[col].Text) ||
 | |
| 							(vertical && _RegBelowCheck1.IsMatch(lineBelow[col].Text)) ? 8 : 0; // Below
 | |
| 						if (index > 0)
 | |
| 						{
 | |
| 							curPiece.Text = TableCharsU[index];
 | |
| 							// this connects the lines to the border, so only do it if there is a border
 | |
| 							if (withBorder)
 | |
| 							{
 | |
| 								if (vertical && row == 1) lineAbove[col].Text = TableCharsU[13]; // Upper Tee
 | |
| 								if (vertical && row == Count - 2) lineBelow[col].Text = TableCharsU[7]; // Lower Tee
 | |
| 								if (horizontal && col == 1) line[col - 1].Text = TableCharsU[11];// Left Tee
 | |
| 								if (horizontal && col == maxWidth - 2) line[col + 1].Text = TableCharsU[14];// Right Tee
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		private void ListItems(string loc, string str)
 | |
| 		{
 | |
| 			StringBuilder sb = new StringBuilder(string.Format("{0} = @\"", loc));
 | |
| 			string sep = "";
 | |
| 			foreach (char c in str)
 | |
| 			{
 | |
| 				if (c < 127)
 | |
| 					sb.Append(sep + c.ToString());
 | |
| 				else
 | |
| 					sb.Append(sep + string.Format("\\u{0}?", (int)c));
 | |
| 				sep = "|";
 | |
| 			}
 | |
| 			Console.WriteLine(sb.ToString());
 | |
| 		}
 | |
| 	}
 | |
| 	public class RtfLine : List<RtfPiece>
 | |
| 	{
 | |
| 		private static Regex _RegRtfText = new Regex(@"((\\[^'u ]*|\\up[0-9]|\\ul|\\ulnone)+( |$|(?=\\['u])))?(<START\]|#Link.*?\[END>|\\'[0-9a-fA-F]{2}|\\u[0-9]*\?|[^\\]{1}|$|)");
 | |
| 		public RtfLine(string text)
 | |
| 		{
 | |
| 			MatchCollection matches = _RegRtfText.Matches(text);
 | |
| 			int nextIndex = 0;
 | |
| 			foreach (Match match in matches)
 | |
| 			{
 | |
| 				if (nextIndex != match.Index) // This should never happen
 | |
| 				{
 | |
| 					throw new Exception(string.Format("\"RtfPiece Missing Content\",{0},{1},\"{2}\",\"{3}\",\"{4}\"", nextIndex, match.Index, text.Substring(nextIndex, match.Index - nextIndex), match.Groups[2].Value, match.Groups[4].Value));
 | |
| 					//Console.WriteLine("\"RtfPiece Missing Content\",{0},{1},\"{2}\",\"{3}\",\"{4}\"", nextIndex, match.Index, text.Substring(nextIndex, match.Index - nextIndex), match.Groups[2].Value, match.Groups[4].Value);
 | |
| 					//Console.WriteLine(text.Substring(nextIndex));
 | |
| 				}
 | |
| 				nextIndex = match.Index + match.Length;
 | |
| 				string rtfPart = match.Groups[1].ToString();
 | |
| 				if (match.Groups[1].ToString().TrimEnd(" ".ToCharArray()).Length + match.Groups[4].ToString().Length > 0)
 | |
| 					this.Add(new RtfPiece(match.Groups[1].ToString().TrimEnd(" ".ToCharArray()), match.Groups[4].ToString()));
 | |
| 				//if (match.Groups[1].ToString().Length + match.Groups[4].ToString().Length > 0)
 | |
| 				//  this.Add(new RtfPiece(match.Groups[1].ToString(), match.Groups[4].ToString()));
 | |
| 			}
 | |
| 		}
 | |
| 		public RtfLine(int width, string left, string fill, string right)
 | |
| 		{
 | |
| 			Add(new RtfPiece("", left));
 | |
| 			for (int i = 0; i < width; i++) this.Add(new RtfPiece("", fill)); // Pad
 | |
| 			Add(new RtfPiece("", right));
 | |
| 		}
 | |
| 		public int MaximumWidth
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				int retval = 0;
 | |
| 				foreach (RtfPiece myPiece in this)
 | |
| 					retval += myPiece.MaximumWidth;
 | |
| 				return retval;
 | |
| 			}
 | |
| 		}
 | |
| 		public override string ToString()
 | |
| 		{
 | |
| 			StringBuilder sb = new StringBuilder();
 | |
| 			foreach (RtfPiece myPiece in this)
 | |
| 				sb.Append(myPiece.ToString());
 | |
| 			return sb.ToString();
 | |
| 		}
 | |
| 		internal void Pad(int maxWidth, string edge)
 | |
| 		{
 | |
| 			int pad = maxWidth - MaximumWidth;
 | |
| 			this.Insert(0, new RtfPiece("", edge)); // Left Edge
 | |
| 			for (int i = 0; i < pad; i++) this.Add(new RtfPiece("", " ")); // Pad
 | |
| 			this.Add(new RtfPiece("", edge)); // Right Edge
 | |
| 		}
 | |
| 		public new RtfPiece this[int index]
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				int j = 0;
 | |
| 				foreach (RtfPiece myPiece in this)
 | |
| 				{
 | |
| 					if (myPiece.Text != "")
 | |
| 					{
 | |
| 						if (j == index) return myPiece;
 | |
| 						j++;
 | |
| 					}
 | |
| 				}
 | |
| 				return null;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	public class RtfPiece
 | |
| 	{
 | |
| 		private string _Rtf;
 | |
| 		public string Rtf
 | |
| 		{
 | |
| 			get { return _Rtf; }
 | |
| 			set { _Rtf = value; }
 | |
| 		}
 | |
| 		private string _Text = "";
 | |
| 		public string Text
 | |
| 		{
 | |
| 			get { return _Text; }
 | |
| 			set { _Text = value; }
 | |
| 		}
 | |
| 		public int TextLength
 | |
| 		{
 | |
| 			get { return Text.Length; }
 | |
| 		}
 | |
| 		public int MaximumWidth
 | |
| 		{
 | |
| 			get { return Text == "" ? 0 : 1; }
 | |
| 		}
 | |
| 		private static Regex _RegStartLink = new Regex(@"<START\]");
 | |
| 		private static Regex _RegEndLink = new Regex(@"#Link.*?\[END>");
 | |
| 		public RtfPiece(string rtf, string text)
 | |
| 		{
 | |
| 			_Rtf = rtf;
 | |
| 			if (_RegStartLink.IsMatch(text) || _RegEndLink.IsMatch(text))
 | |
| 				_Rtf += (rtf == "" ? "" : " ") + text;
 | |
| 			else
 | |
| 			{
 | |
| 				_Rtf += rtf == "" ? "" : " ";
 | |
| 				_Text = text;
 | |
| 			}
 | |
| 		}
 | |
| 		public override string ToString()
 | |
| 		{
 | |
| 			return _Rtf + _Text;
 | |
| 			//string retval = _RegUnicode.Replace(_Text, new MatchEvaluator(RtfUnicodeCharacter));
 | |
| 			//retval = _RegHex.Replace(retval, new MatchEvaluator(RtfHexCharacter));
 | |
| 			//return retval;
 | |
| 		}
 | |
| 		//private static Regex _RegUnicode = new Regex(@"\\u([0-9ABCDEF]*)\?");
 | |
| 		//internal static string RtfUnicodeCharacter(Match myMatch)
 | |
| 		//{
 | |
| 		//  string hexStr = myMatch.Groups[1].ToString();
 | |
| 		//  int i = int.Parse(hexStr);
 | |
| 		//  Char schar = Convert.ToChar(i);
 | |
| 		//  return schar.ToString();
 | |
| 		//}
 | |
| 		//private static Regex _RegHex = new Regex(@"\\'([0-9A-Fa-f]{2})");
 | |
| 		//internal static string RtfHexCharacter(Match myMatch)
 | |
| 		//{
 | |
| 		//  string hexStr = myMatch.Groups[1].ToString();
 | |
| 		//  int i = int.Parse(hexStr, System.Globalization.NumberStyles.HexNumber);
 | |
| 		//  Char schar = Convert.ToChar(i);
 | |
| 		//  return schar.ToString();
 | |
| 		//}
 | |
| 	}
 | |
| }
 |