[Libreoffice-commits] core.git: sw/source
Miklos Vajna
vmiklos at collabora.co.uk
Wed Dec 11 07:00:37 PST 2013
sw/source/filter/ww8/docxattributeoutput.cxx | 138 +++++++++++++++++++++++++--
sw/source/filter/ww8/docxattributeoutput.hxx | 3
2 files changed, 131 insertions(+), 10 deletions(-)
New commits:
commit 863d91c20b4af0a281748d83f3bf359234bc7195
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Wed Dec 11 15:54:52 2013 +0100
Add DocxAttributeOutput::WriteDMLTextFrame that can export a textframe in DML
Change-Id: I9600d4fffc4cde7046b43729f95d5a96aa1cdf38
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 1da02b0..90198f7 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -140,6 +140,9 @@ using namespace sw::util;
using namespace ::com::sun::star;
using namespace ::com::sun::star::drawing;
+// TODO the whole Sdr code should be factored out to a separate class.
+void lcl_startDMLAnchorInline(sax_fastparser::FSHelperPtr pSerializer, const SwFrmFmt* pFrmFmt, const Size& rSize);
+void lcl_endDMLAnchorInline(sax_fastparser::FSHelperPtr pSerializer, const SwFrmFmt* pFrmFmt);
class FFDataWriterHelper
{
@@ -397,7 +400,6 @@ void DocxAttributeOutput::WriteVMLTextFrame(sw::Frame* pParentFrame)
m_pFlyFrameSize = 0;
m_rExport.mpParentFrame = NULL;
- m_pSerializer->startElementNS( XML_w, XML_r, FSEND );
m_pSerializer->startElementNS( XML_w, XML_pict, FSEND );
m_pSerializer->startElementNS( XML_v, XML_rect, xFlyAttrList );
lcl_TextFrameShadow(m_pSerializer, rFrmFmt);
@@ -422,10 +424,79 @@ void DocxAttributeOutput::WriteVMLTextFrame(sw::Frame* pParentFrame)
m_pSerializer->endElementNS( XML_v, XML_rect );
m_pSerializer->endElementNS( XML_w, XML_pict );
- m_pSerializer->endElementNS( XML_w, XML_r );
m_bFrameBtLr = false;
}
+void DocxAttributeOutput::WriteDMLTextFrame(sw::Frame* pParentFrame)
+{
+ const SwFrmFmt& rFrmFmt = pParentFrame->GetFrmFmt( );
+ const SwNodeIndex* pNodeIndex = rFrmFmt.GetCntnt().GetCntntIdx();
+
+ sal_uLong nStt = pNodeIndex ? pNodeIndex->GetIndex()+1 : 0;
+ sal_uLong nEnd = pNodeIndex ? pNodeIndex->GetNode().EndOfSectionIndex() : 0;
+
+ //Save data here and restore when out of scope
+ ExportDataSaveRestore aDataGuard(m_rExport, nStt, nEnd, pParentFrame);
+
+ // When a frame has some low height, but automatically expanded due
+ // to lots of contents, this size contains the real size.
+ const Size aSize = pParentFrame->GetSize();
+
+ lcl_startDMLAnchorInline(m_pSerializer, &rFrmFmt, aSize);
+
+ sax_fastparser::FastAttributeList* pDocPrAttrList = m_pSerializer->createAttrList();
+ pDocPrAttrList->add(XML_id, OString::number(m_anchorId++).getStr());
+ pDocPrAttrList->add(XML_name, OUStringToOString(rFrmFmt.GetName(), RTL_TEXTENCODING_UTF8).getStr());
+ XFastAttributeListRef xDocPrAttrListRef(pDocPrAttrList);
+ m_pSerializer->singleElementNS(XML_wp, XML_docPr, xDocPrAttrListRef);
+
+ m_pSerializer->startElementNS(XML_a, XML_graphic,
+ FSNS(XML_xmlns, XML_a), "http://schemas.openxmlformats.org/drawingml/2006/main",
+ FSEND);
+ m_pSerializer->startElementNS(XML_a, XML_graphicData,
+ XML_uri, "http://schemas.microsoft.com/office/word/2010/wordprocessingShape",
+ FSEND);
+ m_pSerializer->startElementNS(XML_wps, XML_wsp, FSEND);
+ m_pSerializer->singleElementNS(XML_wps, XML_cNvSpPr,
+ XML_txBox, "1",
+ FSEND);
+
+ // Shape properties
+ m_pSerializer->startElementNS(XML_wps, XML_spPr, FSEND);
+ m_pSerializer->startElementNS(XML_a, XML_xfrm, FSEND);
+ m_pSerializer->singleElementNS(XML_a, XML_off,
+ XML_x, "0",
+ XML_y, "0",
+ FSEND);
+ OString aWidth(OString::number(TwipsToEMU(aSize.Width())));
+ OString aHeight(OString::number(TwipsToEMU(aSize.Height())));
+ m_pSerializer->singleElementNS(XML_a, XML_ext,
+ XML_cx, aWidth.getStr(),
+ XML_cy, aHeight.getStr(),
+ FSEND);
+ m_pSerializer->endElementNS(XML_a, XML_xfrm);
+ m_pSerializer->singleElementNS(XML_a, XML_prstGeom,
+ XML_prst, "rect",
+ FSEND);
+ m_bDMLTextFrameSyntax = true;
+ m_rExport.OutputFormat( pParentFrame->GetFrmFmt(), false, false, true );
+ m_bDMLTextFrameSyntax = false;
+ m_pSerializer->endElementNS(XML_wps, XML_spPr);
+
+ m_rExport.mpParentFrame = NULL;
+ m_pSerializer->startElementNS( XML_wps, XML_txbx, FSEND );
+ m_pSerializer->startElementNS( XML_w, XML_txbxContent, FSEND );
+ m_rExport.WriteText( );
+ m_pSerializer->endElementNS( XML_w, XML_txbxContent );
+ m_pSerializer->endElementNS( XML_wps, XML_txbx );
+ m_pSerializer->singleElementNS( XML_wps, XML_bodyPr, FSEND );
+
+ m_pSerializer->endElementNS(XML_wps, XML_wsp);
+ m_pSerializer->endElementNS(XML_a, XML_graphicData);
+ m_pSerializer->endElementNS(XML_a, XML_graphic);
+ lcl_endDMLAnchorInline(m_pSerializer, &rFrmFmt);
+}
+
void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pTextNodeInfoInner )
{
// write the paragraph properties + the run, already in the correct order
@@ -439,7 +510,9 @@ void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pT
for (size_t i = 0; i < aParentFrames.size(); ++i)
{
sw::Frame* pParentFrame = &aParentFrames[i];
+ m_pSerializer->startElementNS( XML_w, XML_r, FSEND );
WriteVMLTextFrame(pParentFrame);
+ m_pSerializer->endElementNS( XML_w, XML_r );
}
m_pSerializer->endElementNS( XML_w, XML_p );
@@ -5601,6 +5674,9 @@ void DocxAttributeOutput::FormatFrameSize( const SwFmtFrmSize& rSize )
m_aTextFrameStyle.append(";width:").append(double(m_pFlyFrameSize->Width()) / 20);
m_aTextFrameStyle.append("pt;height:").append(double(m_pFlyFrameSize->Height()) / 20).append("pt");
}
+ else if (m_bDMLTextFrameSyntax)
+ {
+ }
else if ( m_rExport.bOutFlyFrmAttrs )
{
if ( !m_pFlyAttrList )
@@ -5650,6 +5726,9 @@ void DocxAttributeOutput::FormatLRSpace( const SvxLRSpaceItem& rLRSpace )
m_aTextFrameStyle.append(";mso-wrap-distance-left:").append(double(rLRSpace.GetLeft()) / 20).append("pt");
m_aTextFrameStyle.append(";mso-wrap-distance-right:").append(double(rLRSpace.GetRight()) / 20).append("pt");
}
+ else if (m_bDMLTextFrameSyntax)
+ {
+ }
else if ( m_rExport.bOutFlyFrmAttrs )
{
if ( !m_pFlyAttrList )
@@ -5706,6 +5785,9 @@ void DocxAttributeOutput::FormatULSpace( const SvxULSpaceItem& rULSpace )
m_aTextFrameStyle.append(";mso-wrap-distance-top:").append(double(rULSpace.GetUpper()) / 20).append("pt");
m_aTextFrameStyle.append(";mso-wrap-distance-bottom:").append(double(rULSpace.GetLower()) / 20).append("pt");
}
+ else if (m_bDMLTextFrameSyntax)
+ {
+ }
else if ( m_rExport.bOutFlyFrmAttrs )
{
if ( !m_pFlyAttrList )
@@ -5826,6 +5908,9 @@ void DocxAttributeOutput::FormatSurround( const SwFmtSurround& rSurround )
m_pFlyWrapAttrList->add(XML_side, sSide);
}
}
+ else if (m_bDMLTextFrameSyntax)
+ {
+ }
else if ( m_rExport.bOutFlyFrmAttrs )
{
if ( !m_pFlyAttrList )
@@ -5858,6 +5943,9 @@ void DocxAttributeOutput::FormatVertOrientation( const SwFmtVertOrient& rFlyVert
{
m_aTextFrameStyle.append(";margin-top:").append(double(rFlyVert.GetPos()) / 20).append("pt");
}
+ else if (m_bDMLTextFrameSyntax)
+ {
+ }
else if ( m_rExport.bOutFlyFrmAttrs )
{
if ( !m_pFlyAttrList )
@@ -5920,6 +6008,9 @@ void DocxAttributeOutput::FormatHorizOrientation( const SwFmtHoriOrient& rFlyHor
{
m_aTextFrameStyle.append(";margin-left:").append(double(rFlyHori.GetPos()) / 20).append("pt");
}
+ else if (m_bDMLTextFrameSyntax)
+ {
+ }
else if ( m_rExport.bOutFlyFrmAttrs )
{
if ( !m_pFlyAttrList )
@@ -6007,6 +6098,9 @@ void DocxAttributeOutput::FormatBackground( const SvxBrushItem& rBrush )
m_pFlyAttrList->add(XML_fillcolor, "#" + sColor);
}
+ else if (m_bDMLTextFrameSyntax)
+ {
+ }
else if ( !m_rExport.bOutPageDescs )
{
m_pSerializer->singleElementNS( XML_w, XML_shd,
@@ -6072,7 +6166,7 @@ void DocxAttributeOutput::FormatFillGradient( const XFillGradientItem& rFillGrad
void DocxAttributeOutput::FormatBox( const SvxBoxItem& rBox )
{
- if (m_bTextFrameSyntax)
+ if (m_bTextFrameSyntax || m_bDMLTextFrameSyntax)
{
const SvxBorderLine* pLeft = rBox.GetLeft( );
const SvxBorderLine* pTop = rBox.GetTop( );
@@ -6086,20 +6180,43 @@ void DocxAttributeOutput::FormatBox( const SvxBoxItem& rBox )
editeng::SvxBorderStyle eBorderStyle = pTop->GetBorderLineStyle();
if (eBorderStyle == table::BorderLineStyle::NONE)
{
- m_pFlyAttrList->add(XML_stroked, "f");
- m_pFlyAttrList->add(XML_strokeweight, "0pt");
+ if (m_bTextFrameSyntax)
+ {
+ m_pFlyAttrList->add(XML_stroked, "f");
+ m_pFlyAttrList->add(XML_strokeweight, "0pt");
+ }
}
else
{
- OString sColor("#" + msfilter::util::ConvertColor(pTop->GetColor()));
- m_pFlyAttrList->add(XML_strokecolor, sColor);
-
+ OString sColor(msfilter::util::ConvertColor(pTop->GetColor()));
double const fConverted(editeng::ConvertBorderWidthToWord(pTop->GetBorderLineStyle(), pTop->GetWidth()));
- sal_Int32 nWidth = sal_Int32(fConverted / 20);
- m_pFlyAttrList->add(XML_strokeweight, OString::number(nWidth) + "pt");
+
+ if (m_bTextFrameSyntax)
+ {
+ sColor = "#" + sColor;
+ m_pFlyAttrList->add(XML_strokecolor, sColor);
+ sal_Int32 nWidth = sal_Int32(fConverted / 20);
+ m_pFlyAttrList->add(XML_strokeweight, OString::number(nWidth) + "pt");
+ }
+ else
+ {
+ OString aWidth(OString::number(TwipsToEMU(fConverted)));
+ m_pSerializer->startElementNS(XML_a, XML_ln,
+ XML_w, aWidth.getStr(),
+ FSEND);
+ m_pSerializer->startElementNS(XML_a, XML_solidFill, FSEND);
+ m_pSerializer->singleElementNS(XML_a, XML_srgbClr,
+ XML_val, sColor,
+ FSEND);
+ m_pSerializer->endElementNS(XML_a, XML_solidFill);
+ m_pSerializer->endElementNS(XML_a, XML_ln);
+ }
}
}
+ if (m_bDMLTextFrameSyntax)
+ return;
+
// v:textbox's inset attribute: inner margin values for textbox text - write only non-default values
double fDistanceLeftTwips = double(rBox.GetDistance(BOX_LINE_LEFT));
double fDistanceTopTwips = double(rBox.GetDistance(BOX_LINE_TOP));
@@ -6442,6 +6559,7 @@ DocxAttributeOutput::DocxAttributeOutput( DocxExport &rExport, FSHelperPtr pSeri
m_bParagraphOpened( false ),
m_nColBreakStatus( COLBRK_NONE ),
m_bTextFrameSyntax( false ),
+ m_bDMLTextFrameSyntax( false ),
m_closeHyperlinkInThisRun( false ),
m_closeHyperlinkInPreviousRun( false ),
m_startedHyperlink( false ),
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index f3bb789..29b1718 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -381,6 +381,8 @@ private:
/// Writes text frame in VML format.
void WriteVMLTextFrame(sw::Frame* pParentFrame);
+ /// Writes text frame in DML format.
+ void WriteDMLTextFrame(sw::Frame* pParentFrame);
void InitTableHelper( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner );
void StartTable( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner );
@@ -732,6 +734,7 @@ private:
std::vector<sw::Frame> m_aParentFrames;
bool m_bTextFrameSyntax;
+ bool m_bDMLTextFrameSyntax;
OStringBuffer m_aTextFrameStyle;
// close of hyperlink needed
bool m_closeHyperlinkInThisRun;
More information about the Libreoffice-commits
mailing list