289 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			289 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Data;
 | |
| using System.Drawing;
 | |
| using System.Text;
 | |
| using System.Windows.Forms;
 | |
| using System.Xml.Xsl;
 | |
| using System.Xml;
 | |
| using System.IO;
 | |
| using System.Text.RegularExpressions;
 | |
| 
 | |
| namespace XSL_Transform
 | |
| {
 | |
| 	public partial class frmMain : Form
 | |
| 	{
 | |
| 		private bool[] _Dirty = new bool[] { false, false, false };
 | |
| 		private string[] _Name = new string[] { "XML", "XSL", "Results" };
 | |
| 		private SaveFileDialog[] _Sfd;
 | |
| 		private OpenFileDialog[] _Ofd;
 | |
| 		private TextBox[] _Tb;
 | |
| 		private WebBrowser[] _Wb;
 | |
| 		private Dictionary<OpenFileDialog, Tabs> _OpenDict = new Dictionary<OpenFileDialog, Tabs>();
 | |
| 		private Dictionary<SaveFileDialog, Tabs> _SaveDict = new Dictionary<SaveFileDialog, Tabs>();
 | |
| 		private Dictionary<TextBox, Tabs> _TextBoxDict = new Dictionary<TextBox, Tabs>();
 | |
| 		enum Tabs : int
 | |
| 		{
 | |
| 			XML=0,XSL=1,Results=2
 | |
| 		}
 | |
| 		public frmMain()
 | |
| 		{
 | |
| 			InitializeComponent();
 | |
| 			_Sfd = new SaveFileDialog[] { sfdxml, sfdxsl, sfdResults };
 | |
| 			_Ofd = new OpenFileDialog[] { ofdxml, ofdxsl, ofdResults };
 | |
| 			_Tb = new TextBox[] { tbSX, tbSS, tbSR };
 | |
| 			_Wb = new WebBrowser[] { wbRX, wbRS, wbRR };
 | |
| 			foreach (Tabs tab in Enum.GetValues(typeof(Tabs)))
 | |
| 			{
 | |
| 				_SaveDict.Add(_Sfd[(int)tab], tab);
 | |
| 				_OpenDict.Add(_Ofd[(int)tab], tab);
 | |
| 				_TextBoxDict.Add(_Tb[(int)tab], tab);
 | |
| 			}
 | |
| 		}
 | |
| 		void SaveFileOk(object sender, CancelEventArgs e)
 | |
| 		{
 | |
| 			SaveIt(_SaveDict[(SaveFileDialog)sender]);
 | |
| 		}
 | |
| 		private void SaveIt(Tabs tab)
 | |
| 		{
 | |
| 			_Ofd[(int)tab].FileName = _Sfd[(int)tab].FileName;
 | |
| 			StreamWriter sw = File.CreateText(_Sfd[(int)tab].FileName);
 | |
| 			sw.Write(_Tb[(int)tab].Text);
 | |
| 			sw.Close();
 | |
| 			_Dirty[(int)tab] = false;
 | |
| 		}
 | |
| 		void OpenFileOk(object sender, CancelEventArgs e)
 | |
| 		{
 | |
| 			OpenIt(_OpenDict[(OpenFileDialog) sender]);
 | |
| 		}
 | |
| 		private void ShowTab(Tabs tabs)
 | |
| 		{
 | |
| 			if (tcResults.SelectedIndex == (int)tabs)
 | |
| 				ShowActiveTab();
 | |
| 			else
 | |
| 				tcResults.SelectedIndex = (int)tabs;// Activate the Approproate Browser
 | |
| 		}
 | |
| 		private void OpenIt(Tabs tab)
 | |
| 		{
 | |
| 			_Sfd[(int)tab].FileName = _Ofd[(int)tab].FileName;
 | |
| 			LoadTB(_Tb[(int)tab],_Ofd[(int)tab].FileName);
 | |
| 			_Dirty[(int)tab] = false;
 | |
| 			tcSource.SelectedIndex = (int)tab;// Activate the Appropriate Tab
 | |
| 			ShowTab(tab);
 | |
| 		}
 | |
| 		private bool SaveChanges(Tabs tab)
 | |
| 		{
 | |
| 			if (!_Dirty[(int)tab]) return true;
 | |
| 			DialogResult dr = MessageBox.Show("Save changes to " + _Name[(int)tab] + " file?", "Save Changes",
 | |
| 				MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
 | |
| 			if (dr == DialogResult.Cancel) return false;
 | |
| 			if (dr == DialogResult.Yes) SaveIt(tab);
 | |
| 			return true;
 | |
| 		}
 | |
| 		private void LoadTB(TextBox tb, string fileName)
 | |
| 		{
 | |
| 				FileInfo f = new FileInfo(fileName);
 | |
| 				StreamReader sr = f.OpenText();
 | |
| 				tb.Text = sr.ReadToEnd();
 | |
| 				sr.Close();
 | |
| 		}
 | |
| 		private void miQuit_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (SaveChanges()) this.Close();
 | |
| 		}
 | |
| 		private bool SaveChanges()
 | |
| 		{
 | |
| 			foreach (Tabs tab in Enum.GetValues(typeof(Tabs)))
 | |
| 				if (!SaveChanges(tab)) return false;
 | |
| 			return true;
 | |
| 		}
 | |
| 		private Tabs TabValue(ToolStripDropDownItem mi)
 | |
| 		{
 | |
| 			return (Tabs)int.Parse(mi.Tag.ToString());
 | |
| 		}
 | |
| 		private void miOpen_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			Tabs tab = TabValue((ToolStripDropDownItem)sender);
 | |
| 			if (SaveChanges(tab))
 | |
| 				_Ofd[(int)tab].ShowDialog();
 | |
| 		}
 | |
| 		private void miRefresh_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			Tabs tab = TabValue((ToolStripDropDownItem)sender);
 | |
| 			OpenIt(tab);
 | |
| 		}
 | |
| 		private void miSaveAs_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			Tabs tab = TabValue((ToolStripDropDownItem)sender);
 | |
| 			_Sfd[(int)tab].ShowDialog();
 | |
| 		}
 | |
| 		private void miSave_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			Tabs tab = TabValue((ToolStripDropDownItem)sender);
 | |
| 			if (_Sfd[(int)tab].FileName == string.Empty)
 | |
| 				_Sfd[(int)tab].ShowDialog();
 | |
| 			else
 | |
| 				SaveIt(tab);
 | |
| 		}
 | |
| 		private string FormatException(Exception ex)
 | |
| 		{
 | |
| 			return string.Format("{0} - {1}", ex.GetType().Name, ex.Message);
 | |
| 		}
 | |
| 		private void ShowException(Exception ex)
 | |
| 		{
 | |
| 			ShowException(ex, null);
 | |
| 		}
 | |
| 		private void ShowException(Exception ex,string sResults)
 | |
| 		{
 | |
| 			if (sResults != null)
 | |
| 			{
 | |
| 				LoadTB(tbSR, sResults);
 | |
| 			}
 | |
| 			StringBuilder sb = new StringBuilder(FormatException(ex));
 | |
| 			sb.Append("\r\n");
 | |
| 			for (; ex.InnerException != null; ex = ex.InnerException)
 | |
| 			{
 | |
| 				sb.Append(FormatException(ex.InnerException));
 | |
| 				sb.Append("\r\n");
 | |
| 			}
 | |
| 			tbSR.SelectionStart = 0;
 | |
| 			tbSR.SelectedText=sb.ToString();
 | |
| 		}
 | |
| 		private void miQuery_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				XmlDocument xd = new XmlDocument();
 | |
| 				xd.LoadXml(tbSX.Text);
 | |
| 				XmlNodeList nl = xd.SelectNodes(tbSS.Text);
 | |
| 				if (nl.Count > 0)
 | |
| 				{
 | |
| 					StringBuilder sb= new StringBuilder("<Results>");
 | |
| 					foreach (XmlNode nd in nl)
 | |
|             sb.Append(string.Format("\r\n  <Result Type='{0}'>{1}</Result>",nd.GetType().Name,nd.OuterXml));
 | |
|           sb.Append("\r\n</Results>");
 | |
| 					tbSR.Text = sb.ToString();
 | |
| 				}
 | |
| 				else
 | |
| 					tbSR.Text = "No nodes found matching criteria";
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				ShowException(ex);
 | |
| 			}
 | |
| 			ShowTab(Tabs.Results);
 | |
| 		}
 | |
| 		private void miTransform_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			string sXSL = Save(tbSS, "tmpS");
 | |
| 			string sXML = Save(tbSX, "tmpX");
 | |
| 			string sResults = Application.StartupPath + "\\" + "tmpR.XML";
 | |
| 			try
 | |
| 			{
 | |
| 				XslCompiledTransform xsl = new XslCompiledTransform();
 | |
| 				xsl.Load(sXSL);
 | |
| 				xsl.Transform(sXML, sResults); // Perform Transform
 | |
| 				LoadTB(tbSR, sResults);
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				ShowException(ex,sResults);
 | |
| 			}
 | |
| 			ShowTab(Tabs.Results);
 | |
| 		}
 | |
| 		private void ShowActiveTab()
 | |
| 		{
 | |
| 			Tabs tab = (Tabs)tcResults.SelectedIndex;
 | |
| 			_Wb[(int)tab].Navigate(Save(_Tb[(int)tab], _Name[(int)tab]));
 | |
| 		}
 | |
| 		private void tcResults_SelectedIndexChanged(object sender, EventArgs e)
 | |
| 		{
 | |
| 			switch (tcResults.SelectedIndex)
 | |
| 			{
 | |
| 				case 3:
 | |
| 					if (wbXSLHelp.Url == null)
 | |
| 						wbXSLHelp.Navigate("http://www.w3schools.com/xsl/default.asp");
 | |
| 					break;
 | |
| 				case 4:
 | |
| 					if (wbXPathHelp.Url == null)
 | |
| 						wbXPathHelp.Navigate("http://www.w3schools.com/xpath/");
 | |
| 					break;
 | |
| 				default:
 | |
| 					ShowActiveTab();
 | |
| 					break;
 | |
| 			}
 | |
| 		}
 | |
| 		private string Extension(string txt)
 | |
| 		{
 | |
| 			if (txt.Substring(0, 5) == "<html") return ".html";
 | |
| 			try
 | |
| 			{
 | |
| 				XmlDocument xd = new XmlDocument();
 | |
| 				xd.LoadXml(txt);
 | |
| 				if (xd.OuterXml == string.Empty) return ".txt";
 | |
| 				else return ".xml";
 | |
| 			}
 | |
| 			catch (Exception)
 | |
| 			{
 | |
| 				return ".txt";
 | |
| 			}
 | |
| 		}
 | |
| 		private string Save(TextBox tb, string path)
 | |
| 		{
 | |
| 			if (tb.Text == string.Empty) return "about:blank";
 | |
| 			string sPath = Application.StartupPath + "\\" + path + Extension(tb.Text) ;
 | |
| 			StreamWriter sw = File.CreateText(sPath);
 | |
| 			sw.Write(tb.Text);
 | |
| 			sw.Close();
 | |
| 			return sPath;
 | |
| 		}
 | |
| 		private void tbTextChanged(object sender, EventArgs e)
 | |
| 		{
 | |
| 			_Dirty[(int)_TextBoxDict[(TextBox)sender]] = true;
 | |
| 		}
 | |
| 
 | |
| 		private void tbSX_MouseUp(object sender, MouseEventArgs e)
 | |
| 		{
 | |
| 			RefreshLabels(tbSX.Text, tbSX.SelectionStart);
 | |
| 		}
 | |
| 		private void RefreshLabels(string s, int location)
 | |
| 		{
 | |
| 			int row = 0;
 | |
| 			int col = 0;
 | |
| 			int ii = 0;
 | |
| 			while (ii < location)
 | |
| 			{
 | |
| 				if (s[ii] == '\r')
 | |
| 				{
 | |
| 					row++;
 | |
| 					col = 0;
 | |
| 				}
 | |
| 				if (s[ii] != '\n') col++;
 | |
| 				ii++;
 | |
| 			}
 | |
| 			RowLbl.Text = string.Format("Row: {0}", row);
 | |
| 			ColLbl.Text = string.Format("Col: {0}", col);
 | |
| 		}
 | |
| 
 | |
| 		private void specialToolStripMenuItem_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			SortedList<int, int> sl = new SortedList<int, int>();
 | |
| 			foreach (Match match in Regex.Matches(tbSX.Text,"&#x([0-9]*);"))
 | |
| 			{
 | |
| 				int num = int.Parse(match.Value.Substring(3).TrimEnd(";".ToCharArray()));
 | |
| 				if(num != 9 && num != 10 && num != 13){
 | |
| 				if (sl.ContainsKey(num)) sl[num] = sl[num] + 1;
 | |
| 				else sl[num] = 1;
 | |
| 				}
 | |
| 			}
 | |
| 			// When all done show the results in a list.
 | |
| 			tbSR.Text = "Special Characters";
 | |
| 			foreach (int key in sl.Keys)
 | |
| 			{
 | |
| 				tbSR.Text += string.Format("\r\n{0} Ctrl-{1} - {2}", key, Convert.ToChar('A' - 1 + key), sl[key]);
 | |
| 			}
 | |
| 			ShowTab(Tabs.Results);
 | |
| 		}
 | |
| 	}
 | |
| } |