internal static void InsertLines(InternalLinesViewer panel, List <DiffPiece> lines, bool isOld, UIElement source) { if (lines == null || panel == null) { return; } var guid = panel.TrackingId = Guid.NewGuid(); if (lines.Count < 500) { InsertLinesInteral(panel, lines, isOld, source); return; } var disablePieces = lines.Count > MaxCount; // For performance. InsertLinesInteral(panel, lines.Take(300).ToList(), isOld, source, disablePieces); Task.Delay(800).ContinueWith(t => // For performance. { panel.Dispatcher.Invoke(() => { if (panel.TrackingId != guid) { return; } InsertLinesInteral(panel, lines.Skip(300).ToList(), isOld, source, disablePieces); }); }); }
private static void InsertLinesInteral(InternalLinesViewer panel, List <DiffPiece> lines, bool isOld, UIElement source, bool disableSubPieces = false) { foreach (var line in lines) { if (line == null) { var c = panel.Add(null, null, null as string, ChangeType.Unchanged.ToString(), source); c.Tag = line; continue; } var changeType = line.Type; var text = line.Text; var hasAdded = false; switch (line.Type) { case ChangeType.Modified: changeType = isOld ? ChangeType.Deleted : ChangeType.Inserted; if (line.SubPieces != null && line.SubPieces.Count > 1 && !disableSubPieces) { var details = GetSubPiecesInfo(line, isOld); var c = panel.Add(line.Position, isOld ? "-" : "+", details, changeType.ToString(), source); c.Tag = line; hasAdded = true; } break; case ChangeType.Inserted: case ChangeType.Deleted: case ChangeType.Unchanged: break; default: changeType = ChangeType.Imaginary; text = string.Empty; break; } if (!hasAdded) { string op = " "; switch (changeType) { case ChangeType.Inserted: op = "+"; break; case ChangeType.Deleted: op = "-"; break; } var c = panel.Add(line.Position, op, text, changeType.ToString(), source); c.Tag = line; } } panel.AdjustScrollView(); }
internal static bool GoTo(InternalLinesViewer panel, int lineIndex) { var currentScrollPosition = panel.ValueScrollViewer.VerticalOffset; var point = new Point(0, currentScrollPosition); foreach (var item in panel.ValuePanel.Children) { if (!(item is FrameworkElement ele) || !(ele.Tag is DiffPiece line) || line?.Position != lineIndex) { continue; } var pos = ele.TransformToVisual(panel.ValueScrollViewer).Transform(point); panel.ValueScrollViewer.ScrollToVerticalOffset(pos.Y); return(true); } return(false); }
/// <summary> /// Updates the inline diffs view. /// </summary> internal static void RenderInlineDiffs(InternalLinesViewer viewer, DiffPaneModel m, UIElement source) { viewer.Clear(); if (m?.Lines == null) { return; } var disableSubPieces = m.Lines.Count > MaxCount; // For performance. foreach (var line in m.Lines) { if (line == null) { var c = viewer.Add(null, null, null as string, ChangeType.Unchanged.ToString(), source); c.Tag = line; continue; } var changeType = line.Type; var text = line.Text; var hasAdded = false; switch (line.Type) { case ChangeType.Modified: changeType = ChangeType.Inserted; break; case ChangeType.Inserted: if (line.SubPieces != null && line.SubPieces.Count > 1 && !disableSubPieces) { var details = GetSubPiecesInfo(line, true); var c = viewer.Add(line.Position, "+", details, changeType.ToString(), source); c.Tag = line; hasAdded = true; } break; case ChangeType.Deleted: if (line.SubPieces != null && line.SubPieces.Count > 1 && !disableSubPieces) { var details = GetSubPiecesInfo(line, false); var c = viewer.Add(line.Position, "-", details, changeType.ToString(), source); c.Tag = line; hasAdded = true; } break; case ChangeType.Unchanged: break; default: changeType = ChangeType.Imaginary; text = string.Empty; break; } if (!hasAdded) { var c = viewer.Add(line.Position, changeType switch { ChangeType.Inserted => "+", ChangeType.Deleted => "-", _ => " " }, text, changeType.ToString(), source);