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