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