summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRohit Deshmukh <rohit.deshmukh@synerzip.com>2014-07-01 21:24:24 +0530
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-07-03 13:36:26 +0000
commit83d51e5e52688c4c9bc0ad70a511458bb06a242d (patch)
tree3b0cea15ccebb5471c1dfbd784b3cb90a3156716
parent5ccb510ef7dd6688b86038b37563583f64107936 (diff)
fdo#80748: Fix for file corruption due to framePr
-For framePr Unit test is there in ooxmlexport.cxx -http://opengrok.libreoffice.org/xref/core/sw/qa/extras/ooxmlexport/ooxmlexport.cxx#3578 Change-Id: Ic1fd4c7a863d8ab57c6495e20bff6863eb941688 Reviewed-on: https://gerrit.libreoffice.org/10045 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
-rw-r--r--include/sax/fshelper.hxx2
-rw-r--r--sax/source/tools/fastserializer.cxx4
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx81
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.hxx2
4 files changed, 57 insertions, 32 deletions
diff --git a/include/sax/fshelper.hxx b/include/sax/fshelper.hxx
index e3d3f052e39a..8a9f1ccf3d12 100644
--- a/include/sax/fshelper.hxx
+++ b/include/sax/fshelper.hxx
@@ -62,7 +62,7 @@ const sal_Int32 FSEND_internal = -1; // same as XML_TOKEN_INVALID
namespace sax_fastparser {
-enum MergeMarksEnum { MERGE_MARKS_APPEND = 0, MERGE_MARKS_PREPEND = 1, MERGE_MARKS_POSTPONE = 2 };
+enum MergeMarksEnum { MERGE_MARKS_APPEND = 0, MERGE_MARKS_PREPEND = 1, MERGE_MARKS_POSTPONE = 2, MERGE_MARKS_IGNORE = 3 };
typedef ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList > XFastAttributeListRef;
diff --git a/sax/source/tools/fastserializer.cxx b/sax/source/tools/fastserializer.cxx
index 1eea16e99bf7..fbce18aa9ab0 100644
--- a/sax/source/tools/fastserializer.cxx
+++ b/sax/source/tools/fastserializer.cxx
@@ -291,7 +291,7 @@ namespace sax_fastparser {
if ( maMarkStack.empty() )
return;
- if ( maMarkStack.size() == 1 )
+ if ( maMarkStack.size() == 1 && eMergeType != MERGE_MARKS_IGNORE)
{
mxOutputStream->writeBytes( maMarkStack.top()->getData() );
maMarkStack.pop();
@@ -306,6 +306,8 @@ namespace sax_fastparser {
case MERGE_MARKS_APPEND: maMarkStack.top()->append( aMerge ); break;
case MERGE_MARKS_PREPEND: maMarkStack.top()->prepend( aMerge ); break;
case MERGE_MARKS_POSTPONE: maMarkStack.top()->postpone( aMerge ); break;
+ case MERGE_MARKS_IGNORE : break;
+
}
}
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 1ff9d848fc36..ebe556d8fd7e 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -329,11 +329,9 @@ void DocxAttributeOutput::PopulateFrameProperties(const SwFrmFmt* pFrmFmt, const
relativeFromV = "page";
break;
case text::RelOrientation::FRAME:
- relativeFromV = "paragraph";
- break;
case text::RelOrientation::TEXT_LINE:
default:
- relativeFromV = "line";
+ relativeFromV = "text";
break;
}
@@ -346,19 +344,31 @@ void DocxAttributeOutput::PopulateFrameProperties(const SwFrmFmt* pFrmFmt, const
relativeFromH = "page";
break;
case text::RelOrientation::CHAR:
- relativeFromH = "character";
- break;
case text::RelOrientation::PAGE_RIGHT:
- relativeFromH = "page";
- break;
case text::RelOrientation::FRAME:
default:
- relativeFromH = "column";
+ relativeFromH = "text";
break;
}
+
+ switch (pFrmFmt->GetSurround().GetValue())
+ {
+ case SURROUND_NONE:
+ attrList->add( FSNS( XML_w, XML_wrap), "none");
+ break;
+ case SURROUND_THROUGHT:
+ attrList->add( FSNS( XML_w, XML_wrap), "through");
+ break;
+ case SURROUND_PARALLEL:
+ attrList->add( FSNS( XML_w, XML_wrap), "notBeside");
+ break;
+ case SURROUND_IDEAL:
+ default:
+ attrList->add( FSNS( XML_w, XML_wrap), "auto");
+ break;
+ }
attrList->add( FSNS( XML_w, XML_vAnchor), relativeFromV);
attrList->add( FSNS( XML_w, XML_hAnchor), relativeFromH);
- attrList->add( FSNS( XML_w, XML_wrap), "notBeside");
attrList->add( FSNS( XML_w, XML_hRule), "exact");
sax_fastparser::XFastAttributeListRef xAttrList(attrList);
@@ -399,7 +409,7 @@ void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pT
{
// write the paragraph properties + the run, already in the correct order
m_pSerializer->mergeTopMarks();
-
+ std::vector< boost::shared_ptr <sw::Frame> > aFramePrTextbox;
// Write the anchored frame if any
// Word can't handle nested text boxes, so write them on the same level.
++m_nTextFrameLevel;
@@ -411,12 +421,11 @@ void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pT
{
m_bParagraphFrameOpen = true;
sw::Frame aFrame = m_aFramesOfParagraph[nIndex];
- m_pSerializer->startElementNS( XML_w, XML_r, FSEND );
-
const SwFrmFmt& rFrmFmt = aFrame.GetFrmFmt();
if (!TextBoxIsFramePr(rFrmFmt) || m_bWritingHeaderFooter)
{
+ m_pSerializer->startElementNS( XML_w, XML_r, FSEND );
m_pSerializer->startElementNS(XML_mc, XML_AlternateContent, FSEND);
m_pSerializer->startElementNS(XML_mc, XML_Choice,
XML_Requires, "wps",
@@ -465,17 +474,15 @@ void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pT
m_pSerializer->endElementNS(XML_mc, XML_Fallback);
m_pSerializer->endElementNS(XML_mc, XML_AlternateContent);
+ m_pSerializer->endElementNS( XML_w, XML_r );
+ m_bParagraphFrameOpen = false;
}
else
{
- ww8::WW8TableInfo::Pointer_t pOldTableInfo = m_rExport.mpTableInfo;
- //Reset the table infos after saving.
- m_rExport.mpTableInfo = ww8::WW8TableInfo::Pointer_t(new ww8::WW8TableInfo());
- m_rExport.SdrExporter().writeOnlyTextOfFrame(&aFrame);
- m_rExport.mpTableInfo = pOldTableInfo;
+ ::boost::shared_ptr<sw::Frame> pFramePr;
+ pFramePr.reset(new sw::Frame(aFrame));
+ aFramePrTextbox.push_back(pFramePr);
}
- m_pSerializer->endElementNS( XML_w, XML_r );
- m_bParagraphFrameOpen = false;
}
if (!m_postponedCustomShape->empty())
{
@@ -515,8 +522,25 @@ void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pT
//sdtcontent is written so Set m_bParagraphHasDrawing to false
m_rExport.SdrExporter().setParagraphHasDrawing( false );
m_bRunTextIsOn = false;
- m_pSerializer->mergeTopMarks();
+ if(aFramePrTextbox.empty())
+ m_pSerializer->mergeTopMarks();
+ else
+ m_pSerializer->mergeTopMarks(sax_fastparser::MERGE_MARKS_IGNORE );
+ // Write framePr
+ if(!aFramePrTextbox.empty())
+ {
+ ww8::WW8TableInfo::Pointer_t pOldTableInfo = m_rExport.mpTableInfo;
+ for (std::vector< boost::shared_ptr<sw::Frame> > ::iterator it = aFramePrTextbox.begin() ; it != aFramePrTextbox.end(); ++it)
+ {
+ m_rExport.mpTableInfo = ww8::WW8TableInfo::Pointer_t(new ww8::WW8TableInfo());
+ m_pCurrentFrame = it->get();
+ m_rExport.SdrExporter().writeOnlyTextOfFrame(it->get());
+ m_pCurrentFrame = NULL;
+ }
+ m_rExport.mpTableInfo = pOldTableInfo;
+ aFramePrTextbox.clear();
+ }
// Check for end of cell, rows, tables here
FinishTableRowCell( pTextNodeInfoInner );
@@ -818,20 +842,16 @@ void DocxAttributeOutput::EndParagraphProperties( const SfxItemSet* pParagraphMa
m_pSerializer->endElementNS( XML_w, XML_rPr );
}
- if (!m_bWritingHeaderFooter)
+ if (!m_bWritingHeaderFooter && m_pCurrentFrame)
{
- //Check whether we have Frame for paragraph
- for (size_t nIndex = 0; nIndex < m_aFramesOfParagraph.size(); ++nIndex)
+ const SwFrmFmt& rFrmFmt = m_pCurrentFrame->GetFrmFmt();
+ if (TextBoxIsFramePr(rFrmFmt))
{
- sw::Frame aFrame = m_aFramesOfParagraph[nIndex];
- const SwFrmFmt& rFrmFmt = aFrame.GetFrmFmt();
- if (TextBoxIsFramePr(rFrmFmt))
- {
- const Size aSize = aFrame.GetSize();
- PopulateFrameProperties(&rFrmFmt, aSize);
- }
+ const Size aSize = m_pCurrentFrame->GetSize();
+ PopulateFrameProperties(&rFrmFmt, aSize);
}
}
+
m_pSerializer->endElementNS( XML_w, XML_pPr );
if ( m_nColBreakStatus == COLBRK_WRITE )
@@ -7756,6 +7776,7 @@ DocxAttributeOutput::DocxAttributeOutput( DocxExport &rExport, FSHelperPtr pSeri
m_nNextBookmarkId( 0 ),
m_nNextAnnotationMarkId( 0 ),
m_pTableWrt( NULL ),
+ m_pCurrentFrame( NULL ),
m_bParagraphOpened( false ),
m_bParagraphFrameOpen( false ),
m_bIsFirstParagraph( true ),
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 5f979ad0c26e..17bc31cfee05 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -770,6 +770,8 @@ private:
/// The current table helper
SwWriteTable *m_pTableWrt;
+ sw::Frame* m_pCurrentFrame;
+
bool m_bParagraphOpened;
bool m_bParagraphFrameOpen;
bool m_bIsFirstParagraph;