886 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			886 lines
		
	
	
		
			31 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.IO;
 | |
| using LBWordLibrary;
 | |
| using System.Xml;
 | |
| using VEPROMS.CSLA.Library;
 | |
| 
 | |
| namespace Volian.Controls.Library
 | |
| {
 | |
| 	public partial class frmImportWordContents : Form
 | |
| 	{
 | |
| 		LBApplicationClass _WordApp;
 | |
| 		bool _initializing = false;
 | |
| 		private StepRTB _MyStepRTB = null;
 | |
| 
 | |
| 		public StepRTB MyStepRTB
 | |
| 		{
 | |
| 			get { return _MyStepRTB; }
 | |
| 			set { _MyStepRTB = value; }
 | |
| 		}
 | |
| 		public frmImportWordContents()
 | |
| 		{
 | |
| 			_initializing = true;
 | |
| 			InitializeComponent();
 | |
| 			// C2019-021 Allow the Number field to be edited.
 | |
| 			txbWordFile.Text = Properties.Settings.Default.ImportWordFilePath;
 | |
| 			disableButtons();
 | |
| 			_initializing = false;
 | |
| 			// B2019-108 Enable/disable buttons
 | |
| 			btnOpen.Enabled = File.Exists(txbWordFile.Text) && _WordApp == null;
 | |
| 		}
 | |
| 
 | |
| 		private void disableButtons()
 | |
| 		{
 | |
| 			// B2019-108 Enable/disable buttons
 | |
| 			btnOpen.Enabled = File.Exists(txbWordFile.Text) && _WordApp == null; ;
 | |
| 			btnNext.Enabled = false;
 | |
| 			btnPage.Enabled = false;
 | |
| 			btnPrev.Enabled = false;
 | |
| 			btnCurrent.Enabled = false;
 | |
| 			btnInsertNext.Enabled = false;
 | |
| 			btnReplaceNext.Enabled = false;
 | |
| 		}
 | |
| 		private void ofd_FileOk(object sender, CancelEventArgs e)
 | |
| 		{
 | |
| 			_initializing = true;
 | |
| 			txbWordFile.Text = ofd.FileName;
 | |
| 			_initializing = false;
 | |
| 		}
 | |
| 
 | |
| 		private void btnBrowse_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			// if we have a word doc open, then close it and reset WordApp
 | |
| 			if (_WordApp != null)
 | |
| 			{
 | |
| 				try
 | |
| 				{
 | |
| 					_WordApp.Quit();
 | |
| 				}
 | |
| 				catch
 | |
| 				{
 | |
| 					// will error if user already closed Word
 | |
| 				}
 | |
| 				_WordApp = null;
 | |
| 				disableButtons();
 | |
| 			}
 | |
| 			if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
 | |
| 			{
 | |
| 				btnOpen_Click(sender, e);
 | |
| 			}
 | |
| 		}
 | |
| 		private void btnOpen_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (!File.Exists(txbWordFile.Text))
 | |
| 			{
 | |
| 				MessageBox.Show(string.Format("{0}", txbWordFile.Text), "File Does Not Exist", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
 | |
| 				disableButtons();
 | |
| 				return;
 | |
| 			}
 | |
| 			_WordApp = new LBApplicationClass();
 | |
| 			_WordApp.Documents.Open(txbWordFile.Text);
 | |
| 			_WordApp.Visible = true;
 | |
| 			// B2019-108 Enable/disable buttons
 | |
| 			EnableButtons();
 | |
| 			Properties.Settings.Default.ImportWordFilePath = txbWordFile.Text;
 | |
| 			Properties.Settings.Default.Save();
 | |
| 		}
 | |
| 		private void EnableButtons()
 | |
| 		{
 | |
| 			btnOpen.Enabled = File.Exists(txbWordFile.Text) && _WordApp == null; ;
 | |
| 			btnNext.Enabled = true;
 | |
| 			btnPage.Enabled = true;
 | |
| 			btnPrev.Enabled = true;
 | |
| 			btnCurrent.Enabled = true;
 | |
| 			btnInsertNext.Enabled = true;
 | |
| 			btnReplaceNext.Enabled = true;
 | |
| 		}
 | |
| 		private void btnPage_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			_WordApp.Selection.MoveDown(LBWdUnits.wdScreen, 1, 0);
 | |
| 		}
 | |
| 		private void btnPrev_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			// C2019-021 RHM 5/15/2019 Added new methods and properties for Import Word Content
 | |
| 			_WordApp.Selection.MoveUp(LBWdUnits.wdParagraph, 1, 0); // Move to previous paragraph
 | |
| 			_WordApp.Selection.MoveUp(LBWdUnits.wdParagraph, 1, 1); // Select paragraph
 | |
| 			//_WordApp.Selection.MoveEnd(LBWdUnits.wdCharacter, -1); // Move 1 Character Back
 | |
| 			try
 | |
| 			{
 | |
| 				// C2019-021 Use generic function CopyWordText
 | |
| 				CopyWordText();
 | |
| 				if (txbWrdText.Text.TrimEnd("\r\n\f".ToCharArray()) == "")
 | |
| 					btnPrev_Click(sender, e);
 | |
| 				else
 | |
| 					Clipboard.SetText(txbWrdText.Text);
 | |
| 			}
 | |
| 			catch
 | |
| 			{ }
 | |
| 		}
 | |
| 		// C2019-021 RHM 5/15/2019 Added new methods and properties for Import Word Content
 | |
| 		/// <summary>
 | |
| 		/// MoveToNextCell
 | |
| 		/// Find the next Cell including merged cells
 | |
| 		/// Loop through columns then rows
 | |
| 		/// </summary>
 | |
| 		/// <returns>
 | |
| 		/// Yes - if Processed as a cell
 | |
| 		/// No  - Not Processed
 | |
| 		/// </returns>
 | |
| 		private bool MoveToNextCell()
 | |
| 		{
 | |
| 			// Get the row and column for the current selection within the table.
 | |
| 			int rowIndex = _WordApp.Selection.Cells[1].RowIndex;
 | |
| 			int columnIndex = _WordApp.Selection.Cells[1].ColumnIndex;
 | |
| 			// Only do this for tables
 | |
| 			if (_WordApp.Selection.Tables != null && _WordApp.Selection.Tables.Count > 0)
 | |
| 			{
 | |
| 				LBTable tbl = _WordApp.Selection.Tables[1];
 | |
| 				if (tbl.Range.Cells != null && tbl.Range.Cells.Count > 0)
 | |
| 				{
 | |
| 					// Make sure the entire cell is selected
 | |
| 					_WordApp.Selection.SelectCell();
 | |
| 					// Loop through the cells of the table
 | |
| 					for (int i = 1; i < tbl.Range.Cells.Count; i++)
 | |
| 					{
 | |
| 						LBCell myCell = tbl.Range.Cells[i];
 | |
| 						// if this cell has matching indices, then move to the next cell
 | |
| 						if (myCell.RowIndex == rowIndex && myCell.ColumnIndex == columnIndex)
 | |
| 						{
 | |
| 							// Move the Start to the start of the next cell
 | |
|                             _WordApp.Selection.Start = tbl.Range.Cells[i + 1].Range.Start;
 | |
| 							// Select the entire cell_WordApp.Selection.Start =
 | |
| 							_WordApp.Selection.SelectCell();
 | |
| 							return true;  // Cell Found and moved
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			return false; // Cell not found
 | |
| 		}
 | |
| 		private void btnNext_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			// C2019-021 Either move by cells or paragraphs
 | |
| 			if (_WordApp.Selection.Cells != null && _WordApp.Selection.Cells.Count > 0)
 | |
| 			{
 | |
| 				if (!MoveToNextCell())
 | |
| 				{
 | |
| 					_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 2, 0);// Move beyond the table
 | |
| 					_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 1, 1);// Select a Paragraph
 | |
| 				}
 | |
| 			}
 | |
| 			else // not a table
 | |
| 			{
 | |
| 				_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 1, 0); // Move to the next paragraph
 | |
| 				_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 1, 1); // Select a Paragraph
 | |
| 			}
 | |
| 			try
 | |
| 			{
 | |
| 				// C2019-021 Use Generic CopyWordText
 | |
| 				CopyWordText();
 | |
| 				if (_WordApp.Selection.Cells != null && _WordApp.Selection.Cells.Count > 0)
 | |
| 				{
 | |
| 					Clipboard.SetText(txbWrdText.Text);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					// C2019-021 If the word text only contains whitespace skip to next
 | |
| 					if (txbWrdText.Text.TrimEnd("\f\r\n".ToCharArray()) == "")
 | |
| 						btnNext_Click(sender, e);
 | |
| 					else
 | |
| 						Clipboard.SetText(txbWrdText.Text);
 | |
| 				}
 | |
| 			}
 | |
| 			catch
 | |
| 			{ }
 | |
| 		}
 | |
| 		// C2019-021 Generic CopyWordText (Copy Text, Style and Number to fields on form)
 | |
| 		private void CopyWordText()
 | |
| 		{
 | |
| 			// B2019-108 Display Font Size
 | |
| 			// B2019-153 Get Font size from the beginning of the selection if the font size
 | |
| 			// for the entire selection is invalid (999999) (Mixed font sizes)
 | |
| 
 | |
| 			lblFS.Text = GetFontSize() + " Pts";
 | |
| 			txvStyle.Text = _WordApp.Selection.Style.NameLocal;
 | |
| 			txbLevel.Text = _WordApp.Selection.Style.ListLevelNumber.ToString();
 | |
| 			tbxNumber.Text = _WordApp.Selection.Range.ListFormat.ListString;
 | |
| 			// C2019-021 RHM 5/15/2019 Added new methods and properties for Import Word Content
 | |
| 			try
 | |
| 			{
 | |
| 				//Console.WriteLine("Cell Count = {0}", _WordApp.Selection.Cells.Count);
 | |
| 				lblTable.Text = "Table";
 | |
| 				lblTable.FontBold = true;
 | |
| 			}
 | |
| 			catch
 | |
| 			{
 | |
| 				lblTable.Text = "Not Table";
 | |
| 				lblTable.FontBold = false;
 | |
| 			}
 | |
| 			// B2019-108 Replace Special Characters
 | |
| 			string txt = ShowText(_WordApp.Selection.Text.TrimEnd("\r\a".ToCharArray())
 | |
| 				.Replace("\x1D", "-")// Hyphen
 | |
| 				.Replace("\x1E", "-")// Hyphen
 | |
| 				.Replace("\x2013", "-")// Hyphen
 | |
| 				.Replace("\xa0", " ")// Space
 | |
| 				.Replace("\x0b", " ")// Space Soft Return
 | |
| 				.Replace("\x201C", "\"")// Space
 | |
| 				.Replace("\x201D", "\"")// Space
 | |
| 				.Replace("\x09INITIAL", "")// Space
 | |
| 				);
 | |
| 			if (txt.Contains("\x09_____")) // Tab Signoff
 | |
| 				txt = txt.Substring(0, txt.IndexOf("\x09_____")).TrimEnd(" \x09".ToCharArray());// Trim spaces and Tabs
 | |
| 			txbWrdText.Text = txt;
 | |
| 
 | |
| 			_WordApp.Activate();
 | |
| 		}
 | |
| 		// B2019-153 Get Font size from the beginning of the selection if the font size
 | |
| 		// for the entire selection is invalid (999999) (Mixed font sizes)
 | |
| 
 | |
| 		private string GetFontSize()
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				float retval = _WordApp.Selection.Font.Size;
 | |
| 				if (retval > 14)
 | |
| 				{
 | |
| 					LBRange rng = _WordApp.Selection.Range;
 | |
| 					rng.End = rng.Start;
 | |
| 					retval = rng.Font.Size;
 | |
| 					if (retval > 14)
 | |
| 						retval = 12;
 | |
| 				}
 | |
| 				return retval.ToString();
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				return "12";
 | |
| 			}
 | |
| 		}
 | |
| 		// C2019-021 RHM 5/15/2019 Added newe methods and properties for Import Word Content
 | |
| 		private string ShowText(string txt)
 | |
| 		{
 | |
| 			//  This was for debugging
 | |
| 			//StringBuilder sb = new StringBuilder();
 | |
| 			//foreach (char c in txt)
 | |
| 			//	if (((int)c) >= ' ' && ((int)c) < '\x7F')
 | |
| 			//		sb.Append(c);
 | |
| 			//	else
 | |
| 			//		sb.Append(string.Format("\\u{0:X4} ", ((int)c)));
 | |
| 			//return sb.ToString();
 | |
| 			return txt;
 | |
| 		}
 | |
| 		private void txbWordFile_TextChanged(object sender, EventArgs e)
 | |
| 		{
 | |
| 			// B2019-108 Enable/disable buttons
 | |
| 			btnOpen.Enabled = File.Exists(txbWordFile.Text) && _WordApp == null;
 | |
| 		}
 | |
| 		private void frmImportWordContents_FormClosing(object sender, FormClosingEventArgs e)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				if (_WordApp != null)
 | |
| 					_WordApp.Quit();
 | |
| 				// B2019-108 Reset WordApp when closed.
 | |
| 				_WordApp = null;
 | |
| 			}
 | |
| 			catch
 | |
| 			{
 | |
| 				// incase user manually closed word
 | |
| 			}
 | |
| 		}
 | |
| 		//C2019-021 Remove old method.
 | |
| 		//private void btnNextIns_Click(object sender, EventArgs e)
 | |
| 		//{
 | |
| 		//	if (MyStepRTB != null)
 | |
| 		//	{
 | |
| 		//		if (MyStepRTB.MyItemInfo.IsSection)
 | |
| 		//		{
 | |
| 		//			MyStepRTB.RtbSendKeys("^{DOWN}"); // <Ctrl><down arrow> - next edit window
 | |
| 		//			MyStepRTB.RtbSendKeys("^+b"); // insert previous
 | |
| 		//		}
 | |
| 		//		else
 | |
| 		//			MyStepRTB.RtbSendKeys("^+i"); // insert next (same type and level)
 | |
| 		//		MyStepRTB.RtbSendKeys("^v");  // clipboard paste
 | |
| 		//		Application.DoEvents();
 | |
| 		//	}
 | |
| 		//	this.Focus(); // set focus back to this form
 | |
| 		//}
 | |
| 		//private void btnNextRpl_Click(object sender, EventArgs e)
 | |
| 		//{
 | |
| 		//	if (MyStepRTB != null)
 | |
| 		//	{
 | |
| 		//		MyStepRTB.RtbSendKeys("^{DOWN}"); // <Ctrl><down arrow> - next edit window
 | |
| 		//		MyStepRTB.RtbSendKeys("^a"); // select all
 | |
| 		//		MyStepRTB.RtbSendKeys("^v");  // clipboard paste
 | |
| 		//		Application.DoEvents();
 | |
| 		//	}
 | |
| 		//	this.Focus(); // set focus back to this form
 | |
| 		//}
 | |
| 		// C2019-021 New function to replace the PROMS text with the word text and move to the next paragraph in word.
 | |
| 		private void btnReplaceNext_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (MyStepRTB != null)
 | |
| 			{
 | |
| 				if (MyStepRTB.Parent is VlnFlexGrid)//Replace text in a Grid (Table cell)
 | |
| 				{
 | |
| 					VlnFlexGrid vg = MyStepRTB.Parent as VlnFlexGrid;
 | |
| 					vg.StartEditing();
 | |
| 					MyStepRTB.Text = txbWrdText.Text;
 | |
| 					// B2019-108 Set font for table cell
 | |
| 					if (MyStepRTB.Parent is VlnFlexGrid && lblFS.Text != "FS")
 | |
| 					{
 | |
| 						Font fs = MyStepRTB.Font;
 | |
| 						fs = new Font(fs.FontFamily, float.Parse(lblFS.Text.Replace("Pts", "")), fs.Style);
 | |
| 						MyStepRTB.Font = fs;
 | |
| 					}
 | |
| 					vg[vg.Row, vg.Col] = MyStepRTB.Rtf;
 | |
| 					vg.FinishEditing(false);
 | |
| 				}
 | |
| 				else if (MyStepRTB.MyItemInfo.IsSection && tbxNumber.Text != "")
 | |
| 				{
 | |
| 					using (VEPROMS.CSLA.Library.Item ii = MyStepRTB.MyItemInfo.Get())
 | |
| 					{
 | |
| 						ii.MyContent.Text = txbWrdText.Text.Trim("\r\n\f".ToCharArray());
 | |
| 						ii.MyContent.Number = tbxNumber.Text;
 | |
| 						ii.MyContent.Save();
 | |
| 					}
 | |
| 					EditItem ei = MyStepRTB.Parent as EditItem;
 | |
| 					ei.RefreshTab();
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					MyStepRTB.Text = txbWrdText.Text.Trim("\r\n".ToCharArray());
 | |
| 					MyStepRTB.Select(MyStepRTB.TextLength, 0);
 | |
| 				}
 | |
| 				btnNext_Click(sender, e);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// C2019-021 New function to insert the Word text into PROMS and move to the next paragraph in Word
 | |
| 		private void btnInsertNext_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (MyStepRTB != null)
 | |
| 			{
 | |
| 				MyStepRTB.SelectedText = txbWrdText.Text.Trim("\r\n\f".ToCharArray());
 | |
| 				MyStepRTB.Select(MyStepRTB.TextLength, 0);
 | |
| 				btnNext_Click(sender, e);
 | |
| 			}
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		// C2019-021 New Function to create a after node in PROMS
 | |
| 		private void btnAfter_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (MyStepRTB != null)
 | |
| 			{
 | |
| 				if (MyStepRTB.Parent is VlnFlexGrid)
 | |
| 				{
 | |
| 					VlnFlexGrid vg = MyStepRTB.Parent as VlnFlexGrid;
 | |
| 					//vg.FinishEditing(false);
 | |
| 					vg.SelectNextCell();
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					EditItem ei = MyStepRTB.Parent as EditItem;
 | |
| 					if (ei != null)
 | |
| 					{
 | |
| 						ei.AddSiblingAfter();
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// C2019-021 Add a New Section in PROMS (Default Type = 10000)
 | |
| 		private void btnSect_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (MyStepRTB != null)
 | |
| 			{
 | |
| 				EditItem ei = MyStepRTB.Parent as EditItem;
 | |
| 				if (ei.MyItemInfo.IsProcedure)
 | |
| 				{
 | |
| 					ei.AddChild(VEPROMS.CSLA.Library.E_FromType.Section, 10000);// TODO: Need Type for Procedure Steps
 | |
| 					return;
 | |
| 				}
 | |
| 				while (ei != null && !ei.MyItemInfo.IsSection)
 | |
| 					if (ei.MyParentEditItem != null)
 | |
| 						ei = ei.MyParentEditItem;
 | |
| 					else
 | |
| 						ei = ei.MyPreviousEditItem;
 | |
| 				if (ei != null)
 | |
| 				{
 | |
| 					ei.AddSiblingAfter();
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		// C201-021 New Function Add a new High level step
 | |
| 		private void btnHigh_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (MyStepRTB != null)
 | |
| 			{
 | |
| 				EditItem ei = GetEditItem(MyStepRTB);
 | |
| 				if (ei != null && ei.MyItemInfo.IsSection)
 | |
| 				{
 | |
| 					ei.AddChild(VEPROMS.CSLA.Library.E_FromType.Step, 20002);
 | |
| 					return;
 | |
| 				}
 | |
| 				while (ei != null && !ei.MyItemInfo.IsHigh)
 | |
| 					if (ei.MyParentEditItem != null)
 | |
| 						ei = ei.MyParentEditItem;
 | |
| 					else
 | |
| 						ei = ei.MyPreviousEditItem;
 | |
| 				if (ei != null)
 | |
| 				{
 | |
| 					ei.AddSiblingAfter();
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		private EditItem GetEditItem(Control Ctrl)
 | |
| 		{
 | |
| 			while (Ctrl != null)
 | |
| 			{
 | |
| 				Ctrl = Ctrl.Parent;
 | |
| 				if (Ctrl is EditItem) return Ctrl as EditItem;
 | |
| 			}
 | |
| 			return null;
 | |
| 		}
 | |
| 		// C2019-021 New Function Add a new sequential substep
 | |
| 		private void btnSEQ_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (MyStepRTB != null)
 | |
| 			{
 | |
| 				EditItem ei = MyStepRTB.Parent as EditItem;
 | |
| 				ei.AddChild(VEPROMS.CSLA.Library.E_FromType.Step, 20001);
 | |
| 			}
 | |
| 		}
 | |
| 		// C2019-021 New Function Add a new parent step after
 | |
| 		private void btnParentAfter_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (MyStepRTB != null)
 | |
| 			{
 | |
| 				EditItem ei = MyStepRTB.Parent as EditItem;
 | |
| 				while (ei.MyPreviousEditItem != null)
 | |
| 					ei = ei.MyPreviousEditItem;
 | |
| 				if (ei != null && ei.MyParentEditItem != null)
 | |
| 				{
 | |
| 					ei.MyParentEditItem.AddSiblingAfter();
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		// C2019-021 New Function Split the text in the current proms window into two
 | |
| 		// The text before the selection is kept in the current PROMS window
 | |
| 		// The selected text is deleted
 | |
| 		// the text after the selection is cut to the clipboard
 | |
| 		private void btnSplit_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (MyStepRTB != null)
 | |
| 			{
 | |
| 				MyStepRTB.SelectedText = "";
 | |
| 				MyStepRTB.Select(MyStepRTB.SelectionStart, MyStepRTB.TextLength - MyStepRTB.SelectionStart);
 | |
| 				Clipboard.SetText(MyStepRTB.SelectedText);
 | |
| 				MyStepRTB.SelectedText = "";
 | |
| 			}
 | |
| 		}
 | |
| 		// C2019-021 New Function - Performs a paste in the current window
 | |
| 		private void btnPaste_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (MyStepRTB != null)
 | |
| 			{
 | |
| 				MyStepRTB.SelectedText = Clipboard.GetText();
 | |
| 			}
 | |
| 		}
 | |
| 		// C2019-021 RHM 5/15/2019 Added new methods and properties for Import Word Content
 | |
| 		private void btnCurrent_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			// B2019-108 Corrected curent button code
 | |
| 			//_WordApp.Selection.MoveUp(LBWdUnits.wdParagraph, 1, 0); // Select paragraph
 | |
| 			//_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 1, 1); // Select paragraph
 | |
| 			//_WordApp.Selection.MoveEnd(LBWdUnits.wdCharacter, -1); // Exclude the last character
 | |
| 			try
 | |
| 			{
 | |
| 				_WordApp.Selection.Cells[1].Range.Select();
 | |
| 			}
 | |
| 			catch
 | |
| 			{
 | |
| 				_WordApp.Selection.Paragraphs[1].Range.Select();
 | |
| 			}
 | |
| 			try
 | |
| 			{
 | |
| 				// C2019-021 Use Generic CopyWordText
 | |
| 				CopyWordText();
 | |
| 				// C2019-021If the word text only contains whitespace skip to next
 | |
| 				//if (txbWrdText.Text.TrimEnd("\f\r\n\a".ToCharArray()) == "")
 | |
| 				//	btnNext_Click(sender, e);
 | |
| 				//else
 | |
| 				Clipboard.SetText(txbWrdText.Text);
 | |
| 			}
 | |
|             catch
 | |
|             {
 | |
|                 // Ask RHM what to do here 2/28/2020 JBS
 | |
|             }
 | |
| 		}
 | |
| 		//private void btnTest_Click(object sender, EventArgs e)
 | |
| 		//{
 | |
| 		//	if (!MoveToNextCell())
 | |
| 		//	{
 | |
| 		//		_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 2, 0);
 | |
| 		//		_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 1, 1);
 | |
| 		//	}
 | |
| 		//	_WordApp.Activate();
 | |
| 		//	//int cols = _WordApp.Selection.Tables[1].Columns.Count;
 | |
| 		//}
 | |
| 
 | |
| 		// B2019-108 Show special Characters
 | |
| 		private void txbWrdText_TextChanged(object sender, EventArgs e)
 | |
| 		{
 | |
| 			txbImport.Text = fixText(txbWrdText.Text);
 | |
| 		}
 | |
| 
 | |
| 		private string fixText(string txt)
 | |
| 		{
 | |
| 			StringBuilder sb = new StringBuilder();
 | |
| 			foreach (char c in txt)
 | |
| 			{
 | |
| 				int ic = (int)c;
 | |
| 				if (ic < 32 || ic > '\x7F')
 | |
| 				{
 | |
| 					sb.Append(string.Format("[x{0:x2}]", ic));
 | |
| 					//MessageBox.Show(string.Format("[x{0:x2} - {1}]", ic, txt), "Special Character");
 | |
| 				}
 | |
| 				else
 | |
| 					sb.Append(c);
 | |
| 			}
 | |
| 			return sb.ToString();
 | |
| 		}
 | |
| 
 | |
| 		// B2019-108 Handle WordApp status
 | |
| 		private void frmImportWordContents_Activated(object sender, EventArgs e)
 | |
| 		{
 | |
| 			// B2019-108 Corrected curent button code
 | |
| 			//_WordApp.Selection.MoveUp(LBWdUnits.wdParagraph, 1, 0); // Select paragraph
 | |
| 			//_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 1, 1); // Select paragraph
 | |
| 			//_WordApp.Selection.MoveEnd(LBWdUnits.wdCharacter, -1); // Exclude the last character
 | |
| 			try
 | |
| 			{
 | |
| 				if (_WordApp != null || _WordApp.WindowState == LBWdWindowState.wdWindowStateMinimize)
 | |
| 					_WordApp.WindowState = LBWdWindowState.wdWindowStateNormal;
 | |
| 			}
 | |
| 			catch
 | |
| 			{
 | |
| 				_WordApp = null;
 | |
| 				disableButtons();
 | |
| 			}
 | |
| 		}
 | |
| 		//private void btnTest_Click(object sender, EventArgs e)
 | |
| 		//{
 | |
| 		//	if (!MoveToNextCell())
 | |
| 		//	{
 | |
| 		//		_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 2, 0);
 | |
| 		//		_WordApp.Selection.MoveDown(LBWdUnits.wdParagraph, 1, 1);
 | |
| 		//	}
 | |
| 		//	_WordApp.Activate();
 | |
| 		//	//int cols = _WordApp.Selection.Tables[1].Columns.Count;
 | |
| 		//}
 | |
| 
 | |
| 		private void btnTableConvert_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			string xml = ConvertWordToXML();
 | |
| 			if (xml == null)
 | |
| 			{
 | |
| 				MessageBox.Show("Make sure that the Selection is within a table in Word");
 | |
| 				return;
 | |
| 			}
 | |
| 			XmlDocument xd = new XmlDocument();
 | |
| 			xml = xml.Replace("\x0B", "\r\n");
 | |
| 			try
 | |
| 			{
 | |
| 				xd.LoadXml(xml);
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message);
 | |
| 				StringBuilder sb = new StringBuilder();
 | |
| 				foreach (char c in xml)
 | |
| 				{
 | |
| 					int ic = c;
 | |
| 					if (ic < 32 || ic > 128)
 | |
| 						sb.Append(string.Format("<<<<{0:X4}>>>>", ic));
 | |
| 					else
 | |
| 						sb.Append(c);
 | |
| 				}
 | |
| 				MessageBox.Show(ex.Message + "\r\n" + sb.ToString(), ex.GetType().Name);
 | |
| 				return;
 | |
| 			}
 | |
| 			LoadTable2(xd.DocumentElement);
 | |
| 			int type = 20008;
 | |
| 			ItemInfo myTable;
 | |
| 			if(MyStepRTB.MyItemInfo.IsTable)
 | |
| 			{
 | |
| 				using( Item itm = MyStepRTB.MyItemInfo.Get())
 | |
| 				{
 | |
| 					itm.MyContent.MyGrid.Data = TblFlexGrid.GetXMLData();
 | |
| 					itm.MyContent.Text= TblFlexGrid.GetSearchableText();
 | |
| 					itm.Save();
 | |
| 					ItemInfo.Refresh(itm);
 | |
| 					ContentInfo.Refresh(itm.MyContent);
 | |
| 					GridInfo.Refresh(itm.MyContent.MyGrid);
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 			//using (Step stp = Step.MakeStep(MyStepRTB.MyItemInfo, null, null, TblFlexGrid.GetSearchableText() , 20008, E_FromType.Table))
 | |
| 			//{
 | |
| 			//	myTable = ItemInfo.Get(stp.ItemID);
 | |
| 			//	Grid.MakeGrid(stp.MyContent, TblFlexGrid.GetXMLData(), "");
 | |
| 			//}
 | |
| 			//MyStepRTB.MyItemInfo.MyContent.RefreshContentParts();
 | |
| 			EditItem ei = MyStepRTB.Parent as EditItem;
 | |
| 			ei.AddChild(E_FromType.Table, 20008, TblFlexGrid);
 | |
| 			if (ei != null) ei.SetAllTabs();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private string ConvertWordToXML()
 | |
| 		{
 | |
| 			string sXML = null;
 | |
|             try
 | |
|             {
 | |
|                 DateTime tstart = DateTime.Now;
 | |
|                 if (_WordApp.Selection.Tables != null && _WordApp.Selection.Tables.Count > 0)
 | |
|                 {
 | |
|                     LBTable tbl = _WordApp.Selection.Tables[1];
 | |
|                     if (tbl.Range.Cells != null && tbl.Range.Cells.Count > 0)
 | |
|                     {
 | |
|                         // size variables to match table row and column dimensions
 | |
|                         int[] Wcol = new int[tbl.Columns.Count];
 | |
|                         int[,] Wcell = new int[tbl.Rows.Count, tbl.Columns.Count];
 | |
|                         int[,] Hcell = new int[tbl.Rows.Count, tbl.Columns.Count];
 | |
|                         int[,] SpanC = new int[tbl.Rows.Count, tbl.Columns.Count];
 | |
|                         int[,] SpanR = new int[tbl.Rows.Count, tbl.Columns.Count];
 | |
| 
 | |
|                         DateTime tend = DateTime.Now; Console.WriteLine("{0} before Loop", TimeSpan.FromTicks(tend.Ticks - tstart.Ticks).TotalMilliseconds); tstart = tend;
 | |
|                         pbTable.Maximum = tbl.Columns.Count * tbl.Rows.Count * tbl.Range.Cells.Count;
 | |
|                         pbTable.Value = 0;
 | |
|                         int iR = 0;
 | |
|                         int iC = 0;
 | |
|                         // capture widths for valid cells
 | |
|                         for (int i = 1; i <= tbl.Range.Cells.Count; i++)
 | |
|                         {
 | |
|                             //LBCell myCell = tbl.Range.Cells[i];
 | |
|                             // convert points to pixels and save value
 | |
|                             int w = (int)(tbl.Range.Cells[i].Width * 8 / 6);
 | |
|                             iC = tbl.Range.Cells[i].ColumnIndex - 1;
 | |
|                             Wcell[tbl.Range.Cells[i].RowIndex - 1, iC] = w;
 | |
|                             Hcell[tbl.Range.Cells[i].RowIndex - 1, iC] = (int)(tbl.Range.Cells[i].Height * 8 / 6);
 | |
|                             if (Wcol[iC] == 0)
 | |
|                             {
 | |
|                                 Wcol[iC] = w;
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 if (Wcol[iC] > w)
 | |
|                                 {
 | |
|                                     Wcol[iC] = w;
 | |
|                                 }
 | |
|                             }
 | |
|                         }
 | |
|                         tend = DateTime.Now; Console.WriteLine("{0} before table width", TimeSpan.FromTicks(tend.Ticks - tstart.Ticks).TotalMilliseconds); tstart = tend;
 | |
|                         int TableWidth = 0;
 | |
|                         for (iC = 0; iC < tbl.Columns.Count; iC++)
 | |
|                         {
 | |
|                             TableWidth = TableWidth + Wcol[iC];
 | |
|                         }
 | |
|                         tend = DateTime.Now; Console.WriteLine("{0} before Rollup columns", TimeSpan.FromTicks(tend.Ticks - tstart.Ticks).TotalMilliseconds); tstart = tend;
 | |
|                         // roll up columns
 | |
|                         for (iR = 0; iR < tbl.Rows.Count; iR++)
 | |
|                         {
 | |
|                             int tmp = 0;
 | |
|                             for (iC = 0; iC < tbl.Columns.Count; iC++)
 | |
|                             {
 | |
|                                 if (Wcell[iR, iC] > TableWidth)
 | |
|                                 {
 | |
|                                     Wcell[iR, iC] = Wcol[iC];
 | |
|                                     SpanC[iR, iC] = 1;
 | |
|                                 }
 | |
|                                 else if (Wcell[iR, iC] > 0)
 | |
|                                 {
 | |
|                                     SpanC[iR, iC] = 1;
 | |
|                                     tmp = Wcell[iR, iC] - Wcol[iC];
 | |
|                                     while (tmp > 0)
 | |
|                                     {
 | |
|                                         for (int i = tbl.Columns.Count - 1; i > iC + 1; i--)
 | |
|                                         {
 | |
|                                             Wcell[iR, i] = Wcell[iR, i - 1];
 | |
|                                             Wcell[iR, i - 1] = 0;
 | |
|                                         }
 | |
|                                         tmp = tmp - Wcol[iC + SpanC[iR, iC]];
 | |
|                                         SpanC[iR, iC]++;
 | |
|                                     }
 | |
|                                     iC = iC + SpanC[iR, iC] - 1;
 | |
|                                 }
 | |
|                             }
 | |
|                         }
 | |
|                         tend = DateTime.Now; Console.WriteLine("{0} before Rollup rows", TimeSpan.FromTicks(tend.Ticks - tstart.Ticks).TotalMilliseconds); tstart = tend;
 | |
|                         //roll up row spans
 | |
|                         for (iC = 0; iC < tbl.Columns.Count; iC++)
 | |
|                         {
 | |
|                             int LastGood = 0;
 | |
|                             for (iR = 0; iR < tbl.Rows.Count; iR++)
 | |
|                             {
 | |
|                                 if (Wcell[iR, iC] > 0)
 | |
|                                 {
 | |
|                                     // valid cell
 | |
|                                     LastGood = iR;
 | |
|                                     SpanR[LastGood, iC] = 1;
 | |
|                                 }
 | |
|                                 else
 | |
|                                 {
 | |
|                                     // invalid cell
 | |
|                                     SpanR[LastGood, iC]++;
 | |
|                                 }
 | |
|                             }
 | |
|                         }
 | |
|                         tend = DateTime.Now; Console.WriteLine("{0} before Build", TimeSpan.FromTicks(tend.Ticks - tstart.Ticks).TotalMilliseconds); tstart = tend;
 | |
| 
 | |
|                         // build xml for this table
 | |
| 
 | |
|                         iR = -1;
 | |
|                         int offset = 0;
 | |
|                         sXML = "<table>";
 | |
|                         for (int i = 1; i <= tbl.Range.Cells.Count; i++)
 | |
|                         {
 | |
| 
 | |
|                             LBCell myCell = tbl.Range.Cells[i];
 | |
|                             // if this cell has matching indices save its text
 | |
|                             if (iR != myCell.RowIndex - 1)
 | |
|                             {
 | |
|                                 // this is a new row
 | |
|                                 if (myCell.RowIndex > 1)
 | |
|                                  {
 | |
|                                     // close previous row
 | |
|                                     sXML += "</tr>";
 | |
|                                 }
 | |
|                                 // start new row
 | |
|                                 sXML += "<tr>";
 | |
|                                 iR = myCell.RowIndex - 1;
 | |
|                                 offset = 0;
 | |
|                             }
 | |
|                             sXML += "<td";
 | |
|                             iC = myCell.ColumnIndex - 1 + offset;
 | |
|                             if (SpanR[iR, iC] > 1)
 | |
|                             {
 | |
|                                 sXML += " rowspan=\"" + SpanR[iR, iC] + "\"";
 | |
|                             }
 | |
|                             if (SpanC[iR, iC] > 1)
 | |
|                             {
 | |
|                                 sXML += " colspan=\"" + SpanC[iR, iC] + "\"";
 | |
|                                 offset += SpanC[iR, iC] - 1;
 | |
|                             }
 | |
|                             else if (Wcol[iC] > 0)
 | |
|                             {
 | |
|                                 sXML += " width=\"" + Wcol[iC] + "\"";
 | |
|                                 Wcol[iC] = Wcol[iC] * -1;
 | |
|                             }
 | |
|                             string textalign = "";
 | |
|                             string ha;
 | |
|                             switch (myCell.Range.ParagraphFormat.Alignment)
 | |
|                             {
 | |
|                                 case LBWdParagraphAlignment.wdAlignParagraphCenter:
 | |
|                                     textalign += "Center";
 | |
|                                     ha = "\\qc";
 | |
|                                     break;
 | |
|                                 case LBWdParagraphAlignment.wdAlignParagraphRight:
 | |
|                                     textalign += "Right";
 | |
|                                     ha = "\\qr";
 | |
|                                     break;
 | |
|                                 default:
 | |
|                                     textalign += "Left";
 | |
|                                     ha = "\\ql";
 | |
|                                     break;
 | |
|                             }
 | |
|                             switch (myCell.VerticalAlignment)
 | |
|                             {
 | |
|                                 case LBWdCellVerticalAlignment.wdCellAlignVerticalBottom:
 | |
|                                     textalign += "Bottom";
 | |
|                                     break;
 | |
|                                 case LBWdCellVerticalAlignment.wdCellAlignVerticalCenter:
 | |
|                                     textalign += "Center";
 | |
|                                     break;
 | |
|                                 case default(LBWdCellVerticalAlignment):
 | |
|                                     textalign += "Top";
 | |
|                                     break;
 | |
|                             }
 | |
|                             sXML += " textalign=\"" + textalign + "\"";
 | |
|                             sXML += ">";
 | |
|                             // select text from current cell
 | |
|                             _WordApp.Selection.Start = myCell.Range.Start;
 | |
|                             _WordApp.Selection.SelectCell();
 | |
|                             _WordApp.Selection.End = _WordApp.Selection.End - 1;
 | |
|                             if (_WordApp.Selection.End > _WordApp.Selection.Start)
 | |
|                             {
 | |
|                                 // capture formatted text
 | |
|                                 StepRTB rtbStep = new StepRTB();
 | |
|                                 _WordApp.Selection.Copy();
 | |
|                                 rtbStep.Paste();
 | |
|                                 rtbStep.SelectAll();
 | |
|                                 Console.WriteLine("RTF before {0}", rtbStep.Rtf);
 | |
|                                 Console.WriteLine("RTF after {0}", rtbStep.Rtf);
 | |
|                                 // rtbStep.Rtf.Replace("\\f1 P\\f0 ", "\\u10004?"); // check mark within parenthesis
 | |
|                                 string strp = rtbStep.Rtf.Replace("\\par\r\n", "!!!");
 | |
|                                 strp = DisplayText.StaticStripRtfCommands(strp, true);
 | |
|                                 Console.WriteLine("RTF clean {0}", strp);
 | |
|                                 strp = strp.Remove(strp.LastIndexOf("!!!"));
 | |
|                                 StringBuilder sb = new StringBuilder();
 | |
|                                 sb.Append(strp);
 | |
|                                 sb.Replace("!!!", "\\par");
 | |
|                                 // clean up special characters
 | |
|                                 {
 | |
|                                     sb.Replace("\x1D", "-");// Hyphen
 | |
|                                     sb.Replace("\x1E", "-");// Hyphen
 | |
|                                     sb.Replace("\x2013", "-");// Hyphen
 | |
|                                     sb.Replace("\xa0", " ");// Space
 | |
|                                     sb.Replace("\x0b", " ");// Space Soft Return
 | |
|                                     sb.Replace("\x201C", "\"");// Space
 | |
|                                     sb.Replace("\x201D", "\"");// Space
 | |
|                                     sb.Replace("\x09INITIAL", "");// Space
 | |
|                                     sb.Replace("\x09_____", ""); // Tab Signoff
 | |
|                                     //sb.Replace("(P)", "(\\u10004?)"); // check mark within parenthesis
 | |
|                                     //sb.Replace("\\u9633?", "□"); //box
 | |
|                                 }
 | |
|                                 // save resulting text in xml structure
 | |
|                                 sXML += "<p>" + ha + sb + "</p></td>";
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 sXML += "<p></p></td>";
 | |
|                             }
 | |
|                         }
 | |
|                         if (iR >= 0)
 | |
|                         {
 | |
|                             // at least one row hase been written so close the last row
 | |
|                             sXML += "</tr>";
 | |
|                         }
 | |
|                         sXML += "</table>";
 | |
|                         tend = DateTime.Now; Console.WriteLine("{0} After Build", TimeSpan.FromTicks(tend.Ticks - tstart.Ticks).TotalMilliseconds); tstart = tend;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 while (ex != null)
 | |
|                 {
 | |
|                     Console.WriteLine("Column{0} - {1}", ex.GetType().Name, ex.Message);
 | |
|                     ex = ex.InnerException;
 | |
|                 }
 | |
|             }
 | |
| 			return sXML;
 | |
| 		}
 | |
|  	}
 | |
| }
 | |
| 
 |