xref: /trunk/main/editeng/source/xml/xmltxtexp.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_editeng.hxx"
30 
31 /** this file implements an export of a selected EditEngine content into
32     a xml stream. See editeng/source/inc/xmledit.hxx for interface */
33 #include <com/sun/star/ucb/XAnyCompareFactory.hpp>
34 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
35 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36 #include <com/sun/star/io/XActiveDataSource.hpp>
37 #include <tools/debug.hxx>
38 #include <svl/itemprop.hxx>
39 #include <svl/brdcst.hxx>
40 #include <com/sun/star/uno/Sequence.hxx>
41 #include <sot/storage.hxx>
42 #include <rtl/ustrbuf.hxx>
43 #include <xmloff/xmluconv.hxx>
44 #include <xmloff/xmlnmspe.hxx>
45 #include <xmloff/nmspmap.hxx>
46 #include <xmloff/xmlmetae.hxx>
47 #include <cppuhelper/implbase4.hxx>
48 #include <comphelper/processfactory.hxx>
49 #include <unotools/streamwrap.hxx>
50 #include <xmloff/xmlexp.hxx>
51 #include <editeng/unoedsrc.hxx>
52 #include <editeng/unofored.hxx>
53 #include <editeng/unotext.hxx>
54 #include <editeng/unoprnms.hxx>
55 #include <editeng/unofield.hxx>
56 #include <editeng/editeng.hxx>
57 #include "editsource.hxx"
58 #include <editeng/unonrule.hxx>
59 #include <editeng/unoipset.hxx>
60 
61 using namespace com::sun::star;
62 using namespace com::sun::star::container;
63 using namespace com::sun::star::document;
64 using namespace com::sun::star::uno;
65 using namespace com::sun::star::awt;
66 using namespace com::sun::star::lang;
67 using namespace com::sun::star::xml::sax;
68 using namespace ::rtl;
69 using namespace cppu;
70 
71 ///////////////////////////////////////////////////////////////////////
72 
73 class SvxEditEngineSourceImpl;
74 
75 ///////////////////////////////////////////////////////////////////////
76 
77 class SvxEditEngineSourceImpl
78 {
79 private:
80     oslInterlockedCount maRefCount;
81 
82     EditEngine*             mpEditEngine;
83     SvxTextForwarder*       mpTextForwarder;
84 
85     ~SvxEditEngineSourceImpl();
86 
87 public:
88     SvxEditEngineSourceImpl( EditEngine* pEditEngine );
89 
90     void SAL_CALL acquire();
91     void SAL_CALL release();
92 
93     SvxTextForwarder*       GetTextForwarder();
94 };
95 
96 ///////////////////////////////////////////////////////////////////////
97 
98 
99 //------------------------------------------------------------------------
100 
101 SvxEditEngineSourceImpl::SvxEditEngineSourceImpl( EditEngine* pEditEngine )
102 : maRefCount(0),
103   mpEditEngine( pEditEngine ),
104   mpTextForwarder(NULL)
105 {
106 }
107 
108 //------------------------------------------------------------------------
109 
110 SvxEditEngineSourceImpl::~SvxEditEngineSourceImpl()
111 {
112     delete mpTextForwarder;
113 }
114 
115 //------------------------------------------------------------------------
116 
117 void SAL_CALL SvxEditEngineSourceImpl::acquire()
118 {
119     osl_incrementInterlockedCount( &maRefCount );
120 }
121 
122 //------------------------------------------------------------------------
123 
124 void SAL_CALL SvxEditEngineSourceImpl::release()
125 {
126     if( ! osl_decrementInterlockedCount( &maRefCount ) )
127         delete this;
128 }
129 
130 //------------------------------------------------------------------------
131 
132 SvxTextForwarder* SvxEditEngineSourceImpl::GetTextForwarder()
133 {
134     if (!mpTextForwarder)
135         mpTextForwarder = new SvxEditEngineForwarder( *mpEditEngine );
136 
137     return mpTextForwarder;
138 }
139 
140 // --------------------------------------------------------------------
141 // SvxTextEditSource
142 // --------------------------------------------------------------------
143 
144 SvxEditEngineSource::SvxEditEngineSource( EditEngine* pEditEngine )
145 {
146     mpImpl = new SvxEditEngineSourceImpl( pEditEngine );
147     mpImpl->acquire();
148 }
149 
150 // --------------------------------------------------------------------
151 
152 SvxEditEngineSource::SvxEditEngineSource( SvxEditEngineSourceImpl* pImpl )
153 {
154     mpImpl = pImpl;
155     mpImpl->acquire();
156 }
157 
158 //------------------------------------------------------------------------
159 
160 SvxEditEngineSource::~SvxEditEngineSource()
161 {
162     mpImpl->release();
163 }
164 
165 //------------------------------------------------------------------------
166 
167 SvxEditSource* SvxEditEngineSource::Clone() const
168 {
169     return new SvxEditEngineSource( mpImpl );
170 }
171 
172 //------------------------------------------------------------------------
173 
174 SvxTextForwarder* SvxEditEngineSource::GetTextForwarder()
175 {
176     return mpImpl->GetTextForwarder();
177 }
178 
179 //------------------------------------------------------------------------
180 
181 void SvxEditEngineSource::UpdateData()
182 {
183 }
184 
185 class SvxSimpleUnoModel : public cppu::WeakAggImplHelper4<
186                                     ::com::sun::star::frame::XModel,
187                                     ::com::sun::star::ucb::XAnyCompareFactory,
188                                     ::com::sun::star::style::XStyleFamiliesSupplier,
189                                     ::com::sun::star::lang::XMultiServiceFactory >
190 {
191 public:
192     SvxSimpleUnoModel();
193     virtual ~SvxSimpleUnoModel();
194 
195 
196     // XMultiServiceFactory
197     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstance( const ::rtl::OUString& aServiceSpecifier ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
198     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstanceWithArguments( const ::rtl::OUString& ServiceSpecifier, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Arguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
199     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getAvailableServiceNames(  ) throw(::com::sun::star::uno::RuntimeException);
200 
201     // XStyleFamiliesSupplier
202     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getStyleFamilies(  ) throw(::com::sun::star::uno::RuntimeException);
203 
204     // XAnyCompareFactory
205     virtual ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XAnyCompare > SAL_CALL createAnyCompareByName( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException);
206 
207     // XModel
208     virtual sal_Bool SAL_CALL attachResource( const ::rtl::OUString& aURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArgs ) throw (::com::sun::star::uno::RuntimeException);
209     virtual ::rtl::OUString SAL_CALL getURL(  ) throw (::com::sun::star::uno::RuntimeException);
210     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL getArgs(  ) throw (::com::sun::star::uno::RuntimeException);
211     virtual void SAL_CALL connectController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& xController ) throw (::com::sun::star::uno::RuntimeException);
212     virtual void SAL_CALL disconnectController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& xController ) throw (::com::sun::star::uno::RuntimeException);
213     virtual void SAL_CALL lockControllers(  ) throw (::com::sun::star::uno::RuntimeException);
214     virtual void SAL_CALL unlockControllers(  ) throw (::com::sun::star::uno::RuntimeException);
215     virtual sal_Bool SAL_CALL hasControllersLocked(  ) throw (::com::sun::star::uno::RuntimeException);
216     virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > SAL_CALL getCurrentController(  ) throw (::com::sun::star::uno::RuntimeException);
217     virtual void SAL_CALL setCurrentController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& xController ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
218     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getCurrentSelection(  ) throw (::com::sun::star::uno::RuntimeException);
219 
220     // XComponent
221     virtual void SAL_CALL dispose(  ) throw (::com::sun::star::uno::RuntimeException);
222     virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
223     virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
224 
225 };
226 
227 SvxSimpleUnoModel::SvxSimpleUnoModel()
228 {
229 }
230 
231 SvxSimpleUnoModel::~SvxSimpleUnoModel()
232 {
233 }
234 
235 // XMultiServiceFactory ( SvxFmMSFactory )
236 uno::Reference< uno::XInterface > SAL_CALL SvxSimpleUnoModel::createInstance( const OUString& aServiceSpecifier )
237     throw(uno::Exception, uno::RuntimeException)
238 {
239     if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.NumberingRules" ) ) )
240     {
241         return uno::Reference< uno::XInterface >(
242             SvxCreateNumRule(), uno::UNO_QUERY );
243     }
244     if (   (0 == aServiceSpecifier.reverseCompareToAsciiL(
245             RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.textfield.DateTime")))
246         || (0 == aServiceSpecifier.reverseCompareToAsciiL(
247             RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextField.DateTime")))
248        )
249     {
250         return (::cppu::OWeakObject * )new SvxUnoTextField( ID_EXT_DATEFIELD );
251     }
252 
253     return SvxUnoTextCreateTextField( aServiceSpecifier );
254 
255 }
256 
257 uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SvxSimpleUnoModel::createInstanceWithArguments( const ::rtl::OUString& ServiceSpecifier, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
258 {
259     return createInstance( ServiceSpecifier );
260 }
261 
262 Sequence< ::rtl::OUString > SAL_CALL SvxSimpleUnoModel::getAvailableServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)
263 {
264     Sequence< OUString > aSeq;
265     return aSeq;
266 }
267 
268 // XAnyCompareFactory
269 uno::Reference< com::sun::star::ucb::XAnyCompare > SAL_CALL SvxSimpleUnoModel::createAnyCompareByName( const OUString& PropertyName )
270     throw(uno::RuntimeException)
271 {
272     (void)PropertyName;
273     return SvxCreateNumRuleCompare();
274 }
275 
276 // XStyleFamiliesSupplier
277 uno::Reference< container::XNameAccess > SAL_CALL SvxSimpleUnoModel::getStyleFamilies(  )
278     throw(uno::RuntimeException)
279 {
280     uno::Reference< container::XNameAccess > xStyles;
281     return xStyles;
282 }
283 
284 // XModel
285 sal_Bool SAL_CALL SvxSimpleUnoModel::attachResource( const ::rtl::OUString& aURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArgs ) throw (::com::sun::star::uno::RuntimeException)
286 {
287     (void)aURL;
288     (void)aArgs;
289     return sal_False;
290 }
291 
292 ::rtl::OUString SAL_CALL SvxSimpleUnoModel::getURL(  ) throw (::com::sun::star::uno::RuntimeException)
293 {
294     OUString aStr;
295     return aStr;
296 }
297 
298 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL SvxSimpleUnoModel::getArgs(  ) throw (::com::sun::star::uno::RuntimeException)
299 {
300     Sequence< beans::PropertyValue > aSeq;
301     return aSeq;
302 }
303 
304 void SAL_CALL SvxSimpleUnoModel::connectController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& ) throw (::com::sun::star::uno::RuntimeException)
305 {
306 }
307 
308 void SAL_CALL SvxSimpleUnoModel::disconnectController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& ) throw (::com::sun::star::uno::RuntimeException)
309 {
310 }
311 
312 void SAL_CALL SvxSimpleUnoModel::lockControllers(  ) throw (::com::sun::star::uno::RuntimeException)
313 {
314 }
315 
316 void SAL_CALL SvxSimpleUnoModel::unlockControllers(  ) throw (::com::sun::star::uno::RuntimeException)
317 {
318 }
319 
320 sal_Bool SAL_CALL SvxSimpleUnoModel::hasControllersLocked(  ) throw (::com::sun::star::uno::RuntimeException)
321 {
322     return sal_True;
323 }
324 
325 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > SAL_CALL SvxSimpleUnoModel::getCurrentController(  ) throw (::com::sun::star::uno::RuntimeException)
326 {
327     uno::Reference< frame::XController > xRet;
328     return xRet;
329 }
330 
331 void SAL_CALL SvxSimpleUnoModel::setCurrentController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException)
332 {
333 }
334 
335 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SvxSimpleUnoModel::getCurrentSelection(  ) throw (::com::sun::star::uno::RuntimeException)
336 {
337     uno::Reference< XInterface > xRet;
338     return xRet;
339 }
340 
341 
342 // XComponent
343 void SAL_CALL SvxSimpleUnoModel::dispose(  ) throw (::com::sun::star::uno::RuntimeException)
344 {
345 }
346 
347 void SAL_CALL SvxSimpleUnoModel::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& ) throw (::com::sun::star::uno::RuntimeException)
348 {
349 }
350 
351 void SAL_CALL SvxSimpleUnoModel::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& ) throw (::com::sun::star::uno::RuntimeException)
352 {
353 }
354 
355 ///////////////////////////////////////////////////////////////////////
356 
357 class SvxXMLTextExportComponent : public SvXMLExport
358 {
359 public:
360     // #110680#
361     SvxXMLTextExportComponent(
362         const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory,
363         EditEngine* pEditEngine,
364         const ESelection& rSel,
365         const ::rtl::OUString& rFileName,
366         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler > & xHandler );
367 
368     ~SvxXMLTextExportComponent();
369 
370     // methods without content:
371     virtual void _ExportAutoStyles();
372     virtual void _ExportMasterStyles();
373     virtual void _ExportContent();
374 
375 private:
376     com::sun::star::uno::Reference< com::sun::star::text::XText > mxText;
377     EditEngine* mpEditEngine;
378     ESelection maSelection;
379 };
380 
381 ///////////////////////////////////////////////////////////////////////
382 
383 // #110680#
384 SvxXMLTextExportComponent::SvxXMLTextExportComponent(
385     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory,
386     EditEngine* pEditEngine,
387     const ESelection& rSel,
388     const ::rtl::OUString& rFileName,
389     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler > & xHandler)
390 :   SvXMLExport( xServiceFactory, rFileName, xHandler, ((frame::XModel*)new SvxSimpleUnoModel()), MAP_CM ),
391     mpEditEngine( pEditEngine ),
392     maSelection( rSel )
393 {
394     SvxEditEngineSource aEditSource( pEditEngine );
395 
396     static const SfxItemPropertyMapEntry SvxXMLTextExportComponentPropertyMap[] =
397     {
398         SVX_UNOEDIT_CHAR_PROPERTIES,
399         SVX_UNOEDIT_FONT_PROPERTIES,
400 //      SVX_UNOEDIT_OUTLINER_PROPERTIES,
401         {MAP_CHAR_LEN(UNO_NAME_NUMBERING_RULES),        EE_PARA_NUMBULLET,  &::getCppuType((const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexReplace>*)0), 0, 0 },
402         {MAP_CHAR_LEN(UNO_NAME_NUMBERING),              EE_PARA_BULLETSTATE,&::getBooleanCppuType(), 0, 0 },
403         {MAP_CHAR_LEN(UNO_NAME_NUMBERING_LEVEL),        EE_PARA_OUTLLEVEL,  &::getCppuType((const sal_Int16*)0), 0, 0 },
404         SVX_UNOEDIT_PARA_PROPERTIES,
405         {0,0,0,0,0,0}
406     };
407     static SvxItemPropertySet aSvxXMLTextExportComponentPropertySet( SvxXMLTextExportComponentPropertyMap, EditEngine::GetGlobalItemPool() );
408 
409     SvxUnoText* pUnoText = new SvxUnoText( &aEditSource, &aSvxXMLTextExportComponentPropertySet, mxText );
410     pUnoText->SetSelection( rSel );
411     mxText = pUnoText;
412 
413     setExportFlags( EXPORT_AUTOSTYLES|EXPORT_CONTENT );
414 }
415 
416 SvxXMLTextExportComponent::~SvxXMLTextExportComponent()
417 {
418 }
419 
420 void SvxWriteXML( EditEngine& rEditEngine, SvStream& rStream, const ESelection& rSel )
421 {
422     try
423     {
424         do
425         {
426             // create service factory
427 
428             uno::Reference< lang::XMultiServiceFactory> xServiceFactory( ::comphelper::getProcessServiceFactory() );
429 
430             if( !xServiceFactory.is() )
431             {
432                 DBG_ERROR( "got no service manager" );
433                 break;
434             }
435 
436             // create document handler
437 
438             uno::Reference< uno::XInterface > xWriter( xServiceFactory->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer" ) ) ) );
439 
440             if( !xWriter.is() )
441             {
442                 DBG_ERROR( "com.sun.star.xml.sax.Writer service missing" );
443                 break;
444             }
445 
446             uno::Reference<xml::sax::XDocumentHandler>  xHandler( xWriter, uno::UNO_QUERY );
447 
448             // create output stream and active data source
449             uno::Reference<io::XOutputStream> xOut( new utl::OOutputStreamWrapper( rStream ) );
450 
451 /* testcode
452             const OUString aURL( RTL_CONSTASCII_USTRINGPARAM( "file:///e:/test.xml" ) );
453             SfxMedium aMedium( aURL, STREAM_WRITE | STREAM_TRUNC, sal_True );
454             aMedium.IsRemote();
455             uno::Reference<io::XOutputStream> xOut( new utl::OOutputStreamWrapper( *aMedium.GetOutStream() ) );
456 */
457 
458 
459             uno::Reference<io::XActiveDataSource> xMetaSrc( xWriter, uno::UNO_QUERY );
460             xMetaSrc->setOutputStream( xOut );
461 
462             // export text
463             const OUString aName;
464 
465             // #110680#
466             // SvxXMLTextExportComponent aExporter( &rEditEngine, rSel, aName, xHandler );
467             SvxXMLTextExportComponent aExporter( xServiceFactory, &rEditEngine, rSel, aName, xHandler );
468 
469             aExporter.exportDoc();
470 
471 /* testcode
472             aMedium.Commit();
473 */
474 
475         }
476         while( 0 );
477     }
478     catch( uno::Exception& )
479     {
480         DBG_ERROR("exception during xml export");
481     }
482 }
483 
484 // methods without content:
485 void SvxXMLTextExportComponent::_ExportAutoStyles()
486 {
487     UniReference< XMLTextParagraphExport > xTextExport( GetTextParagraphExport() );
488 
489     xTextExport->collectTextAutoStyles( mxText );
490     xTextExport->exportTextAutoStyles();
491 }
492 
493 void SvxXMLTextExportComponent::_ExportContent()
494 {
495     UniReference< XMLTextParagraphExport > xTextExport( GetTextParagraphExport() );
496 
497     xTextExport->exportText( mxText );
498 }
499 
500 void SvxXMLTextExportComponent::_ExportMasterStyles() {}
501