On Tuesday 16 of August 2011, Caolán McNamara wrote: > On Mon, 2011-08-15 at 17:16 +0200, Lubos Lunak wrote: > > I already have a pointer to SmModel and SmDocShell (I can get it the same > > way the .doc code does) and just need to call their method, passing the > > XML serializer object as an argument, that's it. > > Probably matters what the destination format is like ? Is it a > standalone thing and/or exists in a substorage/folder of the parent > format where it doesn't care about what it is inside ? i.e. I'd sort of > expect to basically just add another export filter to starmath for > whatever that format is, add it to SmDocShell::ConvertTo and call that > directly/indirectly. And have a save as... entry for the format if it > makes sense to have it standalone ?
The destination format is OOXML, and the formula is a part of one .xml file. It is standalone in the way that the whole formula is stored by starmath using Sm* classes and the XML subtree can be written out independently on the rest of the file. It is not standalone in the way that is it part of the .xml file and needs to be positioned inside the proper XML elements of the writer document. So using private streams is either not possible or only a complication depending on whether two sax_fastparser::FastSerializerHelper objects can be nested (I don't feel like trying, for these reasons). A standalone export file also wouldn't be right, as the formula needs to be inside a valid document. > That's not going to work if the destination format needs hooks back into > its surrounding container. Is that the problem ? No, starmath doesn't need to call back to writer. The problem is that this is still needlessly complicated. How about the attached patch? -- Lubos Lunak l.lu...@suse.cz
diff --git a/filter/inc/filter/msfilter/ooxmlexport.hxx b/filter/inc/filter/msfilter/ooxmlexport.hxx new file mode 100644 index 0000000..6ec0594 --- /dev/null +++ b/filter/inc/filter/msfilter/ooxmlexport.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _OOXMLEXPORT_HXX +#define _OOXMLEXPORT_HXX + +#include <sax/fshelper.hxx> +#include "filter/msfilter/msfilterdllapi.h" + +/** + Interface class, StarMath will implement writeFormulaOoxml() to write out OOXML + representing the formula. + */ +class MSFILTER_DLLPUBLIC OoxmlFormulaExportBase +{ +public: + virtual void writeFormulaOoxml( ::sax_fastparser::FSHelperPtr m_pSerializer ) = 0; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/starmath/Library_sm.mk b/starmath/Library_sm.mk index 034bf60..ce22bc5 100644 --- a/starmath/Library_sm.mk +++ b/starmath/Library_sm.mk @@ -47,7 +47,9 @@ $(eval $(call gb_Library_add_linked_libs,sm,\ cppuhelper \ editeng \ i18npaper \ + msfilter \ sal \ + sax \ sfx \ sot \ svl \ diff --git a/starmath/inc/unomodel.hxx b/starmath/inc/unomodel.hxx index 693ea3b..15ada7b 100644 --- a/starmath/inc/unomodel.hxx +++ b/starmath/inc/unomodel.hxx @@ -37,6 +37,7 @@ #include <sfx2/sfxbasemodel.hxx> #include <comphelper/propertysethelper.hxx> #include <vcl/print.hxx> +#include <filter/msfilter/ooxmlexport.hxx> class SmFormat; @@ -63,7 +64,8 @@ public: class SmModel : public SfxBaseModel, public comphelper::PropertySetHelper, public com::sun::star::lang::XServiceInfo, - public com::sun::star::view::XRenderable + public com::sun::star::view::XRenderable, + public OoxmlFormulaExportBase { SmPrintUIOptions* m_pPrintUIOptions; protected: @@ -100,6 +102,9 @@ public: virtual void SAL_CALL setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xParent ) throw( ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException ); + // OoxmlFormulaExportBase + virtual void writeFormulaOoxml( ::sax_fastparser::FSHelperPtr m_pSerializer ); + static ::com::sun::star::uno::Sequence< rtl::OUString > getSupportedServiceNames_Static(); static ::rtl::OUString getImplementationName_Static(); }; diff --git a/starmath/source/unomodel.cxx b/starmath/source/unomodel.cxx index 8ee267e..d44485a 100644 --- a/starmath/source/unomodel.cxx +++ b/starmath/source/unomodel.cxx @@ -1132,4 +1132,9 @@ void SAL_CALL SmModel::setParent( const uno::Reference< uno::XInterface >& xPare } } +void SmModel::writeFormulaOoxml( ::sax_fastparser::FSHelperPtr m_pSerializer ) +{ + static_cast< SmDocShell* >( GetObjectShell())->writeFormulaOoxml( m_pSerializer ); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index b2c4391..fcd303a 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -45,6 +45,7 @@ #include <oox/export/drawingml.hxx> #include <oox/export/utils.hxx> #include <oox/export/vmlexport.hxx> +#include <filter/msfilter/ooxmlexport.hxx> #include <i18npool/mslangid.hxx> @@ -2301,7 +2302,11 @@ bool DocxAttributeOutput::WriteOLEMath( const SdrObject*, const SwOLENode& rOLEN if( !SotExchange::IsMath(aObjName) ) return false; - // TODO + uno::Reference< uno::XInterface > xInterface( aObjRef->getComponent(), uno::UNO_QUERY ); + OoxmlFormulaExportBase* formulaexport = dynamic_cast< OoxmlFormulaExportBase* >( xInterface.get()); + if( formulaexport == NULL ) + return false; + formulaexport->writeFormulaOoxml( m_pSerializer ); return true; }
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice