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

Reply via email to