private void UpdateDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo) { if (TextView.IsClosed) return; var startLineNumber = hunkRangeInfo.NewHunkRange.StartingLineNumber; var endLineNumber = startLineNumber + hunkRangeInfo.NewHunkRange.NumberOfLines - 1; var snapshot = TextView.TextBuffer.CurrentSnapshot; if (startLineNumber < 0 || startLineNumber >= snapshot.LineCount || endLineNumber < 0 || endLineNumber >= snapshot.LineCount) { return; } var startLine = snapshot.GetLineFromLineNumber(startLineNumber); var endLine = snapshot.GetLineFromLineNumber(endLineNumber); if (startLine == null || endLine == null) return; var mapTop = _scrollBar.Map.GetCoordinateAtBufferPosition(startLine.Start) - 0.5; var mapBottom = _scrollBar.Map.GetCoordinateAtBufferPosition(endLine.End) + 0.5; diffViewModel.Top = Math.Round(_scrollBar.GetYCoordinateOfScrollMapPosition(mapTop)) - 2.0; diffViewModel.Height = Math.Round(_scrollBar.GetYCoordinateOfScrollMapPosition(mapBottom)) - diffViewModel.Top + 2.0; }
protected DiffViewModel(HunkRangeInfo hunkRangeInfo, IMarginCore marginCore, Action<DiffViewModel, HunkRangeInfo> updateDiffDimensions) { HunkRangeInfo = hunkRangeInfo; MarginCore = marginCore; _updateDiffDimensions = updateDiffDimensions; MarginCore.BrushesChanged += HandleBrushesChanged; }
internal EditorDiffViewModel(HunkRangeInfo hunkRangeInfo, IMarginCore marginCore, Action<DiffViewModel, HunkRangeInfo> updateDiffDimensions) : base(hunkRangeInfo, marginCore, updateDiffDimensions) { ShowPopup = false; DiffText = GetDiffText(); IsDiffTextVisible = GetIsDiffTextVisible(); UpdateDimensions(); }
private bool? UpdateDeletedDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo) { if (hunkRangeInfo.NewHunkRange.NumberOfLines != 0) { // unexpected number of lines for a deletion hunk return false; } var snapshot = TextView.TextBuffer.CurrentSnapshot; var followingLineNumber = hunkRangeInfo.NewHunkRange.StartingLineNumber + 1; if (followingLineNumber < 0 || followingLineNumber >= snapshot.LineCount) return false; var followingLine = snapshot.GetLineFromLineNumber(followingLineNumber); if (followingLine == null) return null; var span = new SnapshotSpan(followingLine.Start, followingLine.End); if (!TextView.TextViewLines.FormattedSpan.IntersectsWith(span)) return false; var followingLineView = TextView.GetTextViewLineContainingBufferPosition(followingLine.Start); if (followingLineView == null) return false; if (TextView.TextViewLines.LastVisibleLine.EndIncludingLineBreak < followingLineView.Start) { // starts after the last visible line return false; } if (TextView.TextViewLines.FirstVisibleLine.Start > followingLineView.EndIncludingLineBreak) { // ends before the first visible line return false; } double followingTop; switch (followingLineView.VisibilityState) { case VisibilityState.FullyVisible: case VisibilityState.Hidden: case VisibilityState.PartiallyVisible: followingTop = followingLineView.Top - TextView.ViewportTop; break; case VisibilityState.Unattached: // if the closest line was past the end we would have already returned followingTop = 0; break; default: // shouldn't be reachable, but definitely hide if this is the case return false; } double center = followingTop; double height = TextView.LineHeight; diffViewModel.Top = center - (height / 2.0); diffViewModel.Height = TextView.LineHeight; return true; }
private bool? UpdateNormalDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo) { if (hunkRangeInfo.NewHunkRange.NumberOfLines <= 0) { // if visible, it would have been as a deletion return false; } var snapshot = TextView.TextBuffer.CurrentSnapshot; var startLineNumber = hunkRangeInfo.NewHunkRange.StartingLineNumber; var endLineNumber = startLineNumber + hunkRangeInfo.NewHunkRange.NumberOfLines - 1; if (startLineNumber < 0 || startLineNumber >= snapshot.LineCount || endLineNumber < 0 || endLineNumber >= snapshot.LineCount) { return false; } var startLine = snapshot.GetLineFromLineNumber(startLineNumber); var endLine = snapshot.GetLineFromLineNumber(endLineNumber); if (startLine == null || endLine == null) return null; var span = new SnapshotSpan(startLine.Start, endLine.End); if (!TextView.TextViewLines.FormattedSpan.IntersectsWith(span)) return false; var startLineView = TextView.GetTextViewLineContainingBufferPosition(startLine.Start); var endLineView = TextView.GetTextViewLineContainingBufferPosition(endLine.Start); if (startLineView == null || endLineView == null) return false; if (TextView.TextViewLines.LastVisibleLine.EndIncludingLineBreak < startLineView.Start) { // starts after the last visible line return false; } if (TextView.TextViewLines.FirstVisibleLine.Start > endLineView.EndIncludingLineBreak) { // ends before the first visible line return false; } double startTop; switch (startLineView.VisibilityState) { case VisibilityState.FullyVisible: case VisibilityState.Hidden: case VisibilityState.PartiallyVisible: startTop = startLineView.Top - TextView.ViewportTop; break; case VisibilityState.Unattached: // if the closest line was past the end we would have already returned startTop = 0; break; default: // shouldn't be reachable, but definitely hide if this is the case return false; } double stopBottom; switch (endLineView.VisibilityState) { case VisibilityState.FullyVisible: case VisibilityState.Hidden: case VisibilityState.PartiallyVisible: stopBottom = endLineView.Bottom - TextView.ViewportTop; break; case VisibilityState.Unattached: // if the closest line was before the start we would have already returned stopBottom = TextView.ViewportHeight; break; default: // shouldn't be reachable, but definitely hide if this is the case return false; } diffViewModel.Top = startTop; diffViewModel.Height = stopBottom - startTop; return true; }
private void UpdateDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo) { if (TextView.IsClosed) return; bool? visible; if (diffViewModel.IsDeletion) visible = UpdateDeletedDiffDimensions(diffViewModel, hunkRangeInfo); else visible = UpdateNormalDiffDimensions(diffViewModel, hunkRangeInfo); if (visible.HasValue) diffViewModel.IsVisible = visible.Value; }
protected virtual DiffViewModel CreateDiffViewModel(HunkRangeInfo hunkRangeInfo) { return new EditorDiffViewModel(hunkRangeInfo, MarginCore, _updateDiffDimensions); }
internal ScrollDiffViewModel(HunkRangeInfo hunkRangeInfo, IMarginCore marginCore, Action<DiffViewModel, HunkRangeInfo> updateDiffDimensions) : base(hunkRangeInfo, marginCore, updateDiffDimensions) { UpdateDimensions(); }