public Line(DiffPiece a, DiffPiece b, ChangeType type, int position) { AText = a.Text; BText = b.Text; Position = position + 1; Type = type; this.BackGroundColor = type == ChangeType.Modified ? "#D3D3D3" : "#fff"; }
private static void BuildDiffPieces(DiffResult diffResult, List<DiffPiece> oldPieces, List<DiffPiece> newPieces, PieceBuilder subPieceBuilder) { int aPos = 0; int bPos = 0; foreach (var diffBlock in diffResult.DiffBlocks) { while (bPos < diffBlock.InsertStartB && aPos < diffBlock.DeleteStartA) { oldPieces.Add(new DiffPiece(diffResult.PiecesOld[aPos], ChangeType.Unchanged, aPos + 1)); newPieces.Add(new DiffPiece(diffResult.PiecesNew[bPos], ChangeType.Unchanged, bPos + 1)); aPos++; bPos++; } int i = 0; for (; i < Math.Min(diffBlock.DeleteCountA, diffBlock.InsertCountB); i++) { var oldPiece = new DiffPiece(diffResult.PiecesOld[i + diffBlock.DeleteStartA], ChangeType.Modified, aPos + 1); var newPiece = new DiffPiece(diffResult.PiecesNew[i + diffBlock.InsertStartB], ChangeType.Modified, bPos + 1); if (subPieceBuilder != null) { subPieceBuilder(diffResult.PiecesOld[aPos], diffResult.PiecesNew[bPos], oldPiece.SubPieces, newPiece.SubPieces); newPiece.Type = oldPiece.Type = ChangeType.Modified; } oldPieces.Add(oldPiece); newPieces.Add(newPiece); aPos++; bPos++; } if (diffBlock.DeleteCountA > diffBlock.InsertCountB) { for (; i < diffBlock.DeleteCountA; i++) { oldPieces.Add(new DiffPiece(diffResult.PiecesOld[i + diffBlock.DeleteStartA], ChangeType.Modified, aPos + 1)); newPieces.Add(new DiffPiece(null, ChangeType.Modified, aPos + 1)); aPos++; } } else { for (; i < diffBlock.InsertCountB; i++) { newPieces.Add(new DiffPiece(diffResult.PiecesNew[i + diffBlock.InsertStartB], ChangeType.Modified, bPos + 1)); oldPieces.Add(new DiffPiece(null, ChangeType.Modified, bPos + 1)); bPos++; } } } while (bPos < diffResult.PiecesNew.Length && aPos < diffResult.PiecesOld.Length) { oldPieces.Add(new DiffPiece(diffResult.PiecesOld[aPos], ChangeType.Unchanged, aPos + 1)); newPieces.Add(new DiffPiece(diffResult.PiecesNew[bPos], ChangeType.Unchanged, bPos + 1)); aPos++; bPos++; } }