summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/inc/IDocumentRedlineAccess.hxx1
-rw-r--r--sw/source/core/unocore/unocrsrhelper.cxx2
-rw-r--r--sw/source/filter/ww8/attributeoutputbase.hxx2
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx60
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.hxx2
-rw-r--r--sw/source/filter/ww8/rtfattributeoutput.cxx2
-rw-r--r--sw/source/filter/ww8/rtfattributeoutput.hxx2
-rw-r--r--sw/source/filter/ww8/wrtw8nds.cxx68
-rw-r--r--sw/source/filter/ww8/wrtww8.hxx3
-rw-r--r--sw/source/filter/ww8/ww8attributeoutput.hxx2
10 files changed, 127 insertions, 17 deletions
diff --git a/sw/inc/IDocumentRedlineAccess.hxx b/sw/inc/IDocumentRedlineAccess.hxx
index 8fd1555a68f7..ddea588de31b 100644
--- a/sw/inc/IDocumentRedlineAccess.hxx
+++ b/sw/inc/IDocumentRedlineAccess.hxx
@@ -64,6 +64,7 @@ namespace nsRedlineType_t
const RedlineType_t REDLINE_FORMAT = 0x2;// Attributes have been applied.
const RedlineType_t REDLINE_TABLE = 0x3;// Table structure has been altered.
const RedlineType_t REDLINE_FMTCOLL = 0x4;// Style has been altered (Autoformat!).
+ const RedlineType_t REDLINE_PARAGRAPH_FORMAT = 0x5;// Paragraph attributes have been changed
// When larger than 128, flags can be inserted.
const RedlineType_t REDLINE_NO_FLAG_MASK = 0x7F;
diff --git a/sw/source/core/unocore/unocrsrhelper.cxx b/sw/source/core/unocore/unocrsrhelper.cxx
index 8783e5a67e4a..d0bde04874d1 100644
--- a/sw/source/core/unocore/unocrsrhelper.cxx
+++ b/sw/source/core/unocore/unocrsrhelper.cxx
@@ -1184,6 +1184,8 @@ void makeRedline( SwPaM& rPaM,
eType = nsRedlineType_t::REDLINE_FORMAT;
else if ( rRedlineType == "TextTable" )
eType = nsRedlineType_t::REDLINE_TABLE;
+ else if ( rRedlineType == "ParagraphFormat" )
+ eType = nsRedlineType_t::REDLINE_PARAGRAPH_FORMAT;
else if( !rRedlineType.startsWith( "Insert" ))
throw lang::IllegalArgumentException();
diff --git a/sw/source/filter/ww8/attributeoutputbase.hxx b/sw/source/filter/ww8/attributeoutputbase.hxx
index 8060368d11d2..be3615ae0594 100644
--- a/sw/source/filter/ww8/attributeoutputbase.hxx
+++ b/sw/source/filter/ww8/attributeoutputbase.hxx
@@ -160,7 +160,7 @@ public:
virtual void StartParagraphProperties() = 0;
/// Called after we end outputting the attributes.
- virtual void EndParagraphProperties() = 0;
+ virtual void EndParagraphProperties( const SwRedlineData* pRedlineData ) = 0;
/// Empty paragraph.
virtual void EmptyParagraph() = 0;
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index b7f06a0d50bd..01d8afddb47e 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -676,8 +676,12 @@ void DocxAttributeOutput::WriteCollectedParagraphProperties()
}
}
-void DocxAttributeOutput::EndParagraphProperties()
+void DocxAttributeOutput::EndParagraphProperties( const SwRedlineData* pRedlineData )
{
+ // Call the 'Redline' function. This will add redline (change-tracking) information that regards to paragraph properties.
+ // This includes changes like 'Bold', 'Underline', 'Strikethrough' etc.
+ Redline( pRedlineData );
+
WriteCollectedParagraphProperties();
// Merge the marks for the ordered elements
@@ -1618,10 +1622,62 @@ void DocxAttributeOutput::Redline( const SwRedlineData* pRedline)
}
}
}
-
m_pSerializer->endElementNS( XML_w, XML_rPrChange );
+ break;
+
+ case nsRedlineType_t::REDLINE_PARAGRAPH_FORMAT:
+ m_pSerializer->startElementNS( XML_w, XML_pPrChange,
+ FSNS( XML_w, XML_id ), aId.getStr(),
+ FSNS( XML_w, XML_author ), aAuthor.getStr(),
+ FSNS( XML_w, XML_date ), aDate.getStr(),
+ FSEND );
+
+ // Check if there is any extra data stored in the redline object
+ if (pRedline->GetExtraData())
+ {
+ const SwRedlineExtraData* pExtraData = pRedline->GetExtraData();
+ const SwRedlineExtraData_FormattingChanges* pFormattingChanges = dynamic_cast<const SwRedlineExtraData_FormattingChanges*>(pExtraData);
+
+ // Check if the extra data is of type 'formatting changes'
+ if (pFormattingChanges)
+ {
+ // Get the item set that holds all the changes properties
+ const SfxItemSet *pChangesSet = pFormattingChanges->GetItemSet();
+ if (pChangesSet)
+ {
+ m_pSerializer->mark();
+
+ m_pSerializer->startElementNS( XML_w, XML_pPr, FSEND );
+ // The 'm_pFlyAttrList', 'm_pParagraphSpacingAttrList' are used to hold information
+ // that should be collected by different properties in the core, and are all flushed together
+ // to the DOCX when the function 'WriteCollectedParagraphProperties' gets called.
+ // So we need to store the current status of these lists, so that we can revert back to them when
+ // we are done exporting the redline attributes.
+ ::sax_fastparser::FastAttributeList *pFlyAttrList_Original = m_pFlyAttrList;
+ ::sax_fastparser::FastAttributeList *pParagraphSpacingAttrList_Original = m_pParagraphSpacingAttrList;
+ m_pFlyAttrList = NULL;
+ m_pParagraphSpacingAttrList = NULL;
+
+ // Output the redline item set
+ m_rExport.OutputItemSet( *pChangesSet, true, false, i18n::ScriptType::LATIN, m_rExport.mbExportModeRTF );
+
+ // Write the collected paragraph properties that are stored in 'm_pFlyAttrList', 'm_pParagraphSpacingAttrList'
+ WriteCollectedParagraphProperties();
+
+ // Revert back the original values that were stored in 'm_pFlyAttrList', 'm_pParagraphSpacingAttrList'
+ m_pFlyAttrList = pFlyAttrList_Original;
+ m_pParagraphSpacingAttrList = pParagraphSpacingAttrList_Original;
+
+ m_pSerializer->endElementNS( XML_w, XML_pPr );
+
+ m_pSerializer->mergeTopMarks( sax_fastparser::MERGE_MARKS_PREPEND );
+ }
+ }
+ }
+ m_pSerializer->endElementNS( XML_w, XML_pPrChange );
break;
+
default:
SAL_WARN("sw.ww8", "Unhandled redline type for export " << pRedline->GetType());
break;
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 18fd11e5fb11..1fb24a289508 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -141,7 +141,7 @@ public:
virtual void StartParagraphProperties();
/// Called after we end outputting the attributes.
- virtual void EndParagraphProperties();
+ virtual void EndParagraphProperties( const SwRedlineData* pRedlineData );
/// Start of the text run.
virtual void StartRun( const SwRedlineData* pRedlineData, bool bSingleEmptyRun = false );
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx
index d60d5c8a32f5..9fd03b277295 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -388,7 +388,7 @@ void RtfAttributeOutput::StartParagraphProperties()
m_aSectionHeaders.append(aPar.makeStringAndClear());
}
-void RtfAttributeOutput::EndParagraphProperties()
+void RtfAttributeOutput::EndParagraphProperties( const SwRedlineData* /*pRedlineData*/ )
{
SAL_INFO("sw.rtf", OSL_THIS_FUNC);
m_aStyles.append(m_aStylesEnd.makeStringAndClear());
diff --git a/sw/source/filter/ww8/rtfattributeoutput.hxx b/sw/source/filter/ww8/rtfattributeoutput.hxx
index 46a2562fd140..ab94dd71e9d4 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.hxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.hxx
@@ -57,7 +57,7 @@ public:
virtual void StartParagraphProperties();
/// Called after we end outputting the attributes.
- virtual void EndParagraphProperties();
+ virtual void EndParagraphProperties( const SwRedlineData* pRedlineData );
/// Start of the text run.
virtual void StartRun( const SwRedlineData* pRedlineData, bool bSingleEmptyRun = false );
diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
index 7c3657921a0c..322eb0c86d04 100644
--- a/sw/source/filter/ww8/wrtw8nds.cxx
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -1206,7 +1206,34 @@ bool SwWW8AttrIter::IsRedlineAtEnd( sal_Int32 nEnd ) const
return false;
}
-const SwRedlineData* SwWW8AttrIter::GetRedline( sal_Int32 nPos )
+const SwRedlineData* SwWW8AttrIter::GetParagraphLevelRedline( )
+{
+ pCurRedline = NULL;
+
+ // ToDo : this is not the most ideal ... should start maybe from 'nCurRedlinePos'
+ for( sal_uInt16 nRedlinePos = 0; nRedlinePos < m_rExport.pDoc->GetRedlineTbl().size(); ++nRedlinePos )
+ {
+ const SwRedline* pRedl = m_rExport.pDoc->GetRedlineTbl()[ nRedlinePos ];
+
+ const SwPosition* pCheckedStt = pRedl->Start();
+
+ if( pCheckedStt->nNode == rNd )
+ {
+ // Maybe add here a check that also the start & end of the redline is the entire paragraph
+
+ // Only return if this is a paragraph formatting redline
+ if (pRedl->GetType() == nsRedlineType_t::REDLINE_PARAGRAPH_FORMAT)
+ {
+ // write data of this redline
+ pCurRedline = pRedl;
+ return &( pCurRedline->GetRedlineData() );
+ }
+ }
+ }
+ return NULL;
+}
+
+const SwRedlineData* SwWW8AttrIter::GetRunLevelRedline( sal_Int32 nPos )
{
if( pCurRedline )
{
@@ -1219,8 +1246,19 @@ const SwRedlineData* SwWW8AttrIter::GetRedline( sal_Int32 nPos )
}
else
{
- // write data of current redline
- return &( pCurRedline->GetRedlineData() );
+ switch( pCurRedline->GetType() )
+ {
+ case nsRedlineType_t::REDLINE_INSERT:
+ case nsRedlineType_t::REDLINE_DELETE:
+ case nsRedlineType_t::REDLINE_FORMAT:
+ // write data of this redline
+ return &( pCurRedline->GetRedlineData() );
+ break;
+ default:
+ break;
+ };
+ pCurRedline = 0;
+ ++nCurRedlinePos;
}
}
@@ -1243,15 +1281,26 @@ const SwRedlineData* SwWW8AttrIter::GetRedline( sal_Int32 nPos )
{
if( pStt->nContent.GetIndex() == nPos )
{
- // write data of this redline
- pCurRedline = pRedl;
- return &( pCurRedline->GetRedlineData() );
+ switch( pRedl->GetType() )
+ {
+ case nsRedlineType_t::REDLINE_INSERT:
+ case nsRedlineType_t::REDLINE_DELETE:
+ case nsRedlineType_t::REDLINE_FORMAT:
+ // write data of this redline
+ pCurRedline = pRedl;
+ return &( pCurRedline->GetRedlineData() );
+ break;
+ default:
+ break;
+ };
}
break;
}
}
else
+ {
break;
+ }
if( pEnd->nNode == rNd &&
pEnd->nContent.GetIndex() < nPos )
@@ -1823,7 +1872,7 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
pTextNodeInfoInner = pTextNodeInfo->getFirstInner();
do {
- const SwRedlineData* pRedlineData = aAttrIter.GetRedline( nAktPos );
+ const SwRedlineData* pRedlineData = aAttrIter.GetRunLevelRedline( nAktPos );
sal_Int32 nNextAttr = GetNextPos( &aAttrIter, rNode, nAktPos );
// Is this the only run in this paragraph and it's empty?
@@ -2053,7 +2102,7 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
if ( bRedlineAtEnd )
{
- AttrOutput().Redline( aAttrIter.GetRedline( nEnd ) );
+ AttrOutput().Redline( aAttrIter.GetRunLevelRedline( nEnd ) );
AttrOutput().OutputFKP();
}
}
@@ -2378,7 +2427,8 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
}
}
- AttrOutput().EndParagraphProperties();
+ const SwRedlineData* pParagraphRedlineData = aAttrIter.GetParagraphLevelRedline( );
+ AttrOutput().EndParagraphProperties( pParagraphRedlineData );
AttrOutput().EndParagraph( pTextNodeInfoInner );
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index 23a964fcc4bb..750bdb457900 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -1492,7 +1492,8 @@ public:
virtual const SfxPoolItem* HasTextItem( sal_uInt16 nWhich ) const;
virtual const SfxPoolItem& GetItem( sal_uInt16 nWhich ) const;
int OutAttrWithRange(sal_Int32 nPos);
- const SwRedlineData* GetRedline( sal_Int32 nPos );
+ const SwRedlineData* GetParagraphLevelRedline( );
+ const SwRedlineData* GetRunLevelRedline( sal_Int32 nPos );
void OutFlys(sal_Int32 nSwPos);
sal_Int32 WhereNext() const { return nAktSwPos; }
diff --git a/sw/source/filter/ww8/ww8attributeoutput.hxx b/sw/source/filter/ww8/ww8attributeoutput.hxx
index ef844ea7273b..20fae7e8d0c9 100644
--- a/sw/source/filter/ww8/ww8attributeoutput.hxx
+++ b/sw/source/filter/ww8/ww8attributeoutput.hxx
@@ -42,7 +42,7 @@ public:
virtual void StartParagraphProperties() {}
/// Called after we end outputting the attributes.
- virtual void EndParagraphProperties() {}
+ virtual void EndParagraphProperties( const SwRedlineData* /*pRedlineData*/ ) {}
/// Empty paragraph.
virtual void EmptyParagraph();