sw/qa/extras/ooxmlexport/data/FDO73034.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 8 +++++ sw/source/filter/ww8/attributeoutputbase.hxx | 2 - sw/source/filter/ww8/docxattributeoutput.cxx | 41 +++++++++++++++++++++++++-- sw/source/filter/ww8/docxattributeoutput.hxx | 2 - sw/source/filter/ww8/rtfattributeoutput.cxx | 2 - sw/source/filter/ww8/rtfattributeoutput.hxx | 2 - sw/source/filter/ww8/wrtw8nds.cxx | 27 ++++++++++++++++- sw/source/filter/ww8/ww8attributeoutput.hxx | 2 - 9 files changed, 76 insertions(+), 10 deletions(-)
New commits: commit 5201aa548165fb043b367fd58c647696942ae8df Author: Rohit Deshmukh <rohit.deshm...@synerzip.com> Date: Fri Dec 27 12:07:59 2013 +0530 fdo#73034: Fix for Extra spacing in document. Cause: - Extra space gets added in document due to default <rPr> is getting removed from <pPr>. Implementation: - The 'rPr' inside 'pPr' means the properties of the 'paragraph marker'. - In that case - the paragraph marker will have different formatting then the rest of the runs in the paragraph. - Added default rpr tag in pPr. Reviewed on: https://gerrit.libreoffice.org/7216 Change-Id: I5a1a1f251ccc5b555ea6bf3bac3e69af8b2b69b5 diff --git a/sw/qa/extras/ooxmlexport/data/FDO73034.docx b/sw/qa/extras/ooxmlexport/data/FDO73034.docx new file mode 100644 index 0000000..c3f8c92 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO73034.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index fc7079a..eca2519 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -2266,6 +2266,14 @@ DECLARE_OOXMLEXPORT_TEST(testTextBoxPictureFill, "textbox_picturefill.docx") CPPUNIT_ASSERT(!(getProperty<OUString>(xFrame,"BackGraphicURL")).isEmpty()); } +DECLARE_OOXMLEXPORT_TEST(testFDO73034, "FDO73034.docx") +{ + xmlDocPtr pXmlDoc = parseExport("word/document.xml"); + if (!pXmlDoc) + return; + CPPUNIT_ASSERT(getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:rPr/w:u", "val").match("single")); +} + #endif CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/ww8/attributeoutputbase.hxx b/sw/source/filter/ww8/attributeoutputbase.hxx index d8b83e1..07a800f 100644 --- a/sw/source/filter/ww8/attributeoutputbase.hxx +++ b/sw/source/filter/ww8/attributeoutputbase.hxx @@ -161,7 +161,7 @@ public: virtual void StartParagraphProperties() = 0; /// Called after we end outputting the attributes. - virtual void EndParagraphProperties( const SwRedlineData* pRedlineData, const SwRedlineData* pRedlineParagraphMarkerDeleted, const SwRedlineData* pRedlineParagraphMarkerInserted ) = 0; + virtual void EndParagraphProperties(const boost::shared_ptr<SfxItemSet> pParagraphMarkerProperties, const SwRedlineData* pRedlineData, const SwRedlineData* pRedlineParagraphMarkerDeleted, const SwRedlineData* pRedlineParagraphMarkerInserted) = 0; /// Empty paragraph. virtual void EmptyParagraph() = 0; diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 020c84d..93370ea 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -80,6 +80,7 @@ #include <svl/grabbagitem.hxx> #include <sfx2/sfxbasemodel.hxx> #include <tools/datetimeutils.hxx> +#include <svl/whiter.hxx> #include <docufld.hxx> #include <flddropdown.hxx> @@ -554,7 +555,7 @@ void DocxAttributeOutput::WriteCollectedParagraphProperties() } } -void DocxAttributeOutput::EndParagraphProperties( const SwRedlineData* pRedlineData, const SwRedlineData* pRedlineParagraphMarkerDeleted, const SwRedlineData* pRedlineParagraphMarkerInserted ) +void DocxAttributeOutput::EndParagraphProperties( const boost::shared_ptr<SfxItemSet> pParagraphMarkerProperties, const SwRedlineData* pRedlineData, const SwRedlineData* pRedlineParagraphMarkerDeleted, const SwRedlineData* pRedlineParagraphMarkerInserted) { // Call the 'Redline' function. This will add redline (change-tracking) information that regards to paragraph properties. // This includes changes like 'Bold', 'Underline', 'Strikethrough' etc. @@ -563,11 +564,45 @@ void DocxAttributeOutput::EndParagraphProperties( const SwRedlineData* pRedlineD WriteCollectedParagraphProperties(); // Write 'Paragraph Mark' properties - bool bIsParagraphMarkProperties = false; // In future - get the 'paragraph marker' properties as a parameter - if (bIsParagraphMarkProperties || pRedlineParagraphMarkerDeleted || pRedlineParagraphMarkerInserted) + if ( pRedlineParagraphMarkerDeleted || pRedlineParagraphMarkerInserted || pParagraphMarkerProperties) { m_pSerializer->startElementNS( XML_w, XML_rPr, FSEND ); + if(pParagraphMarkerProperties) + { + SfxWhichIter aIter( *pParagraphMarkerProperties ); + sal_uInt16 nWhichId = aIter.FirstWhich(); + const SfxPoolItem* pItem = 0; + while( nWhichId ) + { + if( SFX_ITEM_SET == pParagraphMarkerProperties->GetItemState( nWhichId, sal_True, &pItem )) + { + SAL_INFO( "sw.ww8", "nWhichId " << nWhichId); + OutputItem( *pItem ); + } + nWhichId = aIter.NextWhich(); + } + + // The 'm_pFontsAttrList', 'm_pEastAsianLayoutAttrList', 'm_pCharLangAttrList' 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 'WriteCollectedRunProperties' 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 *pFontsAttrList_Original = m_pFontsAttrList; + ::sax_fastparser::FastAttributeList *pEastAsianLayoutAttrList_Original = m_pEastAsianLayoutAttrList; + ::sax_fastparser::FastAttributeList *pCharLangAttrList_Original = m_pCharLangAttrList; + m_pFontsAttrList = NULL; + m_pEastAsianLayoutAttrList = NULL; + m_pCharLangAttrList = NULL; + + // Write the collected run properties that are stored in 'm_pFontsAttrList', 'm_pEastAsianLayoutAttrList', 'm_pCharLangAttrList' + WriteCollectedRunProperties(); + + // Revert back the original values that were stored in 'm_pFontsAttrList', 'm_pEastAsianLayoutAttrList', 'm_pCharLangAttrList' + m_pFontsAttrList = pFontsAttrList_Original; + m_pEastAsianLayoutAttrList = pEastAsianLayoutAttrList_Original; + m_pCharLangAttrList = pCharLangAttrList_Original; + } if ( pRedlineParagraphMarkerDeleted ) { StartRedline( pRedlineParagraphMarkerDeleted ); diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index 998f06f..2ceab5a 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( const SwRedlineData* pRedlineData, const SwRedlineData* pRedlineParagraphMarkerDeleted, const SwRedlineData* pRedlineParagraphMarkerInserted ); + virtual void EndParagraphProperties( const boost::shared_ptr<SfxItemSet> pParagraphMarkerProperties, const SwRedlineData* pRedlineData, const SwRedlineData* pRedlineParagraphMarkerDeleted, const SwRedlineData* pRedlineParagraphMarkerInserted); /// 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 ed09334..b09440e 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( const SwRedlineData* /*pRedlineData*/, const SwRedlineData* /*pRedlineParagraphMarkerDeleted*/, const SwRedlineData* /*pRedlineParagraphMarkerInserted*/ ) +void RtfAttributeOutput::EndParagraphProperties( const boost::shared_ptr<SfxItemSet> /*pParagraphMarkerProperties*/, const SwRedlineData* /*pRedlineData*/, const SwRedlineData* /*pRedlineParagraphMarkerDeleted*/, const SwRedlineData* /*pRedlineParagraphMarkerInserted*/) { 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 b616f62..426f643 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( const SwRedlineData* pRedlineData, const SwRedlineData* pRedlineParagraphMarkerDeleted, const SwRedlineData* pRedlineParagraphMarkerInserted ); + virtual void EndParagraphProperties( const boost::shared_ptr<SfxItemSet> pParagraphMarkerProperties, const SwRedlineData* pRedlineData, const SwRedlineData* pRedlineParagraphMarkerDeleted, const SwRedlineData* pRedlineParagraphMarkerInserted ); /// 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 967ad08..747d1ac 100644 --- a/sw/source/filter/ww8/wrtw8nds.cxx +++ b/sw/source/filter/ww8/wrtw8nds.cxx @@ -2426,11 +2426,34 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode ) delete pNewSet; } } - + boost::shared_ptr<SfxItemSet> sfxItemSet ; + if(const SwpHints* pTxtAttrs = rNode.GetpSwpHints()) + { + for( sal_uInt16 i = 0; i < pTxtAttrs->Count(); i++ ) + { + const SwTxtAttr* pHt = (*pTxtAttrs)[i]; + const sal_Int32* startPos = pHt->GetStart(); // first Attr characters + const sal_Int32* endPos = pHt->End(); // end Attr characters + // Check if these attributes are for the last character in the paragraph + // - which means the paragraph marker. If a paragraph has 7 characters, + // then properties on character 8 are for the paragraph marker + if( (startPos && endPos) && (*startPos == *endPos ) && (*endPos == rNode.GetTxt().getLength()) ) + { + SAL_INFO( "sw.ww8", *startPos << "startPos == endPos" << *endPos); + sal_uInt16 nWhich = pHt->GetAttr().Which(); + SAL_INFO( "sw.ww8", "nWhich" << nWhich); + if (nWhich == RES_TXTATR_AUTOFMT) + { + const SwFmtAutoFmt& rAutoFmt = static_cast<const SwFmtAutoFmt&>(pHt->GetAttr()); + sfxItemSet = rAutoFmt.GetStyleHandle(); + } + } + } + } const SwRedlineData* pRedlineParagraphMarkerDelete = AttrOutput().GetParagraphMarkerRedline( rNode, nsRedlineType_t::REDLINE_DELETE ); const SwRedlineData* pRedlineParagraphMarkerInsert = AttrOutput().GetParagraphMarkerRedline( rNode, nsRedlineType_t::REDLINE_INSERT ); const SwRedlineData* pParagraphRedlineData = aAttrIter.GetParagraphLevelRedline( ); - AttrOutput().EndParagraphProperties( pParagraphRedlineData, pRedlineParagraphMarkerDelete, pRedlineParagraphMarkerInsert ); + AttrOutput().EndParagraphProperties( sfxItemSet, pParagraphRedlineData, pRedlineParagraphMarkerDelete, pRedlineParagraphMarkerInsert); AttrOutput().EndParagraph( pTextNodeInfoInner ); diff --git a/sw/source/filter/ww8/ww8attributeoutput.hxx b/sw/source/filter/ww8/ww8attributeoutput.hxx index 72be7ae..924060b 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( const SwRedlineData* /*pRedlineData*/, const SwRedlineData* /*pRedlineParagraphMarkerDeleted*/, const SwRedlineData* /*pRedlineParagraphMarkerInserted*/ ) {} + virtual void EndParagraphProperties( const boost::shared_ptr<SfxItemSet> /*pParagraphMarkerProperties*/, const SwRedlineData* /*pRedlineData*/, const SwRedlineData* /*pRedlineParagraphMarkerDeleted*/, const SwRedlineData* /*pRedlineParagraphMarkerInserted*/) {} /// Empty paragraph. virtual void EmptyParagraph(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits