コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }