461 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			461 lines
		
	
	
		
			16 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 VEPROMS.CSLA.Library;
 | |
| using Volian.Base.Library;
 | |
| using JR.Utils.GUI.Forms;
 | |
| 
 | |
| namespace Volian.Controls.Library
 | |
| {
 | |
| 	// C2023-016 - Upgrade - have Find/Replace spin through all of the Step Editor sections within the current procedure
 | |
| 	public partial class FindReplace : DevComponents.DotNetBar.Office2007Form
 | |
| 	{
 | |
| 		private bool doingfind = false;
 | |
| 		private bool findingbookmarks = false;
 | |
| 		private bool _FoundIt = false;
 | |
| 		private ItemInfo _StartingItemInfo = null;// C2023-016 used to remember where we started doing the Find/Replace
 | |
| 		public bool FoundIt
 | |
| 		{
 | |
| 			get { return _FoundIt; }
 | |
| 			set { _FoundIt = value; }
 | |
| 		}
 | |
| 		private bool IsFound
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				// B2022-067 get display text version to convert 8209 dash to normal (keyboard) dash
 | |
| 				string selStr = ItemInfo.ConvertToDisplayText(MyEditItem.MyStepRTB.SelectedText);
 | |
| 				if (!cbxCaseSensitive.Checked)
 | |
| 					return selStr.ToUpper() == cmboFindText.Text.ToUpper();
 | |
| 				else
 | |
| 					return selStr == cmboFindText.Text;
 | |
| 			}
 | |
| 		}
 | |
| 		private EditItem _MyEditItem;
 | |
| 		public EditItem MyEditItem
 | |
| 		{
 | |
| 			get { return _MyEditItem; }
 | |
| 			set
 | |
| 			{
 | |
| 				_MyEditItem = value;
 | |
| 				if (_MyEditItem == null) return;
 | |
| 				_MyDocVersion = _MyEditItem.MyItemInfo.MyProcedure.ActiveParent as DocVersionInfo;
 | |
| 				SetupContextMenu();
 | |
| 			}
 | |
| 		}
 | |
| 		private DocVersionInfo _MyDocVersion;
 | |
| 		public DocVersionInfo Mydocversion
 | |
| 		{
 | |
| 			get { return _MyDocVersion; }
 | |
| 			set {_MyDocVersion = value;	}
 | |
| 		}
 | |
| 		private DisplayBookMarks _myDisplayBookMarks;
 | |
| 
 | |
| 		public DisplayBookMarks MyDisplayBookMarks
 | |
| 		{
 | |
| 			get { return _myDisplayBookMarks; }
 | |
| 			set { _myDisplayBookMarks = value; }
 | |
| 		}
 | |
| 
 | |
| 		private bool _InApproved;
 | |
| 
 | |
| 		public bool InApproved
 | |
| 		{
 | |
| 			get { return _InApproved; }
 | |
| 			set { _InApproved = value; }
 | |
| 		}
 | |
| 		public FindReplace()
 | |
| 		{
 | |
| 			InitializeComponent();
 | |
| 			LoadFindReplaceTextListBox();
 | |
| 			cmbScope.SelectedIndex = 0;
 | |
| 			btnBookMrkAll.Enabled = false;
 | |
| 			btnFindNext.Enabled = false;
 | |
| 			btnReplace.Enabled = false;
 | |
| 			btnRplAll.Enabled = false;
 | |
| 			cmboFindText.Focus();
 | |
| 		}
 | |
| 		private void LoadFindReplaceTextListBox()
 | |
| 		{
 | |
| 			// Setup cmboFindText Combo box
 | |
| 			cmboFindText.Items.Clear();
 | |
| 			if (Properties.Settings.Default["FindTextList"] != null && Properties.Settings.Default.FindTextList.Count > 0)
 | |
| 			{
 | |
| 				foreach (string str in Properties.Settings.Default.FindTextList)
 | |
| 					cmboFindText.Items.Add(str);
 | |
| 			}
 | |
| 			// Setup cmboReplaceText Combo box
 | |
| 			cmboReplaceText.Items.Clear();
 | |
| 			if (Properties.Settings.Default["ReplaceTextList"] != null && Properties.Settings.Default.ReplaceTextList.Count > 0)
 | |
| 			{
 | |
| 				foreach (string str in Properties.Settings.Default.ReplaceTextList)
 | |
| 					cmboReplaceText.Items.Add(str);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// bug fix: B2016-107, when Find/Replace is initially opened, set the cursor focus to the Find Text box (called from frmVEPROMS.cs)
 | |
| 		public void SetFocusToTextBox()
 | |
| 		{
 | |
| 			cmboFindText.Focus();
 | |
| 		}
 | |
| 
 | |
| 		private bool DoingClick = false; // Don't allow a button to be clicked until processing is complete for the last button
 | |
| 
 | |
| 		private void btnReplace_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (DoingClick) return;// Don't allow a button to be clicked until processing is complete for the last button
 | |
| 			DoingClick = true;// We started processing a click
 | |
| 			DoReplace();
 | |
| 			DoingClick = false;// we're done processing the click
 | |
| 		}
 | |
| 		private void DoReplace()
 | |
| 		{
 | |
| 			if (!IsFound) 
 | |
| 				DoFindNext();
 | |
| 			else
 | |
| 				MyEditItem.ReplaceText(cmboReplaceText.Text, cmboFindText.Text, cbxCaseSensitive.Checked, cbxWholeWord.Checked, cbxReverse.Checked, false, null);
 | |
| 		}
 | |
| 		private void btnRplAll_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (DoingClick) return;// Don't allow a button to be clicked until processing is complete for the last button
 | |
| 			DoingClick = true; // We started processing a click
 | |
| 			DoRplAll();
 | |
| 			DoingClick = false; // we're done processing the click
 | |
| 		}
 | |
| 		private void DoRplAll()
 | |
| 		{
 | |
| 			if (!IsFound) 
 | |
| 				DoFindNext();
 | |
| 			else
 | |
| 			{
 | |
| 				DoReplace();
 | |
| 				DoFindNext();
 | |
| 			}
 | |
| 		}
 | |
| 		private void btnBookMrkAll_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (DoingClick) return;// Don't allow a button to be clicked until processing is complete for the last button
 | |
| 			DoingClick = true; // We started processing a click
 | |
| 			DoBookMrkAll();
 | |
| 			DoingClick = false; // we're done processing the click
 | |
| 		}
 | |
| 		private void DoBookMrkAll()
 | |
| 		{
 | |
| 			findingbookmarks = true;
 | |
| 			if (!IsFound) DoFindNext();
 | |
| 			FoundIt = true;
 | |
| 			while (FoundIt && this.Visible) // found is set in btnFindNext_Click()  - Don't continue if the form is invisible (Done button pressed).
 | |
| 			{
 | |
| 				MyDisplayBookMarks.AddBookMark(MyEditItem.MyItemInfo);
 | |
| 				Application.DoEvents();
 | |
| 				DoFindNext();
 | |
| 			}
 | |
| 			StepPanelTabDisplayEventArgs args = new StepPanelTabDisplayEventArgs("Bookmarks");
 | |
| 			MyEditItem.MyStepPanel.OnTabDisplay(btnBookMrkAll, args);
 | |
| 			findingbookmarks = false;
 | |
| 		}
 | |
| 		private void btnFndRplDone_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			doingfind = false;
 | |
| 			this.Visible = false; 
 | |
| 		}
 | |
| 
 | |
| 		private string FixSymbol(string str)
 | |
| 		{
 | |
| 			StringBuilder sb = new StringBuilder();
 | |
| 			foreach (char c in str)
 | |
| 			{
 | |
| 				if (c > 0xff || c == 0xA9 || c == 0xAE) // xA9 is Copyright,  xAE is Registered
 | |
| 					sb.Append(string.Format(@"\u{0}?", (int)c));
 | |
| 				else
 | |
| 					sb.Append(c);
 | |
| 			}
 | |
| 			return sb.ToString();
 | |
| 		}
 | |
| 		// B2015-131 Break up the find string on the spaces
 | |
| 		// look for each word in the text string
 | |
| 		// this is used only to see if the next item should be looked at, the real Find function (i.e MyEditItem.FindText())
 | |
| 		// will do the actual evaluation
 | |
| 		private bool ContainsFndStr(string text, string fndStr)
 | |
| 		{
 | |
| 			char [] sep ={' '}; // break string up on spaces
 | |
| 			string [] fndStrAry = fndStr.Split(sep, StringSplitOptions.None);
 | |
| 			int pos = 0;
 | |
| 			foreach (string fStr in fndStrAry)
 | |
| 			{
 | |
| 				pos = text.IndexOf(fStr, pos);
 | |
| 				if (pos == -1) break;
 | |
| 			}
 | |
| 			return pos != -1;
 | |
| 		}
 | |
| 		private void btnFindNext_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (DoingClick) return;// Don't allow a button to be clicked until processing is complete for the last button
 | |
| 			DoingClick = true;// We started processing a click
 | |
| 			DoFindNext();
 | |
| 			DoingClick = false;// we're done processing the click
 | |
| 		}
 | |
| 
 | |
| 		// C2023-016 Find the next element, but stay in the same procedure
 | |
| 		private ItemInfo FindNextStepElement(ItemInfo curStepElem, string fndStr)
 | |
| 		{
 | |
| 			ItemInfo nxtStepElem = curStepElem;
 | |
| 			if (_StartingItemInfo == null)
 | |
| 				_StartingItemInfo = MyEditItem.MyItemInfo;
 | |
| 			if (cbxReverse.Checked)
 | |
| 			{
 | |
| 				if (curStepElem.IsProcedure)
 | |
| 					nxtStepElem = curStepElem.MyProcedure.SearchBottom; // at the top of the procedure, so next step would be the last step of the last section (or the section title if the last section is a Word section)
 | |
| 				else
 | |
| 					nxtStepElem = curStepElem.SearchPrev;
 | |
| 			}
 | |
| 			else if (curStepElem.SearchNext.IsProcedure) // searching(finding) forward but next is the next procedure, so jump to the top of the procedure (the procedure title in the step editor)
 | |
| 				nxtStepElem = curStepElem.MyProcedure;
 | |
| 			else
 | |
| 				nxtStepElem = curStepElem.SearchNext;
 | |
| 			// B2015-131 Find was not finding series of words when one or more of the words were bolded or underlined (ex finding "Any SG" where Any was bolded)
 | |
| 			while (nxtStepElem != null && nxtStepElem.ItemID != _StartingItemInfo.ItemID)
 | |
| 			{
 | |
| 				if (nxtStepElem.MyContent != null && ContainsFndStr(RtfTools.RTFConvertedSymbolsToUnicode(nxtStepElem.MyContent.Text).ToUpper(), fndStr.ToUpper()))
 | |
| 					break;
 | |
| 				if (cbxReverse.Checked)
 | |
| 				{
 | |
| 					if (nxtStepElem.IsProcedure)
 | |
| 						nxtStepElem = nxtStepElem.MyProcedure.SearchBottom;// at the top of the procedure, so next step would be the last step of the last section (or the section title if the last section is a Word section)
 | |
| 					else
 | |
| 						nxtStepElem = nxtStepElem.SearchPrev;
 | |
| 				}
 | |
| 				else if (nxtStepElem.SearchNext.IsProcedure)
 | |
| 					nxtStepElem = nxtStepElem.MyProcedure;// searching(finding) forward but next is the next procedure, so jump to the top of the procedure(the procedure title in the step editor)
 | |
| 				else
 | |
| 					nxtStepElem = nxtStepElem.SearchNext;
 | |
| 			}
 | |
| 			return nxtStepElem;
 | |
| 		}
 | |
| 
 | |
| 		private void DoFindNext()
 | |
| 		{
 | |
| 			AddToComboLists();
 | |
| 			doingfind = true;
 | |
| 			string fndStr = FixSymbol(cmboFindText.Text.Replace(@"\", @"\u9586?").Replace("-", @"\u8209?").Replace("\xa0", @"\u160?"));
 | |
| 			while (!MyEditItem.FindText(cmboFindText.Text, cbxCaseSensitive.Checked, cbxWholeWord.Checked, cbxReverse.Checked))
 | |
| 			{
 | |
| 				ItemInfo next = FindNextStepElement(MyEditItem.MyItemInfo, fndStr);
 | |
| 
 | |
| 				MyEditItem.MyStepPanel.MyStepTabPanel.MyDisplayTabControl.OpenItem(next,true,true);// C2023-016 open item (next), set focus (true), doing Find/Replace so don't open Word section (true)
 | |
| 				if (cbxReverse.Checked)
 | |
| 					MyEditItem.PositionToEnd();
 | |
| 				if (next.IsTable && !cbxReverse.Checked) MyEditItem.PositionToStart();
 | |
| 				//C2023-016 if we spun through all of the step editor sections, stop and display a message
 | |
| 				if (MyEditItem.MyItemInfo.ItemID == _StartingItemInfo.ItemID)
 | |
| 				{
 | |
| 					FoundIt = false;
 | |
| 					string msg = string.Format("Back to the starting point of the Find/Replace.{0}",(findingbookmarks)?"\n\n The Tools Panel will display showing the locations.":"");
 | |
| 					FlexibleMessageBox.Show(this, msg, "Find/Replace Completed");
 | |
| 					_StartingItemInfo = null;
 | |
| 					return;
 | |
| 				}
 | |
| 			}
 | |
| 			if (MyEditItem.MyStepRTB != null && !MyEditItem.MyStepRTB.Visible)
 | |
| 			{
 | |
| 				MyEditItem.MyStepRTB.Visible = true;
 | |
| 				MyEditItem.MyStepRTB.Focus();
 | |
| 			}
 | |
| 			FoundIt = true;
 | |
| 		}
 | |
| 		private bool FindNextText(ItemInfo next)
 | |
| 		{
 | |
| 			if (next.MyContent.MyGrid!=null) return true;
 | |
| 			return next.MyContent.Text.ToUpper().Contains(cmboFindText.Text.ToUpper());
 | |
| 		}
 | |
| 		private void AddToComboLists()
 | |
| 		{
 | |
| 			bool hastext = this.cmboFindText.Text.Length > 0;
 | |
| 			if (hastext && !cmboFindText.Items.Contains(cmboFindText.Text))
 | |
| 			{
 | |
| 				if (cmboFindText.Items.Count >= 10)
 | |
| 					cmboFindText.Items.RemoveAt(9);
 | |
| 				cmboFindText.Items.Insert(0, cmboFindText.Text);
 | |
| 			}
 | |
| 			hastext = this.cmboReplaceText.Text.Length > 0;
 | |
| 			if (hastext && btnReplace.Enabled && !cmboReplaceText.Items.Contains(cmboReplaceText.Text))
 | |
| 			{
 | |
| 				if (cmboReplaceText.Items.Count >= 10)
 | |
| 					cmboReplaceText.Items.RemoveAt(9);
 | |
| 				cmboReplaceText.Items.Insert(0, cmboReplaceText.Text);
 | |
| 			}
 | |
| 		}
 | |
| 		private void cmboFindText_TextChanged(object sender, EventArgs e)
 | |
| 		{
 | |
| 			bool hastext = this.cmboFindText.Text.Length > 0;
 | |
| 			btnFindNext.Enabled = hastext;
 | |
| 			btnBookMrkAll.Enabled = hastext;
 | |
| 			btnReplace.Enabled = btnRplAll.Enabled = hastext && !InApproved;
 | |
| 			_StartingItemInfo = null; //C2023-016 reset the starting position
 | |
| 		}
 | |
| 
 | |
| 		private void cmboReplaceText_TextChanged(object sender, EventArgs e)
 | |
| 		{
 | |
| 			btnReplace.Enabled = btnRplAll.Enabled = !InApproved && cmboFindText.Text.Length > 0;
 | |
| 			_StartingItemInfo = null;//C2023-016 reset the starting position
 | |
| 		}
 | |
| 
 | |
| 		public void PerformFindNext()
 | |
| 		{
 | |
| 			btnFindNext.PerformClick();
 | |
| 		}
 | |
| 
 | |
| 		private void tabFind_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			lblRplTxt.Visible = false;
 | |
| 			cmboReplaceText.Visible = false;
 | |
| 			btnReplace.Visible = false;
 | |
| 			btnRplAll.Visible = false;
 | |
| 		}
 | |
| 
 | |
| 		private void tabReplace_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			lblRplTxt.Visible = true;
 | |
| 			cmboReplaceText.Visible = true;
 | |
| 			btnReplace.Visible = true;
 | |
| 			btnRplAll.Visible = true;
 | |
| 		}
 | |
| 
 | |
| 		private void FindReplace_FormClosing(object sender, FormClosingEventArgs e)
 | |
| 		{
 | |
| 			btnFndRplDone_Click(sender, e);
 | |
| 			e.Cancel = true; // cancel the form close event - the Done_Click() will hide it instead
 | |
| 		}
 | |
| 
 | |
| 		private void btnCmCut_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			Clipboard.Clear();
 | |
| 			DataObject myDO = new DataObject(DataFormats.Text, cmboReplaceText.Focused ? cmboReplaceText.SelectedText : cmboFindText.SelectedText);
 | |
| 			Clipboard.SetDataObject(myDO);
 | |
| 			// Need to check which combo box activated the context menu so that we know where to take/put selected text
 | |
| 			if (cmboFindText.Focused)
 | |
| 				cmboFindText.SelectedText = "";
 | |
| 			else if (cmboReplaceText.Focused)
 | |
| 				cmboReplaceText.SelectedText = "";
 | |
| 		}
 | |
| 
 | |
| 		private void btnCmCopy_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			// Need to check which combo box activated the context menu so that we know where to take/put selected text
 | |
| 			DataObject myDO = new DataObject(DataFormats.Text, cmboReplaceText.Focused ? cmboReplaceText.SelectedText : cmboFindText.SelectedText);
 | |
| 			if (cmboFindText.Focused || cmboReplaceText.Focused)
 | |
| 			{
 | |
| 				Clipboard.Clear();
 | |
| 				Clipboard.SetDataObject(myDO);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void btnCmPaste_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			// Need to check which combo box activated the context menu so that we know where to take/put selected text
 | |
| 			IDataObject myDO = Clipboard.GetDataObject();
 | |
| 			if (myDO.GetDataPresent(DataFormats.Rtf))
 | |
| 			{
 | |
| 				RichTextBox rtb = new RichTextBox();
 | |
| 				rtb.SelectedRtf = ItemInfo.StripLinks(myDO.GetData(DataFormats.Rtf).ToString());
 | |
| 				if (cmboReplaceText.Focused)
 | |
| 					cmboReplaceText.SelectedText = rtb.Text;
 | |
| 				else if (cmboFindText.Focused)
 | |
| 					cmboFindText.SelectedText = rtb.Text;
 | |
| 			}
 | |
| 			else if (myDO.GetDataPresent(DataFormats.Text))
 | |
| 				if (cmboReplaceText.Focused)
 | |
| 					cmboReplaceText.SelectedText = Clipboard.GetText();
 | |
| 				else if (cmboFindText.Focused)
 | |
| 					cmboFindText.SelectedText = Clipboard.GetText();
 | |
| 		}
 | |
| 
 | |
| 		private void btnCmHardSp_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			// We use \u00A0 to represent a hard space because it show in the search text field as a blank
 | |
| 			// It will get translated to a real hard space character prior to searching
 | |
| 			if (cmboReplaceText.Focused)
 | |
| 				cmboReplaceText.SelectedText = "\u00A0";
 | |
| 			else if (cmboFindText.Focused)
 | |
| 				cmboFindText.SelectedText = "\u00A0";
 | |
| 		}
 | |
| 		private void btnSym_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			DevComponents.DotNetBar.ButtonItem b = (DevComponents.DotNetBar.ButtonItem)sender;
 | |
| 			if (cmboReplaceText.Focused)
 | |
| 				cmboReplaceText.SelectedText = (string)b.Text;
 | |
| 			else if (cmboFindText.Focused)
 | |
| 				cmboFindText.SelectedText = (string)b.Text;
 | |
| 		}
 | |
| 		private void SetupContextMenu()
 | |
| 		{
 | |
| 			galSymbols.SubItems.Clear();
 | |
| 			if (_MyDocVersion != null)
 | |
| 			{
 | |
| 				FormatData fmtdata = _MyDocVersion.ActiveFormat.PlantFormat.FormatData;
 | |
| 				SymbolList sl = fmtdata.SymbolList;
 | |
| 				if (sl == null || sl.Count <= 0)
 | |
| 				{
 | |
| 					FlexibleMessageBox.Show(this, "No symbols are available, check with administrator");
 | |
| 					return;
 | |
| 				}
 | |
| 				foreach (Symbol sym in sl)
 | |
| 				{
 | |
| 					DevComponents.DotNetBar.ButtonItem btnCM = new DevComponents.DotNetBar.ButtonItem();
 | |
| 					btnCM.Text = string.Format("{0}", (char)sym.Unicode);
 | |
| 					// to name button use unicode rather than desc, desc may have spaces or odd chars
 | |
| 					btnCM.Name = "btnCM" + sym.Unicode.ToString();
 | |
| 					btnCM.Tooltip = sym.Desc;
 | |
| 					btnCM.Tag = string.Format(@"{0}", sym.Unicode);
 | |
| 					btnCM.FontBold = true;
 | |
| 					btnCM.Click += new System.EventHandler(btnSym_Click);
 | |
| 					galSymbols.SubItems.Add(btnCM);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void FindReplace_Activated(object sender, EventArgs e)
 | |
| 		{
 | |
| 			if (!doingfind)
 | |
| 			{
 | |
| 				string find = MyEditItem.SelectedTextForFind;
 | |
| 				if (find != null) cmboFindText.Text = find;
 | |
| 			}
 | |
| 		}
 | |
| 		public void ToggleReplaceTab(E_ViewMode vm)
 | |
| 		{
 | |
| 			if (vm == E_ViewMode.View)
 | |
| 			{
 | |
| 				if (tabReplace.IsSelected)
 | |
| 					tabFind.PerformClick();
 | |
| 				tabReplace.Visible = false;
 | |
| 				Text = "Find"; //C2021-021 change the dialog title
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				tabReplace.Visible = true;
 | |
| 				Text = "Find and Replace";//C2021-021 change the dialog title
 | |
| 			}
 | |
| 			_StartingItemInfo = null;//C2023-016 reset the starting position
 | |
| 		}
 | |
| 
 | |
| 		private void cbxCaseSensitive_CheckedChanged(object sender, EventArgs e)
 | |
| 		{
 | |
| 			_StartingItemInfo = null;//C2023-016 reset the starting position
 | |
| 		}
 | |
| 
 | |
| 		private void cbxWholeWord_CheckedChanged(object sender, EventArgs e)
 | |
| 		{
 | |
| 			_StartingItemInfo = null;//C2023-016 reset the starting position
 | |
| 		}
 | |
| 
 | |
| 		private void cbxReverse_CheckedChanged(object sender, EventArgs e)
 | |
| 		{
 | |
| 			_StartingItemInfo = null;//C2023-016 reset the starting position
 | |
| 		}
 | |
| 	}
 | |
| } |