Refactor code

Create a common method for a similar code.
Simplify some logical operations.

Change-Id: If25703c51ea96fe5a64698f6fa3ffd6f5cb1b2c5
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
This commit is contained in:
jkobus
2013-04-23 14:35:49 +02:00
committed by Jarek Kobus
parent 5f5b7fa4c1
commit 5219faf0e2
2 changed files with 51 additions and 67 deletions

View File

@@ -370,6 +370,41 @@ bool DiffEditorWidget::isEqual(const QList<Diff> &diffList, int diffNumber) cons
return false; return false;
} }
QList<TextLineData> DiffEditorWidget::assemblyRows(const QStringList &lines,
const QMap<int, int> &lineSpans,
const QMap<int, int> &changedPositions,
QMap<int, int> *outputChangedPositions) const
{
QList<TextLineData> data;
int spanOffset = 0;
int pos = 0;
QMap<int, int>::ConstIterator changedIt = changedPositions.constBegin();
QMap<int, int>::ConstIterator changedEnd = changedPositions.constEnd();
const int lineCount = lines.count();
for (int i = 0; i <= lineCount; i++) {
for (int j = 0; j < lineSpans.value(i); j++) {
data.append(TextLineData(TextLineData::Separator));
spanOffset++;
}
if (i < lineCount) {
const int textLength = lines.at(i).count() + 1;
pos += textLength;
data.append(lines.at(i));
}
while (changedIt != changedEnd) {
if (changedIt.key() >= pos)
break;
const int startPos = changedIt.key() + spanOffset;
const int endPos = changedIt.value() + spanOffset;
if (outputChangedPositions)
outputChangedPositions->insert(startPos, endPos);
++changedIt;
}
}
return data;
}
ChunkData DiffEditorWidget::calculateOriginalData(const QList<Diff> &diffList) const ChunkData DiffEditorWidget::calculateOriginalData(const QList<Diff> &diffList) const
{ {
@@ -404,9 +439,9 @@ ChunkData DiffEditorWidget::calculateOriginalData(const QList<Diff> &diffList) c
const bool equal = isEqual(diffList, i); const bool equal = isEqual(diffList, i);
if (diff.command == Diff::Insert) { if (diff.command == Diff::Insert) {
lastRightLineEqual = lastRightLineEqual ? equal : false; lastRightLineEqual = lastRightLineEqual && equal;
} else if (diff.command == Diff::Delete) { } else if (diff.command == Diff::Delete) {
lastLeftLineEqual = lastLeftLineEqual ? equal : false; lastLeftLineEqual = lastLeftLineEqual && equal;
} }
const int lastLeftPos = currentLeftPos; const int lastLeftPos = currentLeftPos;
@@ -428,14 +463,14 @@ ChunkData DiffEditorWidget::calculateOriginalData(const QList<Diff> &diffList) c
currentLeftLineOffset++; currentLeftLineOffset++;
leftLines.append(QString()); leftLines.append(QString());
currentLeftPos++; currentLeftPos++;
lastLeftLineEqual = line.count() ? equal : true; lastLeftLineEqual = !line.count() || equal;
} }
if (diff.command != Diff::Delete) { if (diff.command != Diff::Delete) {
currentRightLine++; currentRightLine++;
currentRightLineOffset++; currentRightLineOffset++;
rightLines.append(QString()); rightLines.append(QString());
currentRightPos++; currentRightPos++;
lastRightLineEqual = line.count() ? equal : true; lastRightLineEqual = !line.count() || equal;
} }
} }
@@ -502,69 +537,14 @@ ChunkData DiffEditorWidget::calculateOriginalData(const QList<Diff> &diffList) c
} }
} }
QList<TextLineData> leftData; QList<TextLineData> leftData = assemblyRows(leftLines,
int spanOffset = 0; leftLineSpans,
int pos = 0; leftChangedPositions,
QMap<int, int>::ConstIterator leftChangedIt = leftChangedPositions.constBegin(); &chunkData.changedLeftPositions);
for (int i = 0; i < leftLines.count(); i++) { QList<TextLineData> rightData = assemblyRows(rightLines,
for (int j = 0; j < leftLineSpans.value(i); j++) { rightLineSpans,
leftData.append(TextLineData(TextLineData::Separator)); rightChangedPositions,
spanOffset++; &chunkData.changedRightPositions);
}
const int textLength = leftLines.at(i).count() + 1;
pos += textLength;
leftData.append(leftLines.at(i));
while (leftChangedIt != leftChangedPositions.constEnd()) {
if (leftChangedIt.key() >= pos)
break;
const int startPos = leftChangedIt.key() + spanOffset;
const int endPos = leftChangedIt.value() + spanOffset;
chunkData.changedLeftPositions.insert(startPos, endPos);
leftChangedIt++;
}
}
while (leftChangedIt != leftChangedPositions.constEnd()) {
if (leftChangedIt.key() >= pos)
break;
const int startPos = leftChangedIt.key() + spanOffset;
const int endPos = leftChangedIt.value() + spanOffset;
chunkData.changedLeftPositions.insert(startPos, endPos);
leftChangedIt++;
}
QList<TextLineData> rightData;
spanOffset = 0;
pos = 0;
QMap<int, int>::ConstIterator rightChangedIt = rightChangedPositions.constBegin();
for (int i = 0; i < rightLines.count(); i++) {
for (int j = 0; j < rightLineSpans.value(i); j++) {
rightData.append(TextLineData(TextLineData::Separator));
spanOffset++;
}
const int textLength = rightLines.at(i).count() + 1;
pos += textLength;
rightData.append(rightLines.at(i));
while (rightChangedIt != rightChangedPositions.constEnd()) {
if (rightChangedIt.key() >= pos)
break;
const int startPos = rightChangedIt.key() + spanOffset;
const int endPos = rightChangedIt.value() + spanOffset;
chunkData.changedRightPositions.insert(startPos, endPos);
rightChangedIt++;
}
}
while (rightChangedIt != rightChangedPositions.constEnd()) {
if (rightChangedIt.key() >= pos)
break;
const int startPos = rightChangedIt.key() + spanOffset;
const int endPos = rightChangedIt.value() + spanOffset;
chunkData.changedRightPositions.insert(startPos, endPos);
rightChangedIt++;
}
// fill ending separators // fill ending separators
for (int i = leftData.count(); i < rightData.count(); i++) for (int i = leftData.count(); i < rightData.count(); i++)

View File

@@ -129,6 +129,10 @@ private:
QTextCursor &cursor, QTextCursor &cursor,
const QMap<int, int> &positions) const; const QMap<int, int> &positions) const;
void colorDiff(const FileData &fileData); void colorDiff(const FileData &fileData);
QList<TextLineData> assemblyRows(const QStringList &lines,
const QMap<int, int> &lineSpans,
const QMap<int, int> &changedPositions,
QMap<int, int> *outputChangedPositions) const;
ChunkData calculateOriginalData(const QList<Diff> &diffList) const; ChunkData calculateOriginalData(const QList<Diff> &diffList) const;
FileData calculateContextData(const ChunkData &originalData) const; FileData calculateContextData(const ChunkData &originalData) const;
void showDiff(); void showDiff();