void UpdateExecute(CancellationToken ct) { if (Value == null || Data == null || ct.IsCancellationRequested) { return; } var val = Value; bool noChanges = val.Value == NewValue; bool filterEmpty = true; if (UseFormat) { try { filterEmpty = string.IsNullOrWhiteSpace(string.Format(Format, string.Empty)); } catch { } } var previwCount = MainVM.Instance.PreviewLines / 2; var map = new PreviewMap(Data.Text); Count = 0; List <UIElement> previews = new List <UIElement>(); foreach (var item in Data.Items) { if (ct.IsCancellationRequested) { return; } var itm = item as IMapValueItem; if (itm != null && itm.Value == val.Value) { Count++; string nVal = string.Empty; try { nVal = string.Format(UseFormat ? Format : "{0}", noChanges ? UseFormat ? itm.NewValue(itm.Value) : string.Empty : itm.NewValue(NewValue)); } catch { } var previewData = MakePreview(map, itm, previwCount, nVal); var stack = new StackPanel() { HorizontalAlignment = HorizontalAlignment.Right, Orientation = Orientation.Horizontal }; if (!noChanges || !filterEmpty) { var btnApply = new Button() { Style = addBtn, DataContext = previewData.Item2, Content = new System.Windows.Shapes.Path() { Data = apply, Fill = Brushes.Black, Stretch = Stretch.Uniform } }; btnApply.Click += BtnApply_Click; stack.Children.Add(btnApply); } var btnShow = new Button() { Style = showBtn, DataContext = itm, Content = new System.Windows.Shapes.Path() { Data = show, Fill = Brushes.Black, Stretch = Stretch.Uniform } }; btnShow.Click += BtnShow_Click; stack.Children.Add(btnShow); var lIdx = map.LineIndexAt(itm.Start); var lIdx2 = map.LineIndexAt(itm.End); var header = lIdx == lIdx2?string.Format("line: {0}", lIdx + 1) : string.Format("lines: {0} - {1}", lIdx + 1, lIdx2 + 1); stack.Children.Add(new TextBlock() { Text = header, VerticalAlignment = VerticalAlignment.Center, Margin = stackMargin }); previews.Add(new Expander() { Header = stack, Content = previewData.Item1, IsExpanded = MainVM.Instance.ExpandedPreviews, Background = Brushes.LightYellow, Margin = expanderMargin }); } } if (!ct.IsCancellationRequested) { foreach (var p in previews) { ContentContainer.Children.Add(p); } } Helpers.mainCTX.Post(_ => NotifyPropertyChanged(nameof(Count)), null); }
public static Tuple <UIElement, Tuple <int, int, string> > MakePreview(PreviewMap map, IMapValueItem itm, int previwCount, string value) { var grid = new Grid() { VerticalAlignment = VerticalAlignment.Stretch }; Tuple <UIElement, Tuple <int, int, string> > res = new Tuple <UIElement, Tuple <int, int, string> >(grid, null); grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); grid.ColumnDefinitions.Add(new ColumnDefinition() /*{ Width = GridLength.Auto }*/); var nums = new StackPanel(); Grid.SetColumn(nums, 0); var vals = new StackPanel(); Grid.SetColumn(vals, 1); grid.Children.Add(vals); /* * var sb = new ScrollViewer() { Content = vals, HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, VerticalScrollBarVisibility = ScrollBarVisibility.Disabled }; * Grid.SetColumn(sb, 1); * grid.Children.Add(sb); * //*/ grid.Children.Add(nums); var changed = !string.IsNullOrWhiteSpace(value); var lIdx = map.LineIndexAt(itm.Start); var lIdx2 = map.LineIndexAt(itm.End); var lastLine = Math.Min(lIdx2 + previwCount, map.LineStart.Count - 1); for (var line = Math.Max(lIdx - previwCount, 0); line <= lastLine; line++) { var brush = (line >= lIdx && line <= lIdx2) ? Brushes.Green : Brushes.Black; AddLine(nums, vals, line + 1, map.LineAt(line), brush, brush); if (changed && line == lIdx2) { var rIdx = map.LineStart[lIdx]; var rLen = map.LineStart[lIdx2] + map.LineLength[lIdx2] - map.LineStart[lIdx]; //var str = map.Code.Substring(rIdx, rLen); //try //{ // var iIdx = itm.EditStart - map.LineStart[lIdx]; // var len = itm.EditEnd - itm.EditStart; // str = str.Remove(iIdx, len); // str = str.Insert(iIdx, value).Replace("\r\n", "\n"); // str = str.Replace("\r\n", "\n"); //} //catch //{ //} //string[] lines = str.Split('\n'); string[] lines = map.Code.Substring(rIdx, rLen). Remove(itm.EditStart - map.LineStart[lIdx], itm.EditEnd - itm.EditStart). Insert(itm.EditStart - map.LineStart[lIdx], value).Replace("\r\n", "\n").Split('\n'); if (lines.Length > 1) { var idx = lIdx; var tab = lines[0]; //ищем отступ for (int i = 0; i < tab.Length; i++) { if (!char.IsWhiteSpace(tab[i])) { //оригинальный отступ + 2а пробела tab = tab.Substring(0, i) + " "; break; } } //добавим отступы к строкам for (int i = 1; i < lines.Length; i++) { lines[i] = tab + lines[i]; } //выведем строки в предпросмотр foreach (var ln in lines) { AddLine(nums, vals, ++idx, ln, Brushes.Red, Brushes.Red); } } else if (lines.Length == 1) { AddLine(nums, vals, lIdx + 1, lines[0], Brushes.Red, Brushes.Red); } //данные для замены в файле, индекс начала, длина, и текст на замену res = new Tuple <UIElement, Tuple <int, int, string> >(res.Item1, new Tuple <int, int, string>(rIdx, rLen, string.Join("\r\n", lines))); } } return(res); }