Exemple #1
0
 private bool TryFindNext(string pattern, RegexOptions opt, FindNextDirection direction, Range range, out Place foundMatchPlace)
 {
     if (direction == FindNextDirection.Next)
     {
         foreach (var r in range.GetRangesByLines(pattern, opt))
         {
             foundMatchPlace = r.Start;
             tb.Selection    = r;
             tb.DoSelectionVisible();
             tb.Invalidate();
             return(true); // always return on the first match
         }
     }
     else // find previous
     {
         foreach (var r in range.GetRangesByLinesReversed(pattern, opt))
         {
             foundMatchPlace = r.Start;
             tb.Selection    = r;
             tb.DoSelectionVisible();
             tb.Invalidate();
             return(true); // always return on the first match
         }
     }
     foundMatchPlace = Place.Empty;
     return(false);
 }
        private void Find(string pattern, FindNextDirection direction)
        {
            string originalPattern = pattern;
            Place start = new Place(0,0);
            Place endOfDocument = new Place(tb.GetLineLength(tb.LinesCount - 1), tb.LinesCount - 1);
            try
            {
                // create Regex
                RegexOptions opt = cbMatchCase.Checked ? RegexOptions.None : RegexOptions.IgnoreCase;
                if (!cbRegex.Checked)
                    pattern = Regex.Escape(pattern);
                if (cbWholeWord.Checked)
                    pattern = "\\b" + pattern + "\\b";
                // the current position
                Range range = tb.Selection.Clone();
                range.Normalize();

                // remember the start position
                start = new Place(range.Start.iChar, range.Start.iLine);

                if (direction == FindNextDirection.Next)
                {
                    // search till the end of the document
                    if (this.hasPreviousFindResult)
                    {
                        // increase range.Start with one position (if we don't do this will keep finding the same string)
                        range.Start = NextPlace(start);
                    }
                    else
                    {
                        range.Start = start;
                    }
                    range.End = endOfDocument; // search until end of document
                }
                else // find previous
                {
                    // search backwards till start of document
                    range.Start = new Place(0, 0);
                    range.End = start;
                }

                Place foundMatchPlace;
                bool foundMatch = TryFindNext(pattern, opt, direction, range, out foundMatchPlace);
                if (foundMatch)
                {
                    this.hasPreviousFindResult = true;
                    return;
                }

                // Searching forwarded and started at (0,0) => we have found nothing...
                if (direction == FindNextDirection.Next && start == new Place(0, 0))
                {
                    // Only show message when we don't have a previous find.
                    if (!this.hasPreviousFindResult) MessageBox.Show(String.Format("Pattern {0} not found.", originalPattern));
                    this.hasPreviousFindResult = false;
                    return;
                }
                // Searching backward and started at end of document => we have found nothing
                if (direction == FindNextDirection.Previous && start == endOfDocument)
                {
                    // Only show message when we don't have a previous find.
                    if (!this.hasPreviousFindResult) MessageBox.Show(String.Format("Pattern {0} not found.", originalPattern));
                    this.hasPreviousFindResult = false;
                    return;
                }

                // we haven't searched the entire document

                // Change the search range depending on whether we are searching for the next or previous
                if (direction == FindNextDirection.Next)
                {
                    // search from (0,0) to the line-end of start
                    range.Start = new Place(0, 0);
                    range.End = EndOfLine(start);
                }
                else // find previous
                {
                    // search from document-end to line-start of start
                    range.Start = StartOfLine(start);
                    range.End = endOfDocument; // search until end of document
                }

                Place foundMatchPlace2;
                bool foundMatch2 = TryFindNext(pattern, opt, direction, range, out foundMatchPlace2);
                if (foundMatch2)
                {
                    this.hasPreviousFindResult = true;
                    return;
                }

                // Found nothing
                // Only show message when we don't have a previous find.
                if (!this.hasPreviousFindResult) MessageBox.Show(String.Format("Pattern {0} not found.", originalPattern));
                this.hasPreviousFindResult = false;

            }
            catch (Exception e)
            {
                MessageBox.Show(this, e.Message, "Exception while searching");
            }
        }
 private bool TryFindNext(string pattern, RegexOptions opt, FindNextDirection direction, Range range, out Place foundMatchPlace)
 {
     if (direction == FindNextDirection.Next)
     {
         foreach (var r in range.GetRangesByLines(pattern, opt))
         {
             foundMatchPlace = r.Start;
             tb.Selection = r;
             tb.DoSelectionVisible();
             tb.Invalidate();
             return true; // always return on the first match
         }
     }
     else // find previous
     {
         foreach (var r in range.GetRangesByLinesReversed(pattern, opt))
         {
             foundMatchPlace = r.Start;
             tb.Selection = r;
             tb.DoSelectionVisible();
             tb.Invalidate();
             return true; // always return on the first match
         }
     }
     foundMatchPlace = Place.Empty;
     return false;
 }
Exemple #4
0
        private void Find(string pattern, FindNextDirection direction)
        {
            string originalPattern = pattern;
            Place  start           = new Place(0, 0);
            Place  endOfDocument   = new Place(tb.GetLineLength(tb.LinesCount - 1), tb.LinesCount - 1);

            try
            {
                // create Regex
                RegexOptions opt = cbMatchCase.Checked ? RegexOptions.None : RegexOptions.IgnoreCase;
                if (!cbRegex.Checked)
                {
                    pattern = Regex.Escape(pattern);
                }
                if (cbWholeWord.Checked)
                {
                    pattern = "\\b" + pattern + "\\b";
                }
                // the current position
                Range range = tb.Selection.Clone();
                range.Normalize();

                // remember the start position
                start = new Place(range.Start.iChar, range.Start.iLine);

                if (direction == FindNextDirection.Next)
                {
                    // search till the end of the document
                    if (this.hasPreviousFindResult)
                    {
                        // increase range.Start with one position (if we don't do this will keep finding the same string)
                        range.Start = NextPlace(start);
                    }
                    else
                    {
                        range.Start = start;
                    }
                    range.End = endOfDocument; // search until end of document
                }
                else // find previous
                {
                    // search backwards till start of document
                    range.Start = new Place(0, 0);
                    range.End   = start;
                }

                Place foundMatchPlace;
                bool  foundMatch = TryFindNext(pattern, opt, direction, range, out foundMatchPlace);
                if (foundMatch)
                {
                    this.hasPreviousFindResult = true;
                    return;
                }


                // Searching forwarded and started at (0,0) => we have found nothing...
                if (direction == FindNextDirection.Next && start == new Place(0, 0))
                {
                    // Only show message when we don't have a previous find.
                    if (!this.hasPreviousFindResult)
                    {
                        MessageBox.Show(String.Format("Pattern {0} not found.", originalPattern));
                    }
                    this.hasPreviousFindResult = false;
                    return;
                }
                // Searching backward and started at end of document => we have found nothing
                if (direction == FindNextDirection.Previous && start == endOfDocument)
                {
                    // Only show message when we don't have a previous find.
                    if (!this.hasPreviousFindResult)
                    {
                        MessageBox.Show(String.Format("Pattern {0} not found.", originalPattern));
                    }
                    this.hasPreviousFindResult = false;
                    return;
                }

                // we haven't searched the entire document

                // Change the search range depending on whether we are searching for the next or previous
                if (direction == FindNextDirection.Next)
                {
                    // search from (0,0) to the line-end of start
                    range.Start = new Place(0, 0);
                    range.End   = EndOfLine(start);
                }
                else // find previous
                {
                    // search from document-end to line-start of start
                    range.Start = StartOfLine(start);
                    range.End   = endOfDocument; // search until end of document
                }

                Place foundMatchPlace2;
                bool  foundMatch2 = TryFindNext(pattern, opt, direction, range, out foundMatchPlace2);
                if (foundMatch2)
                {
                    this.hasPreviousFindResult = true;
                    return;
                }


                // Found nothing
                // Only show message when we don't have a previous find.
                if (!this.hasPreviousFindResult)
                {
                    MessageBox.Show(String.Format("Pattern {0} not found.", originalPattern));
                }
                this.hasPreviousFindResult = false;
            }
            catch (Exception e)
            {
                MessageBox.Show(this, e.Message, "Exception while searching");
            }
        }