[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [koffice/koffice/change-tracking] libs/kotext/
From: Ganesh Paramasivam <ganesh () crystalfab ! com>
Date: 2011-01-21 8:49:58
Message-ID: 20110121084958.98520A6092 () git ! kde ! org
[Download RAW message or body]
Git commit 94fa1cbc8d0991c62e0b6bed18f0d54938bd5d4f by Ganesh Paramasivam
Pushed by ganeshp into branch koffice/change-tracking
Stable version for support of multiple and overlapping changes ( loading and saving \
). It's still a work-in-progress. More support expected to be added over the next \
couple of weeks
M +5 -2 libs/kotext/changetracker/KoChangeTracker.cpp
M +1 -1 libs/kotext/changetracker/KoChangeTracker.h
M +32 -2 libs/kotext/opendocument/KoTextWriter.cpp
M +3 -2 libs/kotext/opendocument/tests/TestChangeTracking.cpp
http://commits.kde.org/68dc8371/94fa1cbc8d0991c62e0b6bed18f0d54938bd5d4f
diff --git a/libs/kotext/changetracker/KoChangeTracker.cpp \
b/libs/kotext/changetracker/KoChangeTracker.cpp index d398ed7..b22f6ac 100644
--- a/libs/kotext/changetracker/KoChangeTracker.cpp
+++ b/libs/kotext/changetracker/KoChangeTracker.cpp
@@ -189,6 +189,9 @@ int KoChangeTracker::getDeleteChangeId(QString title, \
QTextDocumentFragment sele
KoChangeTrackerElement* KoChangeTracker::elementById(int id)
{
+ if (isDuplicateChangeId(id)) {
+ id = originalChangeId(id);
+ }
return d->changes.value(id);
}
@@ -275,7 +278,7 @@ bool KoChangeTracker::isDuplicateChangeId(int duplicateChangeId)
return isDuplicate;
}
-bool KoChangeTracker::originalChangeId(int duplicateChangeId)
+int KoChangeTracker::originalChangeId(int duplicateChangeId)
{
int originalChangeId = 0;
QMultiHash<int, int>::const_iterator i = d->duplicateIds.constBegin();
@@ -287,7 +290,7 @@ bool KoChangeTracker::originalChangeId(int duplicateChangeId)
}
++i;
}
-
+
return originalChangeId;
}
diff --git a/libs/kotext/changetracker/KoChangeTracker.h \
b/libs/kotext/changetracker/KoChangeTracker.h index f618520..a078645 100644
--- a/libs/kotext/changetracker/KoChangeTracker.h
+++ b/libs/kotext/changetracker/KoChangeTracker.h
@@ -94,7 +94,7 @@ public:
int createDuplicateChangeId(int existingChangeId);
bool isDuplicateChangeId(int duplicateChangeId);
- bool originalChangeId(int duplicateChangeId);
+ int originalChangeId(int duplicateChangeId);
void acceptRejectChange(int changeId, bool set);
diff --git a/libs/kotext/opendocument/KoTextWriter.cpp \
b/libs/kotext/opendocument/KoTextWriter.cpp index e905d9f..f6f533c 100644
--- a/libs/kotext/opendocument/KoTextWriter.cpp
+++ b/libs/kotext/opendocument/KoTextWriter.cpp
@@ -317,7 +317,17 @@ int KoTextWriter::Private::openTagRegion(int position, \
ElementType elementType,
if (!changeId || (changeStack.top() == changeId)) {
changeId = 0;
- }
+ } else if ((changeTracker->isDuplicateChangeId(changeId)) && \
(changeTracker->originalChangeId(changeId) == changeStack.top())) { + \
QVectorIterator<int> changeStackIterator(changeStack); + \
changeStackIterator.toBack(); +
+ while ((changeStackIterator.peekPrevious()) && \
(changeStackIterator.peekPrevious() == changeTracker->originalChangeId(changeId))) { \
+ changeStackIterator.previous(); + changeId = \
changeTracker->parent(changeId); + }
+ } else if ((changeTracker->isDuplicateChangeId(changeId)) && \
(changeTracker->isParent(changeStack.top(), changeId))) { + changeId = 0;
+ }
returnChangeId = changeId;
@@ -334,6 +344,9 @@ int KoTextWriter::Private::openTagRegion(int position, \
ElementType elementType,
while(changeHistory.size()) {
int changeId = changeHistory.pop();
+ if (changeTracker->isDuplicateChangeId(changeId)) {
+ changeId = changeTracker->originalChangeId(changeId);
+ }
if (changeId && changeTracker->elementById(changeId)->getChangeType() == \
KoGenChange::DeleteChange) { writer->startElement("delta:removed-content", false);
@@ -581,6 +594,9 @@ void KoTextWriter::Private::saveParagraph(const QTextBlock \
&block, int from, int QTextFragment firstFragment = (block.begin()).fragment();
QTextCharFormat firstFragmentFormat = firstFragment.charFormat();
int firstFragmentChangeId = \
firstFragmentFormat.intProperty(KoCharacterStyle::ChangeTrackerId); + if \
(changeTracker->isDuplicateChangeId(firstFragmentChangeId)) { + \
firstFragmentChangeId = changeTracker->originalChangeId(firstFragmentChangeId); + \
} if (firstFragmentChangeId != changeId) {
QString outputXml("<delta:removed-content \
delta:removal-change-idref=\"" + changeTransTable.value(changeId) + "\"/>"); \
writer->addCompleteElement(outputXml.toUtf8()); @@ -747,6 +763,9 @@ void \
KoTextWriter::Private::saveParagraph(const QTextBlock &block, int from, int \
QTextFragment lastFragment = (--block.end()).fragment();
QTextCharFormat lastFragmentFormat = lastFragment.charFormat();
int lastFragmentChangeId = \
lastFragmentFormat.intProperty(KoCharacterStyle::ChangeTrackerId); + if \
(changeTracker->isDuplicateChangeId(lastFragmentChangeId)) { + \
lastFragmentChangeId = changeTracker->originalChangeId(lastFragmentChangeId); + \
} if (lastFragmentChangeId != changeId) {
QString outputXml("<delta:removed-content \
delta:removal-change-idref=\"" + changeTransTable.value(changeId) + "\"/>"); \
writer->addCompleteElement(outputXml.toUtf8()); @@ -848,6 +867,10 @@ int \
KoTextWriter::Private::checkForListChange(const QTextBlock &listBlock) int changeId \
= 0; do {
int currentChangeId = checkForBlockChange(block);
+ if (changeTracker->isDuplicateChangeId(currentChangeId)) {
+ currentChangeId = changeTracker->originalChangeId(currentChangeId);
+ }
+
if (!currentChangeId) {
// Encountered a list-item that is not a change
// So break out of loop and return 0
@@ -885,7 +908,6 @@ int KoTextWriter::Private::checkForListChange(const QTextBlock \
&listBlock) }
}
} while ((textDocument.list(block) == list) && (KoList::level(block) >= \
topListLevel));
-
return changeId;
}
@@ -1326,6 +1348,10 @@ int KoTextWriter::Private::checkForMergeOrSplit(const \
QTextBlock &block, KoGenCh } else {
nextBlockChangeId = \
endBlock.next().blockFormat().property(KoCharacterStyle::ChangeTrackerId).toInt(); }
+
+ if (changeTracker->isDuplicateChangeId(nextBlockChangeId)) {
+ nextBlockChangeId = changeTracker->originalChangeId(nextBlockChangeId);
+ }
if (!changeId) {
splitMergeChangeId = changeId = nextBlockChangeId;
@@ -1348,6 +1374,10 @@ int KoTextWriter::Private::checkForMergeOrSplit(const \
QTextBlock &block, KoGenCh QTextFragment lastFragment = \
(--(endBlock.end())).fragment(); QTextCharFormat lastFragmentFormat = \
lastFragment.charFormat();
int lastFragmentChangeId = \
lastFragmentFormat.intProperty(KoCharacterStyle::ChangeTrackerId); + if \
(changeTracker->isDuplicateChangeId(lastFragmentChangeId)) { + \
lastFragmentChangeId = changeTracker->originalChangeId(lastFragmentChangeId); + \
} +
if (lastFragmentChangeId != splitMergeChangeId) {
endBlockNumber = endBlock.blockNumber();
}
diff --git a/libs/kotext/opendocument/tests/TestChangeTracking.cpp \
b/libs/kotext/opendocument/tests/TestChangeTracking.cpp index b5549a4..f66ef8e 100644
--- a/libs/kotext/opendocument/tests/TestChangeTracking.cpp
+++ b/libs/kotext/opendocument/tests/TestChangeTracking.cpp
@@ -299,9 +299,10 @@ void TestChangeTracking::testChangeTracking_data()
QTest::newRow("Others-3") << \
"ChangeTracking/other/list-table-list-1/list-table-list-tracked.odt";
//Multiple and Overlapping changes
+ QTest::newRow("Multiple Paragraph Changes") << \
"ChangeTracking/multiple-changes/para-add-then-delete/para-add-delete-tracked.odt"; + \
QTest::newRow("Multiple Span Changes") << \
"ChangeTracking/multiple-changes/insert-delete-span/insert-delete-span-tracked.odt";
QTest::newRow("Paragraph Overlapping") << \
"ChangeTracking/overlapping/text-delete-within-added-p/text-delete-within-added-p-tracked.odt";
- //QTest::newRow("Multiple Paragraph Changes") << \
"ChangeTracking/multiple-changes/para-add-then-delete/para-add-delete-tracked.odt";
- //QTest::newRow("Multiple Span Changes") << \
"ChangeTracking/multiple-changes/insert-delete-span/insert-delete-span-tracked.odt"; \
+ QTest::newRow("List Overlapping") << \
"ChangeTracking/overlapping/insert-list-item-delete-list/insert-list-item-delete-list-tracked.odt";
}
diff --git a/libs/kotext/opendocument/tests/data/ChangeTracking/multiple-changes/insert-delete-span/insert-delete-span-tracked.odt \
b/libs/kotext/opendocument/tests/data/ChangeTracking/multiple-changes/insert-delete-span/insert-delete-span-tracked.odt
index 9518a9a..23069f4 100755
Binary files a/libs/kotext/opendocument/tests/data/ChangeTracking/multiple-changes/insert-delete-span/insert-delete-span-tracked.odt \
and b/libs/kotext/opendocument/tests/data/ChangeTracking/multiple-changes/insert-delete-span/insert-delete-span-tracked.odt \
differ
diff --git a/libs/kotext/opendocument/tests/data/ChangeTracking/multiple-changes/para-add-then-delete/para-add-delete-tracked.odt \
b/libs/kotext/opendocument/tests/data/ChangeTracking/multiple-changes/para-add-then-delete/para-add-delete-tracked.odt
index 4ee30c2..dae11de 100755
Binary files a/libs/kotext/opendocument/tests/data/ChangeTracking/multiple-changes/para-add-then-delete/para-add-delete-tracked.odt \
and b/libs/kotext/opendocument/tests/data/ChangeTracking/multiple-changes/para-add-then-delete/para-add-delete-tracked.odt \
differ
diff --git a/libs/kotext/opendocument/tests/data/ChangeTracking/overlapping/insert-list-item-delete-list/insert-list-item-delete-list-tracked.odt \
b/libs/kotext/opendocument/tests/data/ChangeTracking/overlapping/insert-list-item-delete-list/insert-list-item-delete-list-tracked.odt
index 9a63134..2bd5ae2 100755
Binary files a/libs/kotext/opendocument/tests/data/ChangeTracking/overlapping/insert-list-item-delete-list/insert-list-item-delete-list-tracked.odt \
and b/libs/kotext/opendocument/tests/data/ChangeTracking/overlapping/insert-list-item-delete-list/insert-list-item-delete-list-tracked.odt \
differ
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic