oox/Library_oox.mk | 1 oox/inc/oox/export/vmlexport.hxx | 21 +++++++++++- oox/source/export/vmlexport.cxx | 42 ++++++++++++++++++++++++ sw/source/filter/ww8/docxattributeoutput.cxx | 46 ++++++++++++++++++++++++++- sw/source/filter/ww8/docxattributeoutput.hxx | 6 ++- sw/source/filter/ww8/docxexport.cxx | 2 - 6 files changed, 112 insertions(+), 6 deletions(-)
New commits: commit 9c374a17fd440865ecceb1867c4142adf3d7fbd3 Author: Miklos Vajna <vmik...@suse.cz> Date: Mon Aug 13 17:37:46 2012 +0200 fdo#53113 docx export: initial shape text support Text is written, but paragraph and character properties are not yet handled. Change-Id: I828f8b6096bde000347066b23925376f6f945dbc diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 8a93e1d..da3c926 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -36,7 +36,6 @@ #include <oox/token/tokens.hxx> #include <oox/export/drawingml.hxx> #include <oox/export/utils.hxx> -#include <oox/export/vmlexport.hxx> #include <oox/mathml/export.hxx> #include <i18npool/mslangid.hxx> @@ -85,6 +84,7 @@ #include <editeng/blnkitem.hxx> #include <editeng/charhiddenitem.hxx> #include <editeng/opaqitem.hxx> +#include <editeng/editobj.hxx> #include <svx/svdmodel.hxx> #include <svx/svdobj.hxx> @@ -2368,6 +2368,50 @@ void DocxAttributeOutput::OutputFlyFrame_Impl( const sw::Frame &rFrame, const Po m_pSerializer->mergeTopMarks( sax_fastparser::MERGE_MARKS_POSTPONE ); } +void DocxAttributeOutput::WriteOutliner(const OutlinerParaObject& rParaObj) +{ + const EditTextObject& rEditObj = rParaObj.GetTextObject(); + MSWord_SdrAttrIter aAttrIter( m_rExport, rEditObj, TXT_HFTXTBOX ); + + sal_uInt16 nPara = rEditObj.GetParagraphCount(); + + m_pSerializer->startElementNS( XML_w, XML_textbox, FSEND ); + m_pSerializer->startElementNS( XML_w, XML_txbxContent, FSEND ); + for (sal_uInt16 n = 0; n < nPara; ++n) + { + if( n ) + aAttrIter.NextPara( n ); + + String aStr( rEditObj.GetText( n )); + xub_StrLen nAktPos = 0; + xub_StrLen nEnd = aStr.Len(); + + m_pSerializer->startElementNS( XML_w, XML_p, FSEND ); + do { + xub_StrLen nNextAttr = aAttrIter.WhereNext(); + if( nNextAttr > nEnd ) + nNextAttr = nEnd; + + m_pSerializer->startElementNS( XML_w, XML_r, FSEND ); + bool bTxtAtr = aAttrIter.IsTxtAttr( nAktPos ); + if( !bTxtAtr ) + { + String aOut( aStr.Copy( nAktPos, nNextAttr - nAktPos ) ); + RunText(aOut); + } + + m_pSerializer->endElementNS( XML_w, XML_r ); + + nAktPos = nNextAttr; + aAttrIter.NextPos(); + } + while( nAktPos < nEnd ); + m_pSerializer->endElementNS( XML_w, XML_p ); + } + m_pSerializer->endElementNS( XML_w, XML_txbxContent ); + m_pSerializer->endElementNS( XML_w, XML_textbox ); +} + void DocxAttributeOutput::StartStyle( const String& rName, bool bPapFmt, sal_uInt16 nBase, sal_uInt16 nNext, sal_uInt16 /*nWwId*/, sal_uInt16 nId, bool bAutoUpdate ) { diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index 1761009..f549784 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -33,6 +33,7 @@ #include <vector> #include <boost/scoped_ptr.hpp> +#include <oox/export/vmlexport.hxx> class SwGrfNode; class SdrObject; @@ -59,7 +60,7 @@ enum DocxColBreakStatus }; /// The class that has handlers for various resource types when exporting as DOCX. -class DocxAttributeOutput : public AttributeOutputBase +class DocxAttributeOutput : public AttributeOutputBase, public oox::vml::VMLTextExport { public: /// Export the state of RTL/CJK. @@ -633,6 +634,9 @@ public: bool HasPostitFields() const; void WritePostitFields(); + + /// VMLTextExport + virtual void WriteOutliner(const OutlinerParaObject& rParaObj); }; #endif // _DOCXATTRIBUTEOUTPUT_HXX_ diff --git a/sw/source/filter/ww8/docxexport.cxx b/sw/source/filter/ww8/docxexport.cxx index 79ab70e..b19b47b 100644 --- a/sw/source/filter/ww8/docxexport.cxx +++ b/sw/source/filter/ww8/docxexport.cxx @@ -813,7 +813,7 @@ DocxExport::DocxExport( DocxExportFilter *pFilter, SwDoc *pDocument, SwPaM *pCur m_pAttrOutput = new DocxAttributeOutput( *this, m_pDocumentFS, m_pDrawingML ); // the related VMLExport - m_pVMLExport = new VMLExport( m_pDocumentFS ); + m_pVMLExport = new VMLExport( m_pDocumentFS, m_pAttrOutput ); } DocxExport::~DocxExport() commit 7fd28f4de77d12acb68a6b7f5fb578fedd8b76bb Author: Miklos Vajna <vmik...@suse.cz> Date: Mon Aug 13 17:36:50 2012 +0200 fdo#53113 oox::VMLExport: allow a callback to be registered for shape text Change-Id: I1df58fa067287a37b0f62b0b05b0567da73d03b0 diff --git a/oox/Library_oox.mk b/oox/Library_oox.mk index 5fba3f2..dee336a 100644 --- a/oox/Library_oox.mk +++ b/oox/Library_oox.mk @@ -61,6 +61,7 @@ $(eval $(call gb_Library_use_libraries,oox,\ comphelper \ cppu \ cppuhelper \ + editeng \ msfilter \ sal \ sax \ diff --git a/oox/inc/oox/export/vmlexport.hxx b/oox/inc/oox/export/vmlexport.hxx index 6685f09..ec5a4d9 100644 --- a/oox/inc/oox/export/vmlexport.hxx +++ b/oox/inc/oox/export/vmlexport.hxx @@ -23,6 +23,7 @@ #include <oox/dllapi.h> #include <sax/fshelper.hxx> #include <filter/msfilter/escherex.hxx> +#include <editeng/outlobj.hxx> namespace rtl { class OString; @@ -33,11 +34,27 @@ namespace oox { namespace vml { +/// Interface to be implemented by the parent exporter that knows how to handle shape text. +class OOX_DLLPUBLIC VMLTextExport +{ +public: + virtual void WriteOutliner(const OutlinerParaObject& rParaObj) = 0; +protected: + VMLTextExport() {} + virtual ~VMLTextExport() {} +}; + class OOX_DLLPUBLIC VMLExport : public EscherEx { /// Fast serializer to output the data ::sax_fastparser::FSHelperPtr m_pSerializer; + /// Parent exporter, used for text callback. + VMLTextExport* m_pTextExport; + + /// The object we're exporting. + const SdrObject* m_pSdrObject; + /// Fill the shape attributes as they come. ::sax_fastparser::FastAttributeList *m_pShapeAttrList; @@ -54,7 +71,7 @@ class OOX_DLLPUBLIC VMLExport : public EscherEx bool *m_pShapeTypeWritten; public: - VMLExport( ::sax_fastparser::FSHelperPtr pSerializer ); + VMLExport( ::sax_fastparser::FSHelperPtr pSerializer, VMLTextExport* pTextExport = 0 ); virtual ~VMLExport(); ::sax_fastparser::FSHelperPtr @@ -63,7 +80,7 @@ public: /// Export the sdr object as VML. /// /// Call this when you need to export the object as VML. - using EscherEx::AddSdrObject; + sal_uInt32 AddSdrObject( const SdrObject& rObj ); protected: /// Add an attribute to the generated <v:shape/> element. diff --git a/oox/source/export/vmlexport.cxx b/oox/source/export/vmlexport.cxx index 17ff426..08aac17 100644 --- a/oox/source/export/vmlexport.cxx +++ b/oox/source/export/vmlexport.cxx @@ -25,6 +25,7 @@ #include <rtl/ustring.hxx> #include <tools/stream.hxx> +#include <svx/svdotext.hxx> #include <cstdio> @@ -36,9 +37,11 @@ using rtl::OUStringBuffer; using namespace sax_fastparser; using namespace oox::vml; -VMLExport::VMLExport( ::sax_fastparser::FSHelperPtr pSerializer ) +VMLExport::VMLExport( ::sax_fastparser::FSHelperPtr pSerializer, VMLTextExport* pTextExport ) : EscherEx( EscherExGlobalRef(new EscherExGlobal(0)), 0 ), m_pSerializer( pSerializer ), + m_pTextExport( pTextExport ), + m_pSdrObject( 0 ), m_pShapeAttrList( NULL ), m_nShapeType( ESCHER_ShpInst_Nil ), m_pShapeStyle( new OStringBuffer( 200 ) ), @@ -824,6 +827,37 @@ sal_Int32 VMLExport::StartShape() m_pSerializer->startElementNS( XML_v, nShapeElement, XFastAttributeListRef( m_pShapeAttrList ) ); } + // now check if we have some text and we have a text exporter registered + const SdrTextObj* pTxtObj = PTR_CAST(SdrTextObj, m_pSdrObject); + if (pTxtObj && m_pTextExport) + { + const OutlinerParaObject* pParaObj = 0; + bool bOwnParaObj = false; + + /* + #i13885# + When the object is actively being edited, that text is not set into + the objects normal text object, but lives in a seperate object. + */ + if (pTxtObj->IsTextEditActive()) + { + pParaObj = pTxtObj->GetEditOutlinerParaObject(); + bOwnParaObj = true; + } + else + { + pParaObj = pTxtObj->GetOutlinerParaObject(); + } + + if( pParaObj ) + { + // this is reached only in case some text is attached to the shape + m_pTextExport->WriteOutliner(*pParaObj); + if( bOwnParaObj ) + delete pParaObj; + } + } + return nShapeElement; } @@ -836,4 +870,10 @@ void VMLExport::EndShape( sal_Int32 nShapeElement ) } } +sal_uInt32 VMLExport::AddSdrObject( const SdrObject& rObj ) +{ + m_pSdrObject = &rObj; + return EscherEx::AddSdrObject(rObj); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits