예제 #1
0
        /// <summary>
        /// Замена выражения типа asdf*ghjk на qwer (где * - любое количество символов)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonReplace_Click(object sender, EventArgs e)
        {
            statusStrip1.Items[0].Text = "";
            Application.DoEvents();

            if (comboFind.Text == "")
            {
                comboFind.Focus();
                statusStrip1.Items[0].Text = "Строка для поиска не задана";
                return;
            }

            //
            // Запоминание введённых значений для поиска и замены в реестре
            //
            m_ActClass.AddValue("qrFindVals", comboFind.Text);
            LoadComboBoxList(comboFind, "qrFindVals");
            if (comboFind.Items.Count > 0)
            {
                comboFind.Text = comboFind.Items[0].ToString();
            }

            m_ActClass.AddValue("qrReplaceVals", comboReplace.Text);
            LoadComboBoxList(comboReplace, "qrReplaceVals");
            if (comboReplace.Items.Count > 0)
            {
                comboReplace.Text = comboReplace.Items[0].ToString();
            }

            statusStrip1.Items[0].Text = "";

            var textBuilder = new StringBuilder(m_MainForm.textWindow.Text);

            //
            // Если используются рег. выражения - то разбираем строку для их поиска и корректной обработки
            //
            int cntRepl = 0;

            if (checkUseRegular.Checked)
            {
                //
                // Замена символов вида \n в строке для поиска на спец. символы перевода строки
                //
                var    arrPart = new ArrayList();
                string textFind;
                try
                {
                    textFind = ParseSmartString(comboFind.Text);
                }
                catch (WrongSmartStringException ex)
                {
                    statusStrip1.Items[0].Text = ex.Message + " для поиска";
                    comboFind.Focus();
                    return;
                }
                string textReplace;
                try
                {
                    textReplace = ParseSmartString(comboReplace.Text);
                }
                catch (WrongSmartStringException ex)
                {
                    statusStrip1.Items[0].Text = ex.Message + " для замены";
                    comboReplace.Focus();
                    return;
                }

                //
                // Проверка на корректность строки для поиска
                //
                int n;

                //
                // Обработка первого символа в строке для поиска
                //
                if (textFind[0] == '*')
                {
                    arrPart.Add("");
                    n = 1;
                }
                else
                {
                    n = 0;
                }

                //
                // Обработка остальных символов в строке для поиска
                // Создание массива из частей того, что надо искать
                //
                string part = "";
                while (n < textFind.Length)
                {
                    if (textFind[n] == '*' && textFind[n - 1] != '\\')
                    {
                        arrPart.Add(part);
                        part = "";
                    }
                    else
                    {
                        if (textFind[n] != '\\')
                        {
                            part += textFind[n];
                        }
                        else
                        {
                            if (n + 1 < textFind.Length && textFind[n + 1] == '*')
                            {
                                part += "*";
                                n++;
                            }
                            else
                            {
                                part += "\\";
                            }

                            /*else
                             * {
                             *  statusStrip1.Items[0].Text = "Ошибка в записи строки для поиска";
                             *  comboFind.Focus();
                             *  return;
                             * }*/
                        }
                    }
                    n++;
                }
                arrPart.Add(part);

                var parts = new string[arrPart.Count];
                arrPart.CopyTo(parts);

                /*string q = "";
                 * for(int i = 0; i < parts.Length; i++) {
                 *
                 * q += parts[i] + "\r\n";
                 * }
                 * MessageBox.Show(q);
                 * return;*/

                //
                // Если в строке для поиска нет * (или только * и ничего больше)
                //
                if (parts.Length == 1)
                {
                    if (parts[0] == "")
                    {
                        statusStrip1.Items[0].Text           = "Произведено замен: 1";
                        m_MainForm.textWindow.Text           = textReplace;
                        m_MainForm.textWindow.SelectionStart = 0;
                    }
                    else
                    {
                        //
                        // Подсчёт количества будущих замен
                        //
                        string text = m_MainForm.textWindow.Text;
                        int    num  = text.IndexOf(textFind);
                        while (num != -1)
                        {
                            cntRepl++;
                            num = text.IndexOf(textFind, num + textFind.Length);
                        }

                        //
                        // Собственно, замена
                        //
                        textBuilder.Replace(textFind, textReplace);
                    }
                }
                else
                {
                    //
                    // Если строка для поиска содержит * - то ищутся по порядку все возможных части
                    // строки для поиска (между *)
                    //
                    int num1 = 0;
                    if (parts[0] != "")
                    {
                        num1 = (textBuilder.ToString()).IndexOf(parts[0], 0);
                    }

                    while (num1 != -1 && num1 < textBuilder.Length)
                    {
                        int num2 = num1 + parts[0].Length;
                        for (int i = 1; i < parts.Length; i++)
                        {
                            if (parts[i] != "")
                            {
                                num2 = (textBuilder.ToString()).IndexOf(parts[i], num2) + parts[i].Length;
                                if (num2 == parts[i].Length - 1)
                                {
                                    goto quit;
                                }
                            }
                            else
                            {
                                num2 = textBuilder.Length;
                                break;
                            }
                        }

                        textBuilder.Remove(num1, num2 - num1);
                        textBuilder.Insert(num1, textReplace);
                        cntRepl++;
                        statusStrip1.Items[0].Text = "Произведено замен: " + cntRepl;
                        Application.DoEvents();
                        num1 += textReplace.Length;
                        if (parts[0] != "")
                        {
                            num1 = (textBuilder.ToString()).IndexOf(parts[0], num1);
                        }
                    }
                }
            }
            else
            {
                //
                // Замена без использования рег. выражений
                // Подсчёт количества будущих замен
                //
                string text = m_MainForm.textWindow.Text;
                int    num  = text.IndexOf(comboFind.Text);
                while (num != -1)
                {
                    cntRepl++;
                    num = text.IndexOf(comboFind.Text, num + comboFind.Text.Length);
                }

                //
                // Собственно, замена
                //
                textBuilder.Replace(comboFind.Text, comboReplace.Text);
            }
quit:

            statusStrip1.Items[0].Text           = "Произведено замен: " + cntRepl;
            m_MainForm.textWindow.Text           = textBuilder.ToString();
            m_MainForm.textWindow.SelectionStart = 0;
        }
예제 #2
0
        /// <summary>
        /// Найти дальше
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonFindNext_Click(object sender, EventArgs e)
        {
            if (comboFind.Text == "")
            {
                comboFind.Focus();
                return;
            }
            bool callRepeat = false;

            _appStart = false;
            if (comboFind.Items.Count == 0 || comboFind.Text != comboFind.Items[0].ToString())
            {
                _actClass.AddValue("findVals", comboFind.Text);
                LoadComboBoxList(comboFind, "findVals");
                if (comboFind.Items.Count > 0)
                {
                    comboFind.Text = comboFind.Items[0].ToString();
                }
            }
            if (comboReplace.Visible && (comboReplace.Items.Count == 0 || comboReplace.Text != comboReplace.Items[0].ToString()))
            {
                _actClass.AddValue("replaceVals", comboReplace.Text);
                LoadComboBoxList(comboReplace, "replaceVals");
                if (comboReplace.Items.Count > 0)
                {
                    comboReplace.Text = comboReplace.Items[0].ToString();
                }
            }
            _appStart = true;

            statusStrip1.Items[0].Text = "";
            int start = _mainForm.textWindow.SelectionStart;
            int len   = _mainForm.textWindow.SelectionLength;

repeat:
            int sel = FindNext(comboFind.Text, start, len);

            if (sel > -1)
            {
                if (!CheckWord(sel))
                {
                    start = sel;
                    len   = comboFind.Text.Length;
                    goto repeat;
                }
                _mainForm.textWindow.SelectionStart  = sel;
                _mainForm.textWindow.SelectionLength = comboFind.Text.Length;
                _mainForm.textWindow.ScrollToCaret();
                _mainForm.ShowPosition();
            }
            else
            {
                if (checkBoxFindUp.Checked)
                {
                    statusStrip1.Items[0].Text = "Достигнуто начало документа. Поиск продолжен с конца";
                    sel = FindNext(comboFind.Text, _mainForm.textWindow.Text.Length, 0);
                }
                else
                {
                    statusStrip1.Items[0].Text = "Достигнут конец документа. Поиск продолжен с начала";
                    sel = FindNext(comboFind.Text, 0, 0);
                }
                if (sel > -1 && !callRepeat)
                {
                    if (!CheckWord(sel))
                    {
                        callRepeat = true;
                        start      = sel;
                        len        = comboFind.Text.Length;
                        goto repeat;
                    }
                    _mainForm.textWindow.SelectionStart  = sel;
                    _mainForm.textWindow.SelectionLength = comboFind.Text.Length;
                    _mainForm.textWindow.ScrollToCaret();
                    _mainForm.ShowPosition();
                }
                else
                {
                    statusStrip1.Items[0].Text = "Строка не найдена";
                }
            }
        }