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;
 | 
						|
		}
 | 
						|
 	}
 | 
						|
}
 | 
						|
 |