writerfilter/source/rtftok/rtfdocumentimpl.cxx | 93 +++++++++++++++++++++++++ writerfilter/source/rtftok/rtfdocumentimpl.hxx | 12 ++- writerfilter/source/rtftok/rtfvalue.cxx | 25 ++++++ writerfilter/source/rtftok/rtfvalue.hxx | 5 + 4 files changed, 131 insertions(+), 4 deletions(-)
New commits: commit 4ad9e3f5be10bde030338f744d56ffa6c7736bd0 Author: Miklos Vajna <vmik...@suse.cz> Date: Mon Jul 23 14:45:45 2012 +0200 implement import of RTF_{MOMATH,MR,MF,MFPR,MCTRLPR,MNUM,MDEN} Change-Id: I4d0d9df26de1ef52a808c82d89a8404c98ef7bc4 diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 37da9c0..187ae91 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -48,11 +48,17 @@ #include <filter/msfilter/util.hxx> #include <filter/msfilter/escherex.hxx> #include <comphelper/string.hxx> +#include <tools/globname.hxx> +#include <comphelper/classids.hxx> +#include <comphelper/embeddedobjectcontainer.hxx> +#include <oox/mathml/import.hxx> #include <doctok/sprmids.hxx> // NS_sprm namespace #include <doctok/resourceids.hxx> // NS_rtf namespace #include <ooxml/resourceids.hxx> // NS_ooxml namespace #include <ooxml/OOXMLFastTokens.hxx> // ooxml namespace +#include <oox/token/namespaces.hxx> // oox namespace +#include <oox/token/tokens.hxx> #include <rtfsdrimport.hxx> #include <rtftokenizer.hxx> @@ -943,6 +949,7 @@ void RTFDocumentImpl::text(OUString& rString) case DESTINATION_SUBJECT: case DESTINATION_DOCCOMM: case DESTINATION_ATNID: + case DESTINATION_MR: m_aStates.top().aDestinationText.append(rString); break; case DESTINATION_EQINSTRUCTION: @@ -1390,6 +1397,54 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) case RTF_ATNID: m_aStates.top().nDestinationState = DESTINATION_ATNID; break; + case RTF_MMATH: + // Nothing to do here (just enter the destination) till RTF_MMATHPR is implemented. + break; + case RTF_MOMATH: + { + uno::Reference<xml::sax::XFastAttributeList> aAttribs; + m_aMathBuffer.appendOpeningTag(oox::NMSP_officeMath | oox::XML_oMath, aAttribs); + m_aStates.top().nDestinationState = DESTINATION_MOMATH; + } + break; + case RTF_MR: + m_aStates.top().nDestinationState = DESTINATION_MR; + break; + case RTF_MF: + { + uno::Reference<xml::sax::XFastAttributeList> aAttribs; + m_aMathBuffer.appendOpeningTag(oox::NMSP_officeMath | oox::XML_f, aAttribs); + m_aStates.top().nDestinationState = DESTINATION_MF; + } + break; + case RTF_MFPR: + { + uno::Reference<xml::sax::XFastAttributeList> aAttribs; + m_aMathBuffer.appendOpeningTag(oox::NMSP_officeMath | oox::XML_fPr, aAttribs); + m_aStates.top().nDestinationState = DESTINATION_MFPR; + } + break; + case RTF_MCTRLPR: + { + uno::Reference<xml::sax::XFastAttributeList> aAttribs; + m_aMathBuffer.appendOpeningTag(oox::NMSP_officeMath | oox::XML_ctrlPr, aAttribs); + m_aStates.top().nDestinationState = DESTINATION_MCTRLPR; + } + break; + case RTF_MNUM: + { + uno::Reference<xml::sax::XFastAttributeList> aAttribs; + m_aMathBuffer.appendOpeningTag(oox::NMSP_officeMath | oox::XML_num, aAttribs); + m_aStates.top().nDestinationState = DESTINATION_MNUM; + } + break; + case RTF_MDEN: + { + uno::Reference<xml::sax::XFastAttributeList> aAttribs; + m_aMathBuffer.appendOpeningTag(oox::NMSP_officeMath | oox::XML_den, aAttribs); + m_aStates.top().nDestinationState = DESTINATION_MDEN; + } + break; default: SAL_INFO("writerfilter", OSL_THIS_FUNC << ": TODO handle destination '" << lcl_RtfToString(nKeyword) << "'"); // Make sure we skip destinations (even without \*) till we don't handle them @@ -3443,6 +3498,44 @@ int RTFDocumentImpl::popState() parBreak(); m_bNeedPap = true; } + else if (m_aStates.top().nDestinationState == DESTINATION_MOMATH) + { + uno::Reference<xml::sax::XFastAttributeList> aAttribs; + m_aMathBuffer.appendClosingTag(oox::NMSP_officeMath | oox::XML_oMath); + + SvGlobalName aGlobalName(SO3_SM_CLASSID); + comphelper::EmbeddedObjectContainer aContainer; + OUString aName; + uno::Reference<embed::XEmbeddedObject> xObject = aContainer.CreateEmbeddedObject(aGlobalName.GetByteSequence(), aName); + uno::Reference<util::XCloseable> xComponent(xObject->getComponent(), uno::UNO_QUERY); + if( oox::FormulaImportBase* pImport = dynamic_cast<oox::FormulaImportBase*>(xComponent.get())) + pImport->readFormulaOoxml(m_aMathBuffer); + RTFValue::Pointer_t pValue(new RTFValue(xObject)); + RTFSprms aMathAttributes; + aMathAttributes.set(NS_ooxml::LN_starmath, pValue); + writerfilter::Reference<Properties>::Pointer_t const pProperties(new RTFReferenceProperties(aMathAttributes)); + Mapper().props(pProperties); + m_aMathBuffer = oox::formulaimport::XmlStreamBuilder(); + } + else if (m_aStates.top().nDestinationState == DESTINATION_MR) + { + uno::Reference<xml::sax::XFastAttributeList> aAttribs; + m_aMathBuffer.appendOpeningTag(oox::NMSP_officeMath | oox::XML_r, aAttribs); + m_aMathBuffer.appendOpeningTag(oox::NMSP_officeMath | oox::XML_t, aAttribs); + m_aMathBuffer.appendCharacters(m_aStates.top().aDestinationText.makeStringAndClear()); + m_aMathBuffer.appendClosingTag(oox::NMSP_officeMath | oox::XML_t); + m_aMathBuffer.appendClosingTag(oox::NMSP_officeMath | oox::XML_r); + } + else if (m_aStates.top().nDestinationState == DESTINATION_MF) + m_aMathBuffer.appendClosingTag(oox::NMSP_officeMath | oox::XML_f); + else if (m_aStates.top().nDestinationState == DESTINATION_MFPR) + m_aMathBuffer.appendClosingTag(oox::NMSP_officeMath | oox::XML_fPr); + else if (m_aStates.top().nDestinationState == DESTINATION_MCTRLPR) + m_aMathBuffer.appendClosingTag(oox::NMSP_officeMath | oox::XML_ctrlPr); + else if (m_aStates.top().nDestinationState == DESTINATION_MNUM) + m_aMathBuffer.appendClosingTag(oox::NMSP_officeMath | oox::XML_num); + else if (m_aStates.top().nDestinationState == DESTINATION_MDEN) + m_aMathBuffer.appendClosingTag(oox::NMSP_officeMath | oox::XML_den); // See if we need to end a track change RTFValue::Pointer_t pTrackchange = m_aStates.top().aCharacterSprms.find(NS_ooxml::LN_trackchange); diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 14ded59..3483e0d 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -35,6 +35,7 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/document/XDocumentProperties.hpp> #include <oox/helper/graphichelper.hxx> +#include <oox/mathml/importutils.hxx> #include <rtl/strbuf.hxx> #include <rtftok/RTFDocument.hxx> @@ -118,7 +119,14 @@ namespace writerfilter { DESTINATION_TITLE, DESTINATION_SUBJECT, DESTINATION_DOCCOMM, - DESTINATION_ATNID + DESTINATION_ATNID, + DESTINATION_MOMATH, + DESTINATION_MR, + DESTINATION_MF, + DESTINATION_MFPR, + DESTINATION_MCTRLPR, + DESTINATION_MNUM, + DESTINATION_MDEN }; enum RTFBorderState @@ -512,6 +520,8 @@ namespace writerfilter { rtl::OUStringBuffer m_aUnicodeBuffer; /// Same for hex characters. rtl::OStringBuffer m_aHexBuffer; + /// Formula import. + oox::formulaimport::XmlStreamBuilder m_aMathBuffer; }; } // namespace rtftok } // namespace writerfilter commit e7e2b7daadeb901bee3d644dd0faf701d3ca34a2 Author: Miklos Vajna <vmik...@suse.cz> Date: Mon Jul 23 13:38:52 2012 +0200 RTFValue: extend to be able to store embed::XEmbeddedObject Change-Id: I6218be1f4afe22665ab85f7d731e1c1567bb2c8e diff --git a/writerfilter/source/rtftok/rtfvalue.cxx b/writerfilter/source/rtftok/rtfvalue.cxx index 13613fa..4882522 100644 --- a/writerfilter/source/rtftok/rtfvalue.cxx +++ b/writerfilter/source/rtftok/rtfvalue.cxx @@ -35,11 +35,12 @@ using rtl::OUString; RTFValue::RTFValue(int nValue, rtl::OUString sValue, RTFSprms rAttributes, RTFSprms rSprms, uno::Reference<drawing::XShape> xShape, - uno::Reference<io::XInputStream> xStream, bool bForceString) + uno::Reference<io::XInputStream> xStream, uno::Reference<embed::XEmbeddedObject> xObject, bool bForceString) : m_nValue(nValue), m_sValue(sValue), m_xShape(xShape), m_xStream(xStream), + m_xObject(xObject), m_bForceString(bForceString) { m_pAttributes.reset(new RTFSprms(rAttributes)); @@ -51,6 +52,7 @@ RTFValue::RTFValue(int nValue) m_sValue(), m_xShape(), m_xStream(), + m_xObject(), m_bForceString(false) { m_pAttributes.reset(new RTFSprms()); @@ -62,6 +64,7 @@ RTFValue::RTFValue(OUString sValue, bool bForce) m_sValue(sValue), m_xShape(), m_xStream(), + m_xObject(), m_bForceString(bForce) { m_pAttributes.reset(new RTFSprms()); @@ -73,6 +76,7 @@ RTFValue::RTFValue(RTFSprms rAttributes) m_sValue(), m_xShape(), m_xStream(), + m_xObject(), m_bForceString(false) { m_pAttributes.reset(new RTFSprms(rAttributes)); @@ -84,6 +88,7 @@ RTFValue::RTFValue(RTFSprms rAttributes, RTFSprms rSprms) m_sValue(), m_xShape(), m_xStream(), + m_xObject(), m_bForceString(false) { m_pAttributes.reset(new RTFSprms(rAttributes)); @@ -95,6 +100,7 @@ RTFValue::RTFValue(uno::Reference<drawing::XShape> rShape) m_sValue(), m_xShape(rShape), m_xStream(), + m_xObject(), m_bForceString(false) { m_pAttributes.reset(new RTFSprms()); @@ -106,6 +112,19 @@ RTFValue::RTFValue(uno::Reference<io::XInputStream> rStream) m_sValue(), m_xShape(), m_xStream(rStream), + m_xObject(), + m_bForceString(false) +{ + m_pAttributes.reset(new RTFSprms()); + m_pSprms.reset(new RTFSprms()); +} + +RTFValue::RTFValue(uno::Reference<embed::XEmbeddedObject> xObject) + : m_nValue(), + m_sValue(), + m_xShape(), + m_xStream(), + m_xObject(xObject), m_bForceString(false) { m_pAttributes.reset(new RTFSprms()); @@ -143,6 +162,8 @@ uno::Any RTFValue::getAny() const ret <<= m_xShape; else if (m_xStream.is()) ret <<= m_xStream; + else if (m_xObject.is()) + ret <<= m_xObject; else ret <<= static_cast<sal_Int32>(m_nValue); return ret; @@ -176,7 +197,7 @@ std::string RTFValue::toString() const RTFValue* RTFValue::Clone() { - return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_bForceString); + return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_xObject, m_bForceString); } RTFSprms& RTFValue::getAttributes() diff --git a/writerfilter/source/rtftok/rtfvalue.hxx b/writerfilter/source/rtftok/rtfvalue.hxx index 8a14ef5..6751126 100644 --- a/writerfilter/source/rtftok/rtfvalue.hxx +++ b/writerfilter/source/rtftok/rtfvalue.hxx @@ -30,6 +30,7 @@ #include <resourcemodel/WW8ResourceModel.hxx> #include <com/sun/star/io/XInputStream.hpp> +#include <com/sun/star/embed/XEmbeddedObject.hpp> namespace writerfilter { namespace rtftok { @@ -41,13 +42,14 @@ namespace writerfilter { public: typedef boost::shared_ptr<RTFValue> Pointer_t; RTFValue(int nValue, rtl::OUString sValue, RTFSprms rAttributes, RTFSprms rSprms, uno::Reference<drawing::XShape> rShape, - uno::Reference<io::XInputStream> rStream, bool bForceString); + uno::Reference<io::XInputStream> rStream, uno::Reference<embed::XEmbeddedObject> rObject, bool bForceString); RTFValue(int nValue); RTFValue(rtl::OUString sValue, bool bForce = false); RTFValue(RTFSprms rAttributes); RTFValue(RTFSprms rAttributes, RTFSprms rSprms); RTFValue(uno::Reference<drawing::XShape> rShape); RTFValue(uno::Reference<io::XInputStream> rStream); + RTFValue(uno::Reference<embed::XEmbeddedObject> rObject); virtual ~RTFValue(); void setString(rtl::OUString sValue); virtual int getInt() const; @@ -68,6 +70,7 @@ namespace writerfilter { boost::shared_ptr<RTFSprms> m_pSprms; uno::Reference<drawing::XShape> m_xShape; uno::Reference<io::XInputStream> m_xStream; + uno::Reference<embed::XEmbeddedObject> m_xObject; bool m_bForceString; }; } // namespace rtftok _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits