replaceWindow.xaml.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System;
  2. using System.Windows;
  3. using FastColoredTextBoxNS;
  4. using System.Collections.Generic;
  5. using System.Text.RegularExpressions;
  6. namespace MPE
  7. {
  8. public partial class replaceWindow : Window
  9. {
  10. public replaceWindow() { InitializeComponent(); tbFind.Focus(); }
  11. Place startPlace;
  12. FastColoredTextBox tb { get => DataHelper.field; }
  13. bool firstSearch = true;
  14. public void setTextInFindTB(string text) { tbFind.Text = text; }
  15. void BtFindNext_Click(object sender, RoutedEventArgs e)
  16. {
  17. try { if (!Find(tbFind.Text)) { firstSearch = true; } }
  18. catch (Exception ex) { MessageBox.Show(ex.Message); }
  19. }
  20. List<Range> FindAll(string pattern)
  21. {
  22. var opt = cbMatchCase.IsChecked == true ? RegexOptions.None : RegexOptions.IgnoreCase;
  23. if (!cbRegex.IsChecked == true)
  24. pattern = Regex.Escape(pattern);
  25. if (cbWholeWord.IsChecked == true)
  26. pattern = "\\b" + pattern + "\\b";
  27. var range = tb.Selection.IsEmpty ? tb.Range.Clone() : tb.Selection.Clone();
  28. var list = new List<Range>();
  29. foreach (var r in range.GetRangesByLines(pattern, opt))
  30. list.Add(r);
  31. return list;
  32. }
  33. bool Find(string pattern)
  34. {
  35. RegexOptions opt = cbMatchCase.IsChecked == true ? RegexOptions.None : RegexOptions.IgnoreCase;
  36. if (!cbRegex.IsChecked == true)
  37. pattern = Regex.Escape(pattern);
  38. if (cbWholeWord.IsChecked == true)
  39. pattern = "\\b" + pattern + "\\b";
  40. Range range = tb.Selection.Clone();
  41. range.Normalize();
  42. if (firstSearch)
  43. {
  44. startPlace = range.Start;
  45. firstSearch = false;
  46. }
  47. range.Start = range.End;
  48. if (range.Start >= startPlace)
  49. range.End = new Place(tb.GetLineLength(tb.LinesCount - 1), tb.LinesCount - 1);
  50. else
  51. {
  52. range.End = startPlace;
  53. //firstSearch = true;
  54. }
  55. foreach (var r in range.GetRangesByLines(pattern, opt))
  56. {
  57. tb.Selection.Start = r.Start;
  58. tb.Selection.End = r.End;
  59. tb.DoSelectionVisible();
  60. tb.Invalidate();
  61. return true;
  62. }
  63. if (range.Start >= startPlace && startPlace > Place.Empty)
  64. {
  65. tb.Selection.Start = new Place(0, 0);
  66. return Find(pattern);
  67. }
  68. firstSearch = true;
  69. tb.Selection.Start = new Place(0, 0);
  70. tb.Selection.End = new Place(0, 0);
  71. return false;
  72. }
  73. void BtReplace_Click(object sender, RoutedEventArgs e)
  74. {
  75. try
  76. {
  77. if (tb.SelectionLength != 0) tb.InsertText(tbReplace.Text);
  78. BtFindNext_Click(sender, null);
  79. }
  80. catch (Exception ex)
  81. { MessageBox.Show(ex.Message); }
  82. }
  83. void BtReplaceAll_Click(object sender, RoutedEventArgs e)
  84. {
  85. try
  86. {
  87. tb.Selection.BeginUpdate();
  88. var ranges = FindAll(tbFind.Text);
  89. if (ranges.Count > 0)
  90. {
  91. tb.TextSource.Manager.ExecuteCommand(new ReplaceTextCommand(tb.TextSource, ranges, tbReplace.Text));
  92. tb.Selection.Start = new Place(0, 0);
  93. tb.Invalidate();
  94. MessageBox.Show(ranges.Count + " вхождений заменено");
  95. }
  96. }
  97. catch (Exception ex) { MessageBox.Show(ex.Message); }
  98. tb.Selection.EndUpdate();
  99. }
  100. void Window_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) => DragMove();
  101. void TbFind_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) { if (e.Key == System.Windows.Input.Key.Enter) { Find(tbFind.Text); e.Handled = true; return; } }
  102. }
  103. }