[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/work/koffice-change-tracking/libs/kotext/opendocument
From:       Ganesh Paramasivam <ganesh () crystalfab ! com>
Date:       2011-01-13 7:01:26
Message-ID: 20110113070126.AEC61AC8B3 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1214132 by ganeshp:

First steps in the refactoring of change saving to be able to support multiple and \
over-lapping changes ( example:- add, style-change and delete a paragraph/text )

 M  +63 -25    KoTextWriter.cpp  
 M  +1 -0      KoTextWriter.h  


--- branches/work/koffice-change-tracking/libs/kotext/opendocument/KoTextWriter.cpp \
#1214131:1214132 @@ -69,6 +69,44 @@
 #include <Soprano/Soprano>
 #endif
 
+class KoTextWriter::TagInformation
+{
+    public:
+        TagInformation():tagName(), attributeList()
+        {
+        }
+
+        void setTagName(const QString& tagName) 
+        {
+            this->tagName = tagName;
+        }
+
+        void addAttribute(const QString& attributeName, const QString& \
attributeValue) +        {
+            attributeList.push_back(QPair<QString,QString>(attributeName, \
attributeValue)); +        }
+
+        void clear()
+        {
+            tagName.clear();
+            attributeList.clear();
+        }
+
+        const QString& name() const
+        {
+            return tagName;
+        }
+
+        const QVector<QPair<QString, QString> > attributes() const
+        {
+            return attributeList;
+        }
+
+    private:
+        QString tagName;
+        QVector<QPair<QString, QString> > attributeList;
+};
+
 class KoTextWriter::Private
 {
 public:
@@ -106,8 +144,8 @@
 
     void saveChange(QTextCharFormat format);
     void saveChange(int changeId);
-    int openChangeRegion(int position, ElementType elementType);
-    void closeChangeRegion();
+    int openTagRegion(int position, ElementType elementType, const \
KoTextWriter::TagInformation& tagDetails = KoTextWriter::TagInformation()); +    void \
closeTagRegion();  
     QString saveParagraphStyle(const QTextBlock &block);
     QString saveCharacterStyle(const QTextCharFormat &charFormat, const \
QTextCharFormat &blockCharFormat); @@ -229,7 +267,7 @@
     changeTransTable.insert(changeId, changeName);
 }
 
-int KoTextWriter::Private::openChangeRegion(int position, ElementType elementType)
+int KoTextWriter::Private::openTagRegion(int position, ElementType elementType, \
const KoTextWriter::TagInformation& tagDetails)  {
     int changeId = 0;
     QTextCursor cursor(document);
@@ -284,7 +322,7 @@
     return changeId;
 }
 
-void KoTextWriter::Private::closeChangeRegion()
+void KoTextWriter::Private::closeTagRegion()
 {
     int changeId = changeStack.pop();
     if (changeId && changeTracker->elementById(changeId)->getChangeType() == \
KoGenChange::DeleteChange) { @@ -457,7 +495,7 @@
     
     QTextBlockFormat blockFormat = block.blockFormat();
     const int outlineLevel = \
                blockFormat.intProperty(KoParagraphStyle::OutlineLevel);
-    int changeId = openChangeRegion(block.position(), \
KoTextWriter::Private::ParagraphOrHeader); +    int changeId = \
openTagRegion(block.position(), KoTextWriter::Private::ParagraphOrHeader);  if \
(outlineLevel > 0) {  writer->startElement("text:h", false);
         writer->addAttribute("text:outline-level", outlineLevel);
@@ -585,7 +623,7 @@
                     }
 
                     if (saveInlineObject) {
-                        int changeId = openChangeRegion(currentFragment.position(), \
KoTextWriter::Private::Span); +                        int changeId = \
                openTagRegion(currentFragment.position(), \
                KoTextWriter::Private::Span);
                         KoTextAnchor *textAnchor = dynamic_cast<KoTextAnchor \
                *>(inlineObject);
                         if (textAnchor && changeId && \
                changeTracker->elementById(changeId)->getChangeType() == \
                KoGenChange::InsertChange) {
                             \
textAnchor->shape()->setAdditionalAttribute("delta:insertion-change-idref", \
changeTransTable.value(changeId)); @@ -600,7 +638,7 @@
                         }
                         
                         if (changeId)
-                            closeChangeRegion();
+                            closeTagRegion();
                     }
 
                     if (saveSpan) {
@@ -626,7 +664,7 @@
                     }
                 }
             } else {
-                int changeId = openChangeRegion(currentFragment.position(), \
KoTextWriter::Private::Span); +                int changeId = \
                openTagRegion(currentFragment.position(), \
                KoTextWriter::Private::Span);
                 QString styleName = saveCharacterStyle(charFormat, blockCharFormat);
                 if (charFormat.isAnchor()) {
                     writer->startElement("text:a", false);
@@ -658,7 +696,7 @@
                 }
 
                 if (changeId)
-                    closeChangeRegion();
+                    closeTagRegion();
             } // if (inlineObject)
 
             previousCharFormat = charFormat;
@@ -673,7 +711,7 @@
     }
 
     if (changeId)
-        closeChangeRegion();
+        closeTagRegion();
 
     QTextBlock nextBlock = block.next();
     if (nextBlock.isValid() && deleteMergeRegionOpened) {
@@ -868,7 +906,7 @@
 
 void KoTextWriter::Private::saveTable(QTextTable *table, QHash<QTextList *, QString> \
&listStyles)  {
-    int changeId = openChangeRegion(table->firstCursorPosition().position(), \
KoTextWriter::Private::Table); +    int changeId = \
openTagRegion(table->firstCursorPosition().position(), KoTextWriter::Private::Table); \
writer->startElement("table:table");  
     if (changeId && changeTracker->elementById(changeId)->getChangeType() == \
KoGenChange::InsertChange) { @@ -877,7 +915,7 @@
     }
     
     for (int c = 0 ; c < table->columns() ; c++) {
-        int changeId = \
openChangeRegion(table->cellAt(0,c).firstCursorPosition().position(), \
KoTextWriter::Private::TableColumn); +        int changeId = \
openTagRegion(table->cellAt(0,c).firstCursorPosition().position(), \
KoTextWriter::Private::TableColumn);  writer->startElement("table:table-column");
 
         if (changeId && changeTracker->elementById(changeId)->getChangeType() == \
KoGenChange::InsertChange) { @@ -888,10 +926,10 @@
         writer->endElement(); // table:table-column
 
         if (changeId)
-            closeChangeRegion();
+            closeTagRegion();
     }
     for (int r = 0 ; r < table->rows() ; r++) {
-        int changeId = \
openChangeRegion(table->cellAt(r,0).firstCursorPosition().position(), \
KoTextWriter::Private::TableRow); +        int changeId = \
openTagRegion(table->cellAt(r,0).firstCursorPosition().position(), \
KoTextWriter::Private::TableRow);  writer->startElement("table:table-row");
 
         if (changeId && changeTracker->elementById(changeId)->getChangeType() == \
KoGenChange::InsertChange) { @@ -901,7 +939,7 @@
 
         for (int c = 0 ; c < table->columns() ; c++) {
             QTextTableCell cell = table->cellAt(r, c);
-            int changeId = \
openChangeRegion(table->cellAt(r,c).firstCursorPosition().position(), \
KoTextWriter::Private::TableCell); +            int changeId = \
openTagRegion(table->cellAt(r,c).firstCursorPosition().position(), \
KoTextWriter::Private::TableCell);  if ((cell.row() == r) && (cell.column() == c)) {
                 writer->startElement("table:table-cell");
                 writer->addAttribute("rowSpan", cell.rowSpan());
@@ -928,16 +966,16 @@
             }
             writer->endElement(); // table:table-cell
             if (changeId)
-                closeChangeRegion();
+                closeTagRegion();
         }
         writer->endElement(); // table:table-row
         if (changeId)
-            closeChangeRegion();
+            closeTagRegion();
     }
     writer->endElement(); // table:table
 
     if (changeId)
-        closeChangeRegion();
+        closeTagRegion();
 }
 
 void KoTextWriter::Private::saveTableOfContents(QTextDocument *document, int from, \
int to, QHash<QTextList *, QString> &listStyles, QTextTable *currentTable, QTextFrame \
*toc) @@ -1009,7 +1047,7 @@
     int listChangeId = 0;
     if (!headingLevel && !numberedParagraphLevel) {
         listStarted = true;
-        listChangeId = openChangeRegion(block.position(), \
KoTextWriter::Private::List); +        listChangeId = openTagRegion(block.position(), \
KoTextWriter::Private::List);  writer->startElement("text:list", false);
         writer->addAttribute("text:style-name", listStyles[textList]);
         if (textList->format().hasProperty(KoListStyle::ContinueNumbering))
@@ -1024,7 +1062,7 @@
     if (!headingLevel) {
         do {
             if (numberedParagraphLevel) {
-                int changeId = openChangeRegion(block.position(), \
KoTextWriter::Private::NumberedParagraph); +                int changeId = \
openTagRegion(block.position(), KoTextWriter::Private::NumberedParagraph);  \
                writer->startElement("text:numbered-paragraph", false);
                 writer->addAttribute("text:level", numberedParagraphLevel);
                 writer->addAttribute("text:style-name", listStyles.value(textList));
@@ -1038,7 +1076,7 @@
                 writer->endElement(); 
                 
                 if (changeId) {
-                    closeChangeRegion();
+                    closeTagRegion();
                 }
             } else {
                 int endBlockNumber = checkForSplit(block);
@@ -1051,10 +1089,10 @@
                 const bool listHeader = \
blockFormat.boolProperty(KoParagraphStyle::IsListHeader)|| \
blockFormat.boolProperty(KoParagraphStyle::UnnumberedListItem);  int \
listItemChangeId;  if (textList == topLevelTextList) {
-                    listItemChangeId = openChangeRegion(block.position(), \
KoTextWriter::Private::ListItem); +                    listItemChangeId = \
openTagRegion(block.position(), KoTextWriter::Private::ListItem);  } else {
                     // This is a sub-list. So check for a list-change
-                    listItemChangeId = openChangeRegion(block.position(), \
KoTextWriter::Private::List); +                    listItemChangeId = \
openTagRegion(block.position(), KoTextWriter::Private::List);  }
 
                 writer->startElement(listHeader ? "text:list-header" : \
"text:list-item", false); @@ -1090,7 +1128,7 @@
                     block = block.previous();
                 }
                 if (listItemChangeId)
-                   closeChangeRegion();
+                   closeTagRegion();
                 writer->endElement(); 
 
                 if (splitRegionOpened && (block.blockNumber() == \
splitEndBlockNumber)) { @@ -1110,7 +1148,7 @@
 
     if (listStarted) {
         if (listChangeId)
-            closeChangeRegion();
+            closeTagRegion();
         writer->endElement();
     }
 
--- branches/work/koffice-change-tracking/libs/kotext/opendocument/KoTextWriter.h \
#1214131:1214132 @@ -72,6 +72,7 @@
 private:
     class Private;
     Private* const d;
+    class TagInformation;
 };
 
 #endif


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic