Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <xmloff/unointerfacetouniqueidentifiermapper.hxx>
21 : #include <tools/debug.hxx>
22 : #include <rtl/ustrbuf.hxx>
23 : #include <sal/types.h>
24 : #include <com/sun/star/lang/XServiceInfo.hpp>
25 : #include <com/sun/star/container/XEnumerationAccess.hpp>
26 : #include <com/sun/star/container/XEnumeration.hpp>
27 : #include <com/sun/star/container/XIndexReplace.hpp>
28 : #include <com/sun/star/beans/XPropertySet.hpp>
29 : #include <com/sun/star/beans/XMultiPropertySet.hpp>
30 : #include <com/sun/star/beans/XPropertyState.hpp>
31 : #include <com/sun/star/text/XTextDocument.hpp>
32 : #include <com/sun/star/text/XTextSectionsSupplier.hpp>
33 : #include <com/sun/star/text/XTextTablesSupplier.hpp>
34 : #include <com/sun/star/text/XNumberingRulesSupplier.hpp>
35 : #include <com/sun/star/text/XChapterNumberingSupplier.hpp>
36 : #include <com/sun/star/text/XTextTable.hpp>
37 : #include <com/sun/star/text/XText.hpp>
38 : #include <com/sun/star/text/XTextContent.hpp>
39 : #include <com/sun/star/text/XTextRange.hpp>
40 : #include <com/sun/star/text/XTextField.hpp>
41 : #include <com/sun/star/text/XFootnote.hpp>
42 : #include <com/sun/star/container/XNamed.hpp>
43 : #include <com/sun/star/container/XContentEnumerationAccess.hpp>
44 : #include <com/sun/star/text/XTextFrame.hpp>
45 : #include <com/sun/star/container/XNameAccess.hpp>
46 : #include <com/sun/star/text/SizeType.hpp>
47 : #include <com/sun/star/text/HoriOrientation.hpp>
48 : #include <com/sun/star/text/VertOrientation.hpp>
49 : #include <com/sun/star/text/TextContentAnchorType.hpp>
50 : #include <com/sun/star/text/XTextFramesSupplier.hpp>
51 : #include <com/sun/star/text/XTextGraphicObjectsSupplier.hpp>
52 : #include <com/sun/star/text/XTextEmbeddedObjectsSupplier.hpp>
53 : #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
54 : #include <com/sun/star/document/XEmbeddedObjectSupplier.hpp>
55 : #include <com/sun/star/document/XEventsSupplier.hpp>
56 : #include <com/sun/star/document/XRedlinesSupplier.hpp>
57 : #include <com/sun/star/text/XBookmarksSupplier.hpp>
58 : #include <com/sun/star/text/XFormField.hpp>
59 : #include <com/sun/star/text/XTextSection.hpp>
60 : #include <com/sun/star/text/SectionFileLink.hpp>
61 : #include <com/sun/star/drawing/XShape.hpp>
62 : #include <com/sun/star/text/XTextShapesSupplier.hpp>
63 : #include <com/sun/star/style/XAutoStylesSupplier.hpp>
64 : #include <com/sun/star/style/XAutoStyleFamily.hpp>
65 : #include <com/sun/star/text/XTextFieldsSupplier.hpp>
66 : #include <com/sun/star/text/XFootnotesSupplier.hpp>
67 : #include <com/sun/star/text/XEndnotesSupplier.hpp>
68 : #include <com/sun/star/drawing/XControlShape.hpp>
69 : #include <com/sun/star/util/DateTime.hpp>
70 :
71 : #include <sax/tools/converter.hxx>
72 :
73 : #include <xmloff/xmlnmspe.hxx>
74 : #include <xmloff/xmlaustp.hxx>
75 : #include <xmloff/families.hxx>
76 : #include "txtexppr.hxx"
77 : #include <xmloff/xmlnumfe.hxx>
78 : #include <xmloff/xmlnume.hxx>
79 : #include <xmloff/xmluconv.hxx>
80 : #include "XMLAnchorTypePropHdl.hxx"
81 : #include "xexptran.hxx"
82 : #include <xmloff/ProgressBarHelper.hxx>
83 : #include <xmloff/nmspmap.hxx>
84 : #include <xmloff/xmlexp.hxx>
85 : #include "txtflde.hxx"
86 : #include <xmloff/txtprmap.hxx>
87 : #include "XMLImageMapExport.hxx"
88 : #include "XMLTextNumRuleInfo.hxx"
89 : #include <xmloff/XMLTextListAutoStylePool.hxx>
90 : #include <xmloff/txtparae.hxx>
91 : #include "XMLSectionExport.hxx"
92 : #include "XMLIndexMarkExport.hxx"
93 : #include <xmloff/XMLEventExport.hxx>
94 : #include "XMLRedlineExport.hxx"
95 : #include "MultiPropertySetHelper.hxx"
96 : #include <xmloff/formlayerexport.hxx>
97 : #include "XMLTextCharStyleNamesElementExport.hxx"
98 : #include <xmloff/odffields.hxx>
99 : #include <xmloff/maptype.hxx>
100 : #include <basegfx/polygon/b2dpolypolygon.hxx>
101 : #include <basegfx/polygon/b2dpolypolygontools.hxx>
102 : #include <basegfx/polygon/b2dpolygontools.hxx>
103 : #include <com/sun/star/embed/ElementModes.hpp>
104 : #include <com/sun/star/embed/XTransactedObject.hpp>
105 : #include <com/sun/star/document/XStorageBasedDocument.hpp>
106 : #include <txtlists.hxx>
107 : #include <com/sun/star/rdf/XMetadatable.hpp>
108 : #include <list>
109 : #include <unordered_map>
110 : #include <vector>
111 : #include <algorithm>
112 :
113 : using namespace ::std;
114 : using namespace ::com::sun::star;
115 : using namespace ::com::sun::star::uno;
116 : using namespace ::com::sun::star::lang;
117 : using namespace ::com::sun::star::beans;
118 : using namespace ::com::sun::star::container;
119 : using namespace ::com::sun::star::text;
120 : using namespace ::com::sun::star::style;
121 : using namespace ::com::sun::star::util;
122 : using namespace ::com::sun::star::drawing;
123 : using namespace ::com::sun::star::document;
124 : using namespace ::com::sun::star::frame;
125 : using namespace ::xmloff;
126 : using namespace ::xmloff::token;
127 :
128 : namespace
129 : {
130 9624 : class TextContentSet
131 : {
132 : public:
133 : typedef Reference<XTextContent> text_content_ref_t;
134 : typedef list<text_content_ref_t> contents_t;
135 : typedef back_insert_iterator<contents_t> inserter_t;
136 : typedef contents_t::const_iterator const_iterator_t;
137 :
138 10 : inserter_t getInserter()
139 10 : { return back_insert_iterator<contents_t>(m_vTextContents); };
140 292 : const_iterator_t getBegin() const
141 292 : { return m_vTextContents.begin(); };
142 297 : const_iterator_t getEnd() const
143 297 : { return m_vTextContents.end(); };
144 :
145 : private:
146 : contents_t m_vTextContents;
147 : };
148 :
149 : struct FrameRefHash
150 : : public unary_function<Reference<XTextFrame>, size_t>
151 : {
152 236 : size_t operator()(const Reference<XTextFrame>& rFrame) const
153 236 : { return sal::static_int_cast<size_t>(reinterpret_cast<sal_uIntPtr>(rFrame.get())); }
154 : };
155 :
156 6 : static bool lcl_TextContentsUnfiltered(const Reference<XTextContent>&)
157 6 : { return true; };
158 :
159 10 : static bool lcl_ShapeFilter(const Reference<XTextContent>& xTxtContent)
160 : {
161 10 : Reference<XShape> xShape(xTxtContent, UNO_QUERY);
162 10 : if(!xShape.is())
163 0 : return false;
164 20 : Reference<XServiceInfo> xServiceInfo(xTxtContent, UNO_QUERY);
165 48 : if(xServiceInfo->supportsService("com.sun.star.text.TextFrame") ||
166 52 : xServiceInfo->supportsService("com.sun.star.text.TextGraphicObject") ||
167 18 : xServiceInfo->supportsService("com.sun.star.text.TextEmbeddedObject") )
168 6 : return false;
169 14 : return true;
170 : };
171 :
172 4812 : class BoundFrames
173 : {
174 : public:
175 : typedef bool (*filter_t)(const Reference<XTextContent>&);
176 576 : BoundFrames(
177 : const Reference<XEnumerationAccess>& rEnumAccess,
178 : const filter_t& rFilter)
179 576 : : m_xEnumAccess(rEnumAccess)
180 : {
181 576 : Fill(rFilter);
182 576 : };
183 4236 : BoundFrames()
184 4236 : {};
185 292 : const TextContentSet& GetPageBoundContents() const
186 292 : { return m_vPageBounds; };
187 236 : const TextContentSet* GetFrameBoundContents(const Reference<XTextFrame>& rParentFrame) const
188 : {
189 236 : framebound_map_t::const_iterator it = m_vFrameBoundsOf.find(rParentFrame);
190 236 : if(it == m_vFrameBoundsOf.end())
191 236 : return NULL;
192 0 : return &(it->second);
193 : };
194 365 : Reference<XEnumeration> createEnumeration() const
195 : {
196 365 : if(!m_xEnumAccess.is())
197 0 : return Reference<XEnumeration>();
198 365 : return m_xEnumAccess->createEnumeration();
199 : };
200 :
201 : private:
202 : typedef std::unordered_map<
203 : Reference<XTextFrame>,
204 : TextContentSet,
205 : FrameRefHash> framebound_map_t;
206 : TextContentSet m_vPageBounds;
207 : framebound_map_t m_vFrameBoundsOf;
208 : const Reference<XEnumerationAccess> m_xEnumAccess;
209 : void Fill(const filter_t& rFilter);
210 : };
211 :
212 0 : class FieldParamExporter
213 : {
214 : public:
215 0 : FieldParamExporter(SvXMLExport* const pExport, Reference<XNameContainer> xFieldParams)
216 : : m_pExport(pExport)
217 0 : , m_xFieldParams(xFieldParams)
218 0 : { };
219 : void Export();
220 :
221 : private:
222 : SvXMLExport* const m_pExport;
223 : const Reference<XNameContainer> m_xFieldParams;
224 :
225 : void ExportParameter(const OUString& sKey, const OUString& sValue);
226 : };
227 : }
228 :
229 : namespace xmloff
230 : {
231 1059 : class BoundFrameSets
232 : {
233 : public:
234 : explicit BoundFrameSets(const Reference<XInterface>& rModel);
235 205 : const BoundFrames* GetTexts() const
236 205 : { return m_pTexts.get(); };
237 205 : const BoundFrames* GetGraphics() const
238 205 : { return m_pGraphics.get(); };
239 205 : const BoundFrames* GetEmbeddeds() const
240 205 : { return m_pEmbeddeds.get(); };
241 278 : const BoundFrames* GetShapes() const
242 278 : { return m_pShapes.get(); };
243 : private:
244 : unique_ptr<BoundFrames> m_pTexts;
245 : unique_ptr<BoundFrames> m_pGraphics;
246 : unique_ptr<BoundFrames> m_pEmbeddeds;
247 : unique_ptr<BoundFrames> m_pShapes;
248 : };
249 : }
250 :
251 : #ifdef DBG_UTIL
252 : static bool txtparae_bContainsIllegalCharacters = false;
253 : #endif
254 :
255 : // The following map shows which property values are required:
256 :
257 : // property auto style pass export
258 :
259 : // ParaStyleName if style exists always
260 : // ParaConditionalStyleName if style exists always
261 : // NumberingRules if style exists always
262 : // TextSection always always
263 : // ParaChapterNumberingLevel never always
264 : // NumberingIsNumber never always
265 :
266 : // The conclusion is that for auto styles the first three properties
267 : // should be queried using a multi property set if, and only if, an
268 : // auto style needs to be exported. TextSection should be queried by
269 : // an individual call to getPropertyvalue, because this seems to be
270 : // less expensive than querying the first three properties if they aren't
271 : // required.
272 :
273 : // For the export pass all properties can be queried using a multi property
274 : // set.
275 :
276 : static const sal_Char* aParagraphPropertyNamesAuto[] =
277 : {
278 : "NumberingRules",
279 : "ParaConditionalStyleName",
280 : "ParaStyleName",
281 : NULL
282 : };
283 :
284 : enum eParagraphPropertyNamesEnumAuto
285 : {
286 : NUMBERING_RULES_AUTO = 0,
287 : PARA_CONDITIONAL_STYLE_NAME_AUTO = 1,
288 : PARA_STYLE_NAME_AUTO = 2
289 : };
290 :
291 : static const sal_Char* aParagraphPropertyNames[] =
292 : {
293 : "NumberingIsNumber",
294 : "NumberingStyleName",
295 : "OutlineLevel",
296 : "ParaConditionalStyleName",
297 : "ParaStyleName",
298 : "TextSection",
299 : NULL
300 : };
301 :
302 : enum eParagraphPropertyNamesEnum
303 : {
304 : NUMBERING_IS_NUMBER = 0,
305 : PARA_NUMBERING_STYLENAME = 1,
306 : PARA_OUTLINE_LEVEL=2,
307 : PARA_CONDITIONAL_STYLE_NAME = 3,
308 : PARA_STYLE_NAME = 4,
309 : TEXT_SECTION = 5
310 : };
311 :
312 576 : void BoundFrames::Fill(const filter_t& rFilter)
313 : {
314 576 : if(!m_xEnumAccess.is())
315 0 : return;
316 576 : const Reference< XEnumeration > xEnum = m_xEnumAccess->createEnumeration();
317 576 : if(!xEnum.is())
318 0 : return;
319 1152 : const OUString our_sAnchorType("AnchorType");
320 1152 : const OUString our_sAnchorFrame("AnchorFrame");
321 1494 : while(xEnum->hasMoreElements())
322 : {
323 342 : Reference<XPropertySet> xPropSet(xEnum->nextElement(), UNO_QUERY);
324 352 : Reference<XTextContent> xTextContent(xPropSet, UNO_QUERY);
325 342 : if(!xPropSet.is() || !xTextContent.is())
326 0 : continue;
327 : TextContentAnchorType eAnchor;
328 342 : xPropSet->getPropertyValue(our_sAnchorType) >>= eAnchor;
329 342 : if(TextContentAnchorType_AT_PAGE != eAnchor && TextContentAnchorType_AT_FRAME != eAnchor)
330 326 : continue;
331 16 : if(!rFilter(xTextContent))
332 6 : continue;
333 :
334 10 : TextContentSet::inserter_t pInserter = m_vPageBounds.getInserter();
335 10 : if(TextContentAnchorType_AT_FRAME == eAnchor)
336 : {
337 : Reference<XTextFrame> xAnchorTxtFrame(
338 0 : xPropSet->getPropertyValue(our_sAnchorFrame),
339 0 : uno::UNO_QUERY);
340 0 : pInserter = m_vFrameBoundsOf[xAnchorTxtFrame].getInserter();
341 : }
342 10 : *pInserter++ = xTextContent;
343 586 : }
344 : }
345 :
346 1059 : BoundFrameSets::BoundFrameSets(const Reference<XInterface>& rModel)
347 0 : : m_pTexts(new BoundFrames())
348 0 : , m_pGraphics(new BoundFrames())
349 0 : , m_pEmbeddeds(new BoundFrames())
350 1059 : , m_pShapes(new BoundFrames())
351 : {
352 1059 : const Reference<XTextFramesSupplier> xTFS(rModel, UNO_QUERY);
353 2118 : const Reference<XTextGraphicObjectsSupplier> xGOS(rModel, UNO_QUERY);
354 2118 : const Reference<XTextEmbeddedObjectsSupplier> xEOS(rModel, UNO_QUERY);
355 2118 : const Reference<XDrawPageSupplier> xDPS(rModel, UNO_QUERY);
356 1059 : if(xTFS.is())
357 : m_pTexts.reset(new BoundFrames(
358 144 : Reference<XEnumerationAccess>(xTFS->getTextFrames(), UNO_QUERY),
359 144 : &lcl_TextContentsUnfiltered));
360 1059 : if(xGOS.is())
361 : m_pGraphics.reset(new BoundFrames(
362 144 : Reference<XEnumerationAccess>(xGOS->getGraphicObjects(), UNO_QUERY),
363 144 : &lcl_TextContentsUnfiltered));
364 1059 : if(xEOS.is())
365 : m_pEmbeddeds.reset(new BoundFrames(
366 144 : Reference<XEnumerationAccess>(xEOS->getEmbeddedObjects(), UNO_QUERY),
367 144 : &lcl_TextContentsUnfiltered));
368 1059 : if(xDPS.is())
369 : m_pShapes.reset(new BoundFrames(
370 144 : Reference<XEnumerationAccess>(xDPS->getDrawPage(), UNO_QUERY),
371 1203 : &lcl_ShapeFilter));
372 1059 : };
373 :
374 0 : void FieldParamExporter::Export()
375 : {
376 0 : const Type aStringType = ::cppu::UnoType<OUString>::get();
377 0 : const Type aBoolType = cppu::UnoType<sal_Bool>::get();
378 0 : const Type aSeqType = cppu::UnoType<Sequence<OUString>>::get();
379 0 : const Type aIntType = ::cppu::UnoType<sal_Int32>::get();
380 0 : Sequence<OUString> vParameters(m_xFieldParams->getElementNames());
381 0 : for(const OUString* pCurrent = vParameters.begin(); pCurrent != vParameters.end(); ++pCurrent)
382 : {
383 0 : const Any aValue = m_xFieldParams->getByName(*pCurrent);
384 0 : const Type aValueType = aValue.getValueType();
385 0 : if(aValueType == aStringType)
386 : {
387 0 : OUString sValue;
388 0 : aValue >>= sValue;
389 0 : ExportParameter(*pCurrent,sValue);
390 :
391 0 : if ( *pCurrent == ODF_OLE_PARAM )
392 : {
393 : // Save the OLE object
394 0 : Reference< embed::XStorage > xTargetStg = m_pExport->GetTargetStorage();
395 0 : Reference< embed::XStorage > xDstStg = xTargetStg->openStorageElement(
396 0 : "OLELinks", embed::ElementModes::WRITE );
397 :
398 0 : if ( !xDstStg->hasByName( sValue ) ) {
399 : Reference< XStorageBasedDocument > xStgDoc (
400 0 : m_pExport->GetModel( ), UNO_QUERY );
401 0 : Reference< embed::XStorage > xDocStg = xStgDoc->getDocumentStorage();
402 0 : Reference< embed::XStorage > xOleStg = xDocStg->openStorageElement(
403 0 : "OLELinks", embed::ElementModes::READ );
404 :
405 0 : xOleStg->copyElementTo( sValue, xDstStg, sValue );
406 0 : Reference< embed::XTransactedObject > xTransact( xDstStg, UNO_QUERY );
407 0 : if ( xTransact.is( ) )
408 0 : xTransact->commit( );
409 0 : }
410 0 : }
411 : }
412 0 : else if(aValueType == aBoolType)
413 : {
414 0 : bool bValue = false;
415 0 : aValue >>= bValue;
416 0 : ExportParameter(*pCurrent, OUString::boolean(bValue) );
417 : }
418 0 : else if(aValueType == aSeqType)
419 : {
420 0 : Sequence<OUString> vValue;
421 0 : aValue >>= vValue;
422 0 : for(OUString* pSeqCurrent = vValue.begin(); pSeqCurrent != vValue.end(); ++pSeqCurrent)
423 : {
424 0 : ExportParameter(*pCurrent, *pSeqCurrent);
425 0 : }
426 : }
427 0 : else if(aValueType == aIntType)
428 : {
429 0 : sal_Int32 nValue = 0;
430 0 : aValue >>= nValue;
431 0 : ExportParameter(*pCurrent, OUStringBuffer().append(nValue).makeStringAndClear());
432 : }
433 0 : }
434 0 : }
435 :
436 0 : void FieldParamExporter::ExportParameter(const OUString& sKey, const OUString& sValue)
437 : {
438 0 : m_pExport->AddAttribute(XML_NAMESPACE_FIELD, XML_NAME, sKey);
439 0 : m_pExport->AddAttribute(XML_NAMESPACE_FIELD, XML_VALUE, sValue);
440 0 : m_pExport->StartElement(XML_NAMESPACE_FIELD, XML_PARAM, false);
441 0 : m_pExport->EndElement(XML_NAMESPACE_FIELD, XML_PARAM, false);
442 0 : }
443 :
444 2111 : void XMLTextParagraphExport::Add( sal_uInt16 nFamily,
445 : const Reference < XPropertySet > & rPropSet,
446 : const XMLPropertyState** ppAddStates, bool bDontSeek )
447 : {
448 2111 : rtl::Reference < SvXMLExportPropertyMapper > xPropMapper;
449 2111 : switch( nFamily )
450 : {
451 : case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
452 169 : xPropMapper = GetParaPropMapper();
453 169 : break;
454 : case XML_STYLE_FAMILY_TEXT_TEXT:
455 1829 : xPropMapper = GetTextPropMapper();
456 1829 : break;
457 : case XML_STYLE_FAMILY_TEXT_FRAME:
458 74 : xPropMapper = GetAutoFramePropMapper();
459 74 : break;
460 : case XML_STYLE_FAMILY_TEXT_SECTION:
461 38 : xPropMapper = GetSectionPropMapper();
462 38 : break;
463 : case XML_STYLE_FAMILY_TEXT_RUBY:
464 1 : xPropMapper = GetRubyPropMapper();
465 1 : break;
466 : }
467 : DBG_ASSERT( xPropMapper.is(), "There is the property mapper?" );
468 :
469 : vector< XMLPropertyState > xPropStates =
470 2111 : xPropMapper->Filter( rPropSet );
471 :
472 2111 : if( ppAddStates )
473 : {
474 45 : while( *ppAddStates )
475 : {
476 27 : xPropStates.push_back( **ppAddStates );
477 27 : ppAddStates++;
478 : }
479 : }
480 :
481 2111 : if( !xPropStates.empty() )
482 : {
483 449 : Reference< XPropertySetInfo > xPropSetInfo(rPropSet->getPropertySetInfo());
484 898 : OUString sParent, sCondParent;
485 449 : sal_uInt16 nIgnoreProps = 0;
486 449 : switch( nFamily )
487 : {
488 : case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
489 164 : if( xPropSetInfo->hasPropertyByName( sParaStyleName ) )
490 : {
491 164 : rPropSet->getPropertyValue( sParaStyleName ) >>= sParent;
492 : }
493 164 : if( xPropSetInfo->hasPropertyByName( sParaConditionalStyleName ) )
494 : {
495 164 : rPropSet->getPropertyValue( sParaConditionalStyleName ) >>= sCondParent;
496 : }
497 164 : if( xPropSetInfo->hasPropertyByName( sNumberingRules ) )
498 : {
499 0 : Reference < XIndexReplace > xNumRule(rPropSet->getPropertyValue( sNumberingRules ), uno::UNO_QUERY);
500 0 : if( xNumRule.is() && xNumRule->getCount() )
501 : {
502 0 : Reference < XNamed > xNamed( xNumRule, UNO_QUERY );
503 0 : OUString sName;
504 0 : if( xNamed.is() )
505 0 : sName = xNamed->getName();
506 0 : bool bAdd = sName.isEmpty();
507 0 : if( !bAdd )
508 : {
509 : Reference < XPropertySet > xNumPropSet( xNumRule,
510 0 : UNO_QUERY );
511 0 : if( xNumPropSet.is() &&
512 0 : xNumPropSet->getPropertySetInfo()
513 0 : ->hasPropertyByName( "IsAutomatic" ) )
514 : {
515 0 : bAdd = *static_cast<sal_Bool const *>(xNumPropSet->getPropertyValue( "IsAutomatic" ).getValue());
516 : // Check on outline style (#i73361#)
517 0 : if ( bAdd &&
518 0 : xNumPropSet->getPropertySetInfo()
519 0 : ->hasPropertyByName( "NumberingIsOutline" ) )
520 : {
521 0 : bAdd = !(*static_cast<sal_Bool const *>(xNumPropSet->getPropertyValue( "NumberingIsOutline" ).getValue()));
522 : }
523 : }
524 : else
525 : {
526 0 : bAdd = true;
527 0 : }
528 : }
529 0 : if( bAdd )
530 0 : pListAutoPool->Add( xNumRule );
531 0 : }
532 : }
533 164 : break;
534 : case XML_STYLE_FAMILY_TEXT_TEXT:
535 : {
536 : // Get parent and remove hyperlinks (they aren't of interest)
537 172 : rtl::Reference< XMLPropertySetMapper > xPM(xPropMapper->getPropertySetMapper());
538 2423 : for( ::std::vector< XMLPropertyState >::iterator i(xPropStates.begin());
539 3374 : nIgnoreProps < 2 && i != xPropStates.end(); )
540 : {
541 953 : if( i->mnIndex == -1 )
542 : {
543 98 : ++i;
544 98 : continue;
545 : }
546 :
547 855 : switch( xPM->GetEntryContextId(i->mnIndex) )
548 : {
549 : case CTF_CHAR_STYLE_NAME:
550 : case CTF_HYPERLINK_URL:
551 2 : i->mnIndex = -1;
552 2 : nIgnoreProps++;
553 2 : i = xPropStates.erase( i );
554 2 : break;
555 : default:
556 853 : ++i;
557 853 : break;
558 : }
559 172 : }
560 : }
561 172 : break;
562 : case XML_STYLE_FAMILY_TEXT_FRAME:
563 74 : if( xPropSetInfo->hasPropertyByName( sFrameStyleName ) )
564 : {
565 74 : rPropSet->getPropertyValue( sFrameStyleName ) >>= sParent;
566 : }
567 74 : break;
568 : case XML_STYLE_FAMILY_TEXT_SECTION:
569 : case XML_STYLE_FAMILY_TEXT_RUBY:
570 : ; // section styles have no parents
571 39 : break;
572 : }
573 449 : if( (xPropStates.size() - nIgnoreProps) > 0 )
574 : {
575 449 : GetAutoStylePool().Add( nFamily, sParent, xPropStates, bDontSeek );
576 449 : if( !sCondParent.isEmpty() && sParent != sCondParent )
577 0 : GetAutoStylePool().Add( nFamily, sCondParent, xPropStates );
578 449 : }
579 2111 : }
580 2111 : }
581 :
582 967 : static bool lcl_validPropState( const XMLPropertyState& rState )
583 : {
584 967 : return rState.mnIndex != -1;
585 : }
586 :
587 279 : void XMLTextParagraphExport::Add( sal_uInt16 nFamily,
588 : MultiPropertySetHelper& rPropSetHelper,
589 : const Reference < XPropertySet > & rPropSet,
590 : const XMLPropertyState** ppAddStates)
591 : {
592 279 : rtl::Reference < SvXMLExportPropertyMapper > xPropMapper;
593 279 : switch( nFamily )
594 : {
595 : case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
596 279 : xPropMapper = GetParaPropMapper();
597 279 : break;
598 : }
599 : DBG_ASSERT( xPropMapper.is(), "There is the property mapper?" );
600 :
601 279 : vector< XMLPropertyState > xPropStates(xPropMapper->Filter( rPropSet ));
602 279 : if( ppAddStates )
603 : {
604 0 : while( *ppAddStates )
605 : {
606 0 : xPropStates.push_back( **ppAddStates );
607 0 : ++ppAddStates;
608 : }
609 : }
610 :
611 279 : if( rPropSetHelper.hasProperty( NUMBERING_RULES_AUTO ) )
612 : {
613 : Reference < XIndexReplace > xNumRule(rPropSetHelper.getValue( NUMBERING_RULES_AUTO,
614 279 : rPropSet, true ), uno::UNO_QUERY);
615 279 : if( xNumRule.is() && xNumRule->getCount() )
616 : {
617 221 : Reference < XNamed > xNamed( xNumRule, UNO_QUERY );
618 442 : OUString sName;
619 221 : if( xNamed.is() )
620 0 : sName = xNamed->getName();
621 221 : bool bAdd = sName.isEmpty();
622 221 : if( !bAdd )
623 : {
624 : Reference < XPropertySet > xNumPropSet( xNumRule,
625 0 : UNO_QUERY );
626 0 : if( xNumPropSet.is() &&
627 0 : xNumPropSet->getPropertySetInfo()
628 0 : ->hasPropertyByName( "IsAutomatic" ) )
629 : {
630 0 : bAdd = *static_cast<sal_Bool const *>(xNumPropSet->getPropertyValue( "IsAutomatic" ).getValue());
631 : // Check on outline style (#i73361#)
632 0 : if ( bAdd &&
633 0 : xNumPropSet->getPropertySetInfo()
634 0 : ->hasPropertyByName( "NumberingIsOutline" ) )
635 : {
636 0 : bAdd = !(*static_cast<sal_Bool const *>(xNumPropSet->getPropertyValue( "NumberingIsOutline" ).getValue()));
637 : }
638 : }
639 : else
640 : {
641 0 : bAdd = true;
642 0 : }
643 : }
644 221 : if( bAdd )
645 442 : pListAutoPool->Add( xNumRule );
646 279 : }
647 : }
648 :
649 279 : if( !xPropStates.empty() )
650 : {
651 170 : OUString sParent, sCondParent;
652 85 : switch( nFamily )
653 : {
654 : case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
655 85 : if( rPropSetHelper.hasProperty( PARA_STYLE_NAME_AUTO ) )
656 : {
657 : rPropSetHelper.getValue( PARA_STYLE_NAME_AUTO, rPropSet,
658 9 : true ) >>= sParent;
659 : }
660 85 : if( rPropSetHelper.hasProperty( PARA_CONDITIONAL_STYLE_NAME_AUTO ) )
661 : {
662 : rPropSetHelper.getValue( PARA_CONDITIONAL_STYLE_NAME_AUTO,
663 9 : rPropSet, true ) >>= sCondParent;
664 : }
665 :
666 85 : break;
667 : }
668 :
669 85 : if( std::any_of( xPropStates.begin(), xPropStates.end(), lcl_validPropState ) )
670 : {
671 85 : GetAutoStylePool().Add( nFamily, sParent, xPropStates );
672 85 : if( !sCondParent.isEmpty() && sParent != sCondParent )
673 0 : GetAutoStylePool().Add( nFamily, sCondParent, xPropStates );
674 85 : }
675 279 : }
676 279 : }
677 :
678 1306 : OUString XMLTextParagraphExport::Find(
679 : sal_uInt16 nFamily,
680 : const Reference < XPropertySet > & rPropSet,
681 : const OUString& rParent,
682 : const XMLPropertyState** ppAddStates) const
683 : {
684 1306 : OUString sName( rParent );
685 2612 : rtl::Reference < SvXMLExportPropertyMapper > xPropMapper;
686 1306 : switch( nFamily )
687 : {
688 : case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
689 1188 : xPropMapper = GetParaPropMapper();
690 1188 : break;
691 : case XML_STYLE_FAMILY_TEXT_FRAME:
692 74 : xPropMapper = GetAutoFramePropMapper();
693 74 : break;
694 : case XML_STYLE_FAMILY_TEXT_SECTION:
695 38 : xPropMapper = GetSectionPropMapper();
696 38 : break;
697 : case XML_STYLE_FAMILY_TEXT_RUBY:
698 6 : xPropMapper = GetRubyPropMapper();
699 6 : break;
700 : }
701 : DBG_ASSERT( xPropMapper.is(), "There is the property mapper?" );
702 1306 : if( !xPropMapper.is() )
703 0 : return sName;
704 1306 : vector< XMLPropertyState > xPropStates(xPropMapper->Filter( rPropSet ));
705 1306 : if( ppAddStates )
706 : {
707 45 : while( *ppAddStates )
708 : {
709 27 : xPropStates.push_back( **ppAddStates );
710 27 : ++ppAddStates;
711 : }
712 : }
713 1306 : if( std::any_of( xPropStates.begin(), xPropStates.end(), lcl_validPropState ) )
714 855 : sName = GetAutoStylePool().Find( nFamily, sName, xPropStates );
715 :
716 1306 : return sName;
717 : }
718 :
719 3669 : OUString XMLTextParagraphExport::FindTextStyleAndHyperlink(
720 : const Reference < XPropertySet > & rPropSet,
721 : bool& rbHyperlink,
722 : bool& rbHasCharStyle,
723 : bool& rbHasAutoStyle,
724 : const XMLPropertyState** ppAddStates ) const
725 : {
726 3669 : rtl::Reference < SvXMLExportPropertyMapper > xPropMapper(GetTextPropMapper());
727 7338 : vector< XMLPropertyState > xPropStates(xPropMapper->Filter( rPropSet ));
728 :
729 : // Get parent and remove hyperlinks (they aren't of interest)
730 3669 : OUString sName;
731 3669 : rbHyperlink = rbHasCharStyle = rbHasAutoStyle = false;
732 3669 : sal_uInt16 nIgnoreProps = 0;
733 7338 : rtl::Reference< XMLPropertySetMapper > xPM(xPropMapper->getPropertySetMapper());
734 3669 : ::std::vector< XMLPropertyState >::iterator aFirstDel = xPropStates.end();
735 3669 : ::std::vector< XMLPropertyState >::iterator aSecondDel = xPropStates.end();
736 :
737 15463 : for( ::std::vector< XMLPropertyState >::iterator
738 3669 : i = xPropStates.begin();
739 15425 : nIgnoreProps < 2 && i != xPropStates.end();
740 : ++i )
741 : {
742 1479 : if( i->mnIndex == -1 )
743 91 : continue;
744 :
745 1388 : switch( xPM->GetEntryContextId(i->mnIndex) )
746 : {
747 : case CTF_CHAR_STYLE_NAME:
748 20 : i->maValue >>= sName;
749 20 : i->mnIndex = -1;
750 20 : rbHasCharStyle = !sName.isEmpty();
751 20 : if( nIgnoreProps )
752 19 : aSecondDel = i;
753 : else
754 1 : aFirstDel = i;
755 20 : nIgnoreProps++;
756 20 : break;
757 : case CTF_HYPERLINK_URL:
758 19 : rbHyperlink = true;
759 19 : i->mnIndex = -1;
760 19 : if( nIgnoreProps )
761 0 : aSecondDel = i;
762 : else
763 19 : aFirstDel = i;
764 19 : nIgnoreProps++;
765 19 : break;
766 : }
767 : }
768 3669 : if( ppAddStates )
769 : {
770 0 : while( *ppAddStates )
771 : {
772 0 : xPropStates.push_back( **ppAddStates );
773 0 : ppAddStates++;
774 : }
775 : }
776 3669 : if( (xPropStates.size() - nIgnoreProps) > 0L )
777 : {
778 : // erase the character style, otherwise the autostyle cannot be found!
779 : // erase the hyperlink, otherwise the autostyle cannot be found!
780 264 : if ( nIgnoreProps )
781 : {
782 : // If two elements of a vector have to be deleted,
783 : // we should delete the second one first.
784 14 : if( --nIgnoreProps )
785 14 : xPropStates.erase( aSecondDel );
786 14 : xPropStates.erase( aFirstDel );
787 : }
788 264 : OUString sParent; // AutoStyles should not have parents!
789 264 : sName = GetAutoStylePool().Find( XML_STYLE_FAMILY_TEXT_TEXT, sParent, xPropStates );
790 264 : rbHasAutoStyle = true;
791 : }
792 :
793 7338 : return sName;
794 : }
795 :
796 : // adjustments to support lists independent from list style
797 2002 : void XMLTextParagraphExport::exportListChange(
798 : const XMLTextNumRuleInfo& rPrevInfo,
799 : const XMLTextNumRuleInfo& rNextInfo )
800 : {
801 : // end a list
802 2002 : if ( rPrevInfo.GetLevel() > 0 )
803 : {
804 34 : sal_Int16 nListLevelsToBeClosed = 0;
805 53 : if ( !rNextInfo.BelongsToSameList( rPrevInfo ) ||
806 19 : rNextInfo.GetLevel() <= 0 )
807 : {
808 : // close complete previous list
809 15 : nListLevelsToBeClosed = rPrevInfo.GetLevel();
810 : }
811 19 : else if ( rPrevInfo.GetLevel() > rNextInfo.GetLevel() )
812 : {
813 : // close corresponding sub lists
814 : DBG_ASSERT( rNextInfo.GetLevel() > 0,
815 : "<rPrevInfo.GetLevel() > 0> not hold. Serious defect -> please inform OD." );
816 0 : nListLevelsToBeClosed = rPrevInfo.GetLevel() - rNextInfo.GetLevel();
817 : }
818 :
819 49 : if ( nListLevelsToBeClosed > 0 &&
820 49 : pListElements &&
821 15 : pListElements->size() >= sal::static_int_cast< sal_uInt32 >( 2 * nListLevelsToBeClosed ) )
822 : {
823 15 : do {
824 45 : for(size_t j = 0; j < 2; ++j)
825 : {
826 30 : OUString aElem(pListElements->back());
827 30 : pListElements->pop_back();
828 30 : GetExport().EndElement(aElem, true);
829 30 : }
830 :
831 : // remove closed list from list stack
832 15 : mpTextListsHelper->PopListFromStack();
833 :
834 15 : --nListLevelsToBeClosed;
835 : } while ( nListLevelsToBeClosed > 0 );
836 : }
837 : }
838 :
839 : const bool bExportODF =
840 2002 : bool( GetExport().getExportFlags() & SvXMLExportFlags::OASIS );
841 : const SvtSaveOptions::ODFDefaultVersion eODFDefaultVersion =
842 2002 : GetExport().getDefaultVersion();
843 :
844 : // start a new list
845 2002 : if ( rNextInfo.GetLevel() > 0 )
846 : {
847 34 : bool bRootListToBeStarted = false;
848 34 : sal_Int16 nListLevelsToBeOpened = 0;
849 53 : if ( !rPrevInfo.BelongsToSameList( rNextInfo ) ||
850 19 : rPrevInfo.GetLevel() <= 0 )
851 : {
852 : // new root list
853 15 : bRootListToBeStarted = true;
854 15 : nListLevelsToBeOpened = rNextInfo.GetLevel();
855 : }
856 19 : else if ( rNextInfo.GetLevel() > rPrevInfo.GetLevel() )
857 : {
858 : // open corresponding sub lists
859 : DBG_ASSERT( rPrevInfo.GetLevel() > 0,
860 : "<rPrevInfo.GetLevel() > 0> not hold. Serious defect -> please inform OD." );
861 0 : nListLevelsToBeOpened = rNextInfo.GetLevel() - rPrevInfo.GetLevel();
862 : }
863 :
864 34 : if ( nListLevelsToBeOpened > 0 )
865 : {
866 15 : const OUString sListStyleName( rNextInfo.GetNumRulesName() );
867 : // Currently only the text documents support <ListId>.
868 : // Thus, for other document types <sListId> is empty.
869 30 : const OUString sListId( rNextInfo.GetListId() );
870 15 : bool bExportListStyle( true );
871 15 : bool bRestartNumberingAtContinuedList( false );
872 15 : sal_Int32 nRestartValueForContinuedList( -1 );
873 15 : bool bContinueingPreviousSubList = !bRootListToBeStarted &&
874 15 : rNextInfo.IsContinueingPreviousSubTree();
875 15 : do {
876 15 : GetExport().CheckAttrList();
877 :
878 15 : if ( bRootListToBeStarted )
879 : {
880 15 : if ( !mpTextListsHelper->IsListProcessed( sListId ) )
881 : {
882 9 : if ( bExportODF &&
883 9 : eODFDefaultVersion >= SvtSaveOptions::ODFVER_012 &&
884 1 : !sListId.isEmpty() )
885 : {
886 : /* Property text:id at element <text:list> has to be
887 : replaced by property xml:id (#i92221#)
888 : */
889 1 : GetExport().AddAttribute( XML_NAMESPACE_XML,
890 : XML_ID,
891 1 : sListId );
892 : }
893 : mpTextListsHelper->KeepListAsProcessed( sListId,
894 : sListStyleName,
895 8 : OUString() );
896 : }
897 : else
898 : {
899 : const OUString sNewListId(
900 7 : mpTextListsHelper->GenerateNewListId() );
901 7 : if ( bExportODF &&
902 7 : eODFDefaultVersion >= SvtSaveOptions::ODFVER_012 &&
903 0 : !sListId.isEmpty() )
904 : {
905 : /* Property text:id at element <text:list> has to be
906 : replaced by property xml:id (#i92221#)
907 : */
908 0 : GetExport().AddAttribute( XML_NAMESPACE_XML,
909 : XML_ID,
910 0 : sNewListId );
911 : }
912 :
913 : const OUString sContinueListId =
914 14 : mpTextListsHelper->GetLastContinuingListId( sListId );
915 : // store that list with list id <sNewListId> is last list,
916 : // which has continued list with list id <sListId>
917 : mpTextListsHelper->StoreLastContinuingList( sListId,
918 7 : sNewListId );
919 14 : if ( sListStyleName ==
920 12 : mpTextListsHelper->GetListStyleOfLastProcessedList() &&
921 : // Inconsistent behavior regarding lists (#i92811#)
922 5 : sContinueListId ==
923 12 : mpTextListsHelper->GetLastProcessedListId() &&
924 5 : !rNextInfo.IsRestart() )
925 : {
926 5 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
927 : XML_CONTINUE_NUMBERING,
928 5 : XML_TRUE );
929 : }
930 : else
931 : {
932 2 : if ( bExportODF &&
933 2 : eODFDefaultVersion >= SvtSaveOptions::ODFVER_012 &&
934 0 : !sListId.isEmpty() )
935 : {
936 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
937 : XML_CONTINUE_LIST,
938 0 : sContinueListId );
939 : }
940 :
941 2 : if ( rNextInfo.IsRestart() &&
942 0 : ( nListLevelsToBeOpened != 1 ||
943 0 : !rNextInfo.HasStartValue() ) )
944 : {
945 0 : bRestartNumberingAtContinuedList = true;
946 : nRestartValueForContinuedList =
947 0 : rNextInfo.GetListLevelStartValue();
948 : }
949 : }
950 :
951 : mpTextListsHelper->KeepListAsProcessed( sNewListId,
952 : sListStyleName,
953 14 : sContinueListId );
954 : }
955 :
956 15 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_STYLE_NAME,
957 30 : GetExport().EncodeStyleName( sListStyleName ) );
958 15 : bExportListStyle = false;
959 :
960 15 : bRootListToBeStarted = false;
961 : }
962 0 : else if ( bExportListStyle &&
963 0 : !mpTextListsHelper->EqualsToTopListStyleOnStack( sListStyleName ) )
964 : {
965 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_STYLE_NAME,
966 0 : GetExport().EncodeStyleName( sListStyleName ) );
967 0 : bExportListStyle = false;
968 :
969 : }
970 : else
971 : {
972 : // rhbz#746174: also export list restart for non root list
973 0 : if (rNextInfo.IsRestart() && !rNextInfo.HasStartValue())
974 : {
975 0 : bRestartNumberingAtContinuedList = true;
976 : nRestartValueForContinuedList =
977 0 : rNextInfo.GetListLevelStartValue();
978 : }
979 : }
980 :
981 15 : if ( bContinueingPreviousSubList )
982 : {
983 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
984 0 : XML_CONTINUE_NUMBERING, XML_TRUE );
985 0 : bContinueingPreviousSubList = false;
986 : }
987 :
988 15 : enum XMLTokenEnum eLName = XML_LIST;
989 :
990 15 : OUString aElem(GetExport().GetNamespaceMap().GetQNameByKey(
991 : XML_NAMESPACE_TEXT,
992 30 : GetXMLToken(eLName) ) );
993 15 : GetExport().IgnorableWhitespace();
994 15 : GetExport().StartElement(aElem, false);
995 :
996 15 : if(!pListElements)
997 2 : pListElements = new std::vector<OUString>;
998 15 : pListElements->push_back(aElem);
999 :
1000 : mpTextListsHelper->PushListOnStack( sListId,
1001 15 : sListStyleName );
1002 :
1003 : // <text:list-header> or <text:list-item>
1004 15 : GetExport().CheckAttrList();
1005 :
1006 : /* Export start value at correct list item (#i97309#) */
1007 15 : if ( nListLevelsToBeOpened == 1 )
1008 : {
1009 15 : if ( rNextInfo.HasStartValue() )
1010 : {
1011 0 : OUStringBuffer aBuffer;
1012 0 : aBuffer.append( (sal_Int32)rNextInfo.GetStartValue() );
1013 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_START_VALUE,
1014 0 : aBuffer.makeStringAndClear() );
1015 : }
1016 15 : else if (bRestartNumberingAtContinuedList)
1017 : {
1018 0 : OUStringBuffer aBuffer;
1019 0 : aBuffer.append( nRestartValueForContinuedList );
1020 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
1021 : XML_START_VALUE,
1022 0 : aBuffer.makeStringAndClear() );
1023 0 : bRestartNumberingAtContinuedList = false;
1024 : }
1025 : }
1026 :
1027 15 : eLName = ( rNextInfo.IsNumbered() || nListLevelsToBeOpened > 1 )
1028 : ? XML_LIST_ITEM
1029 30 : : XML_LIST_HEADER;
1030 30 : aElem = OUString( GetExport().GetNamespaceMap().GetQNameByKey(
1031 : XML_NAMESPACE_TEXT,
1032 30 : GetXMLToken(eLName) ) );
1033 15 : GetExport().IgnorableWhitespace();
1034 15 : GetExport().StartElement(aElem, false);
1035 15 : pListElements->push_back(aElem);
1036 :
1037 : // export of <text:number> element for last opened <text:list-item>, if requested
1038 30 : if ( GetExport().exportTextNumberElement() &&
1039 15 : eLName == XML_LIST_ITEM && nListLevelsToBeOpened == 1 && // last iteration --> last opened <text:list-item>
1040 0 : !rNextInfo.ListLabelString().isEmpty() )
1041 : {
1042 : const OUString aTextNumberElem =
1043 0 : OUString( GetExport().GetNamespaceMap().GetQNameByKey(
1044 : XML_NAMESPACE_TEXT,
1045 0 : GetXMLToken(XML_NUMBER) ) );
1046 0 : GetExport().IgnorableWhitespace();
1047 0 : GetExport().StartElement( aTextNumberElem, false );
1048 0 : GetExport().Characters( rNextInfo.ListLabelString() );
1049 0 : GetExport().EndElement( aTextNumberElem, true );
1050 : }
1051 15 : --nListLevelsToBeOpened;
1052 15 : } while ( nListLevelsToBeOpened > 0 );
1053 : }
1054 : }
1055 :
1056 2002 : bool bEndElement = false;
1057 :
1058 4038 : if ( rNextInfo.GetLevel() > 0 &&
1059 68 : rNextInfo.IsNumbered() &&
1060 2055 : rPrevInfo.BelongsToSameList( rNextInfo ) &&
1061 19 : rPrevInfo.GetLevel() >= rNextInfo.GetLevel() )
1062 : {
1063 : assert(pListElements && pListElements->size() >= 2 && "list elements missing");
1064 19 : bEndElement = pListElements && pListElements->size() >= 2;
1065 : }
1066 :
1067 2002 : if (bEndElement)
1068 : {
1069 : // close previous list-item
1070 19 : GetExport().EndElement(pListElements->back(), true );
1071 19 : pListElements->pop_back();
1072 :
1073 : // Only for sub lists (#i103745#)
1074 19 : if ( rNextInfo.IsRestart() && !rNextInfo.HasStartValue() &&
1075 0 : rNextInfo.GetLevel() != 1 )
1076 : {
1077 : // start new sub list respectively list on same list level
1078 0 : GetExport().EndElement(pListElements->back(), true );
1079 0 : GetExport().IgnorableWhitespace();
1080 0 : GetExport().StartElement(pListElements->back(), false);
1081 : }
1082 :
1083 : // open new list-item
1084 19 : GetExport().CheckAttrList();
1085 19 : if( rNextInfo.HasStartValue() )
1086 : {
1087 0 : OUStringBuffer aBuffer;
1088 0 : aBuffer.append( (sal_Int32)rNextInfo.GetStartValue() );
1089 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_START_VALUE,
1090 0 : aBuffer.makeStringAndClear() );
1091 : }
1092 : // Handle restart without start value on list level 1 (#i103745#)
1093 19 : else if ( rNextInfo.IsRestart() && /*!rNextInfo.HasStartValue() &&*/
1094 0 : rNextInfo.GetLevel() == 1 )
1095 : {
1096 0 : OUStringBuffer aBuffer;
1097 0 : aBuffer.append( (sal_Int32)rNextInfo.GetListLevelStartValue() );
1098 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_START_VALUE,
1099 0 : aBuffer.makeStringAndClear() );
1100 : }
1101 39 : if ( ( GetExport().getExportFlags() & SvXMLExportFlags::OASIS ) &&
1102 20 : GetExport().getDefaultVersion() >= SvtSaveOptions::ODFVER_012 )
1103 : {
1104 1 : const OUString sListStyleName( rNextInfo.GetNumRulesName() );
1105 1 : if ( !mpTextListsHelper->EqualsToTopListStyleOnStack( sListStyleName ) )
1106 : {
1107 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
1108 : XML_STYLE_OVERRIDE,
1109 0 : GetExport().EncodeStyleName( sListStyleName ) );
1110 1 : }
1111 : }
1112 19 : OUString aElem( GetExport().GetNamespaceMap().GetQNameByKey(
1113 : XML_NAMESPACE_TEXT,
1114 38 : GetXMLToken(XML_LIST_ITEM) ) );
1115 19 : GetExport().IgnorableWhitespace();
1116 19 : GetExport().StartElement(aElem, false );
1117 19 : pListElements->push_back(aElem);
1118 :
1119 : // export of <text:number> element for <text:list-item>, if requested
1120 19 : if ( GetExport().exportTextNumberElement() &&
1121 0 : !rNextInfo.ListLabelString().isEmpty() )
1122 : {
1123 : const OUString aTextNumberElem =
1124 0 : OUString( GetExport().GetNamespaceMap().GetQNameByKey(
1125 : XML_NAMESPACE_TEXT,
1126 0 : GetXMLToken(XML_NUMBER) ) );
1127 0 : GetExport().IgnorableWhitespace();
1128 0 : GetExport().StartElement( aTextNumberElem, false );
1129 0 : GetExport().Characters( rNextInfo.ListLabelString() );
1130 0 : GetExport().EndElement( aTextNumberElem, true );
1131 19 : }
1132 : }
1133 2002 : }
1134 :
1135 1059 : struct XMLTextParagraphExport::Impl
1136 : {
1137 : typedef ::std::map<Reference<XFormField>, sal_Int32> FieldMarkMap_t;
1138 : FieldMarkMap_t m_FieldMarkMap;
1139 :
1140 1059 : explicit Impl() {}
1141 0 : sal_Int32 AddFieldMarkStart(Reference<XFormField> const& i_xFieldMark)
1142 : {
1143 : assert(m_FieldMarkMap.find(i_xFieldMark) == m_FieldMarkMap.end());
1144 0 : sal_Int32 const ret(m_FieldMarkMap.size());
1145 0 : m_FieldMarkMap.insert(::std::make_pair(i_xFieldMark, ret));
1146 0 : return ret;
1147 : }
1148 0 : sal_Int32 GetFieldMarkIndex(Reference<XFormField> const& i_xFieldMark)
1149 : {
1150 : FieldMarkMap_t::const_iterator const it(
1151 0 : m_FieldMarkMap.find(i_xFieldMark));
1152 : // rely on SwXFieldmark::CreateXFieldmark returning the same instance
1153 : // because the Reference in m_FieldMarkMap will keep it alive
1154 : assert(it != m_FieldMarkMap.end());
1155 0 : return it->second;
1156 : }
1157 : };
1158 :
1159 1059 : XMLTextParagraphExport::XMLTextParagraphExport(
1160 : SvXMLExport& rExp,
1161 : SvXMLAutoStylePoolP & rASP
1162 : ) :
1163 : XMLStyleExport( rExp, OUString(), &rASP ),
1164 1059 : m_xImpl(new Impl),
1165 : rAutoStylePool( rASP ),
1166 2118 : pBoundFrameSets(new BoundFrameSets(GetExport().GetModel())),
1167 : pFieldExport( 0 ),
1168 : pListElements( 0 ),
1169 2118 : pListAutoPool( new XMLTextListAutoStylePool( this->GetExport() ) ),
1170 : pSectionExport( NULL ),
1171 : pIndexMarkExport( NULL ),
1172 : pRedlineExport( NULL ),
1173 : pHeadingStyles( NULL ),
1174 : bProgress( false ),
1175 : bBlock( false ),
1176 : bOpenRuby( false ),
1177 : mpTextListsHelper( 0 ),
1178 : maTextListsHelperStack(),
1179 : sActualSize("ActualSize"),
1180 : // Implement Title/Description Elements UI (#i73249#)
1181 : sTitle("Title"),
1182 : sDescription("Description"),
1183 : sAnchorCharStyleName("AnchorCharStyleName"),
1184 : sAnchorPageNo("AnchorPageNo"),
1185 : sAnchorType("AnchorType"),
1186 : sBeginNotice("BeginNotice"),
1187 : sBookmark("Bookmark"),
1188 : sCategory("Category"),
1189 : sChainNextName("ChainNextName"),
1190 : sCharStyleName("CharStyleName"),
1191 : sCharStyleNames("CharStyleNames"),
1192 : sContourPolyPolygon("ContourPolyPolygon"),
1193 : sDocumentIndex("DocumentIndex"),
1194 : sDocumentIndexMark("DocumentIndexMark"),
1195 : sEndNotice("EndNotice"),
1196 : sFootnote("Footnote"),
1197 : sFootnoteCounting("FootnoteCounting"),
1198 : sFrame("Frame"),
1199 : sFrameHeightAbsolute("FrameHeightAbsolute"),
1200 : sFrameHeightPercent("FrameHeightPercent"),
1201 : sFrameStyleName("FrameStyleName"),
1202 : sFrameWidthAbsolute("FrameWidthAbsolute"),
1203 : sFrameWidthPercent("FrameWidthPercent"),
1204 : sGraphicFilter("GraphicFilter"),
1205 : sGraphicRotation("GraphicRotation"),
1206 : sGraphicURL("GraphicURL"),
1207 : sReplacementGraphicURL("ReplacementGraphicURL"),
1208 : sHeight("Height"),
1209 : sHoriOrient("HoriOrient"),
1210 : sHoriOrientPosition("HoriOrientPosition"),
1211 : sHyperLinkName("HyperLinkName"),
1212 : sHyperLinkTarget("HyperLinkTarget"),
1213 : sHyperLinkURL("HyperLinkURL"),
1214 : sIsAutomaticContour("IsAutomaticContour"),
1215 : sIsCollapsed("IsCollapsed"),
1216 : sIsPixelContour("IsPixelContour"),
1217 : sIsStart("IsStart"),
1218 : sIsSyncHeightToWidth("IsSyncHeightToWidth"),
1219 : sIsSyncWidthToHeight("IsSyncWidthToHeight"),
1220 : sNumberingRules("NumberingRules"),
1221 : sNumberingType("NumberingType"),
1222 : sPageDescName("PageDescName"),
1223 : sPageStyleName("PageStyleName"),
1224 : sParaChapterNumberingLevel("ParaChapterNumberingLevel"),
1225 : sParaConditionalStyleName("ParaConditionalStyleName"),
1226 : sParagraphService("com.sun.star.text.Paragraph"),
1227 : sParaStyleName("ParaStyleName"),
1228 : sPositionEndOfDoc("PositionEndOfDoc"),
1229 : sPrefix("Prefix"),
1230 : sRedline("Redline"),
1231 : sReferenceId("ReferenceId"),
1232 : sReferenceMark("ReferenceMark"),
1233 : sRelativeHeight("RelativeHeight"),
1234 : sRelativeWidth("RelativeWidth"),
1235 : sRuby("Ruby"),
1236 : sRubyAdjust("RubyAdjust"),
1237 : sRubyCharStyleName("RubyCharStyleName"),
1238 : sRubyText("RubyText"),
1239 : sServerMap("ServerMap"),
1240 : sShapeService("com.sun.star.drawing.Shape"),
1241 : sSizeType("SizeType"),
1242 : sSoftPageBreak( "SoftPageBreak" ),
1243 : sStartAt("StartAt"),
1244 : sSuffix("Suffix"),
1245 : sTableService("com.sun.star.text.TextTable"),
1246 : sText("Text"),
1247 : sTextContentService("com.sun.star.text.TextContent"),
1248 : sTextEmbeddedService("com.sun.star.text.TextEmbeddedObject"),
1249 : sTextEndnoteService("com.sun.star.text.Endnote"),
1250 : sTextField("TextField"),
1251 : sTextFieldService("com.sun.star.text.TextField"),
1252 : sTextFrameService("com.sun.star.text.TextFrame"),
1253 : sTextGraphicService("com.sun.star.text.TextGraphicObject"),
1254 : sTextPortionType("TextPortionType"),
1255 : sTextSection("TextSection"),
1256 : sUnvisitedCharStyleName("UnvisitedCharStyleName"),
1257 : sVertOrient("VertOrient"),
1258 : sVertOrientPosition("VertOrientPosition"),
1259 : sVisitedCharStyleName("VisitedCharStyleName"),
1260 : sWidth("Width"),
1261 : sWidthType( "WidthType" ),
1262 : sTextFieldStart( "TextFieldStart" ),
1263 : sTextFieldEnd( "TextFieldEnd" ),
1264 : sTextFieldStartEnd( "TextFieldStartEnd" ),
1265 6354 : aCharStyleNamesPropInfoCache( sCharStyleNames )
1266 : {
1267 1059 : rtl::Reference < XMLPropertySetMapper > xPropMapper(new XMLTextPropertySetMapper( TextPropMap::PARA, true ));
1268 2118 : xParaPropMapper = new XMLTextExportPropertySetMapper( xPropMapper,
1269 3177 : GetExport() );
1270 :
1271 2118 : OUString sFamily( GetXMLToken(XML_PARAGRAPH) );
1272 2118 : OUString aPrefix(static_cast<sal_Unicode>('P'));
1273 : rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_PARAGRAPH, sFamily,
1274 1059 : xParaPropMapper, aPrefix );
1275 :
1276 1059 : xPropMapper = new XMLTextPropertySetMapper( TextPropMap::TEXT, true );
1277 2118 : xTextPropMapper = new XMLTextExportPropertySetMapper( xPropMapper,
1278 3177 : GetExport() );
1279 1059 : sFamily = GetXMLToken(XML_TEXT);
1280 1059 : aPrefix = "T";
1281 : rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_TEXT, sFamily,
1282 1059 : xTextPropMapper, aPrefix );
1283 :
1284 1059 : xPropMapper = new XMLTextPropertySetMapper( TextPropMap::AUTO_FRAME, true );
1285 2118 : xAutoFramePropMapper = new XMLTextExportPropertySetMapper( xPropMapper,
1286 3177 : GetExport() );
1287 1059 : sFamily = XML_STYLE_FAMILY_SD_GRAPHICS_NAME;
1288 1059 : aPrefix = "fr";
1289 : rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_FRAME, sFamily,
1290 1059 : xAutoFramePropMapper, aPrefix );
1291 :
1292 1059 : xPropMapper = new XMLTextPropertySetMapper( TextPropMap::SECTION, true );
1293 2118 : xSectionPropMapper = new XMLTextExportPropertySetMapper( xPropMapper,
1294 3177 : GetExport() );
1295 1059 : sFamily = GetXMLToken( XML_SECTION );
1296 1059 : aPrefix = "Sect" ;
1297 : rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_SECTION, sFamily,
1298 1059 : xSectionPropMapper, aPrefix );
1299 :
1300 1059 : xPropMapper = new XMLTextPropertySetMapper( TextPropMap::RUBY, true );
1301 1059 : xRubyPropMapper = new SvXMLExportPropertyMapper( xPropMapper );
1302 1059 : sFamily = GetXMLToken( XML_RUBY );
1303 1059 : aPrefix = "Ru";
1304 : rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_RUBY, sFamily,
1305 1059 : xRubyPropMapper, aPrefix );
1306 :
1307 1059 : xPropMapper = new XMLTextPropertySetMapper( TextPropMap::FRAME, true );
1308 2118 : xFramePropMapper = new XMLTextExportPropertySetMapper( xPropMapper,
1309 3177 : GetExport() );
1310 :
1311 1059 : pSectionExport = new XMLSectionExport( rExp, *this );
1312 1059 : pIndexMarkExport = new XMLIndexMarkExport( rExp );
1313 :
1314 4236 : if( ! IsBlockMode() &&
1315 4236 : Reference<XRedlinesSupplier>( GetExport().GetModel(), UNO_QUERY ).is())
1316 144 : pRedlineExport = new XMLRedlineExport( rExp );
1317 :
1318 : // The text field helper needs a pre-constructed XMLPropertyState
1319 : // to export the combined characters field. We construct that
1320 : // here, because we need the text property mapper to do it.
1321 :
1322 : // construct Any value, then find index
1323 1059 : sal_Int32 nIndex = xTextPropMapper->getPropertySetMapper()->FindEntryIndex(
1324 : "", XML_NAMESPACE_STYLE,
1325 2118 : GetXMLToken(XML_TEXT_COMBINE));
1326 1059 : pFieldExport = new XMLTextFieldExport( rExp, new XMLPropertyState( nIndex, uno::makeAny(sal_True) ) );
1327 2118 : PushNewTextListsHelper();
1328 1059 : }
1329 :
1330 3033 : XMLTextParagraphExport::~XMLTextParagraphExport()
1331 : {
1332 1059 : delete pHeadingStyles;
1333 1059 : delete pRedlineExport;
1334 1059 : delete pIndexMarkExport;
1335 1059 : delete pSectionExport;
1336 1059 : delete pFieldExport;
1337 1059 : delete pListElements;
1338 1059 : delete pListAutoPool;
1339 : #ifdef DBG_UTIL
1340 : txtparae_bContainsIllegalCharacters = false;
1341 : #endif
1342 1059 : PopTextListsHelper();
1343 : DBG_ASSERT( maTextListsHelperStack.empty(),
1344 : "misusage of text lists helper stack - it is not empty. Serious defect - please inform OD" );
1345 1974 : }
1346 :
1347 144 : SvXMLExportPropertyMapper *XMLTextParagraphExport::CreateShapeExtPropMapper(
1348 : SvXMLExport& rExport )
1349 : {
1350 : rtl::Reference < XMLPropertySetMapper > xPropMapper =
1351 144 : new XMLTextPropertySetMapper( TextPropMap::SHAPE, true );
1352 144 : return new XMLTextExportPropertySetMapper( xPropMapper, rExport );
1353 : }
1354 :
1355 29 : SvXMLExportPropertyMapper *XMLTextParagraphExport::CreateCharExtPropMapper(
1356 : SvXMLExport& rExport)
1357 : {
1358 : XMLPropertySetMapper *pPropMapper =
1359 29 : new XMLTextPropertySetMapper( TextPropMap::TEXT, true );
1360 29 : return new XMLTextExportPropertySetMapper( pPropMapper, rExport );
1361 : }
1362 :
1363 1590 : SvXMLExportPropertyMapper *XMLTextParagraphExport::CreateParaExtPropMapper(
1364 : SvXMLExport& rExport)
1365 : {
1366 : XMLPropertySetMapper *pPropMapper =
1367 1590 : new XMLTextPropertySetMapper( TextPropMap::SHAPE_PARA, true );
1368 1590 : return new XMLTextExportPropertySetMapper( pPropMapper, rExport );
1369 : }
1370 :
1371 99 : SvXMLExportPropertyMapper *XMLTextParagraphExport::CreateParaDefaultExtPropMapper(
1372 : SvXMLExport& rExport)
1373 : {
1374 : XMLPropertySetMapper *pPropMapper =
1375 99 : new XMLTextPropertySetMapper( TextPropMap::TEXT_ADDITIONAL_DEFAULTS, true );
1376 99 : return new XMLTextExportPropertySetMapper( pPropMapper, rExport );
1377 : }
1378 :
1379 73 : void XMLTextParagraphExport::exportPageFrames( bool bAutoStyles,
1380 : bool bIsProgress )
1381 : {
1382 73 : const TextContentSet& rTexts = pBoundFrameSets->GetTexts()->GetPageBoundContents();
1383 73 : const TextContentSet& rGraphics = pBoundFrameSets->GetGraphics()->GetPageBoundContents();
1384 73 : const TextContentSet& rEmbeddeds = pBoundFrameSets->GetEmbeddeds()->GetPageBoundContents();
1385 73 : const TextContentSet& rShapes = pBoundFrameSets->GetShapes()->GetPageBoundContents();
1386 228 : for(TextContentSet::const_iterator_t it = rTexts.getBegin();
1387 152 : it != rTexts.getEnd();
1388 : ++it)
1389 3 : exportTextFrame(*it, bAutoStyles, bIsProgress, true);
1390 219 : for(TextContentSet::const_iterator_t it = rGraphics.getBegin();
1391 146 : it != rGraphics.getEnd();
1392 : ++it)
1393 0 : exportTextGraphic(*it, bAutoStyles);
1394 219 : for(TextContentSet::const_iterator_t it = rEmbeddeds.getBegin();
1395 146 : it != rEmbeddeds.getEnd();
1396 : ++it)
1397 0 : exportTextEmbedded(*it, bAutoStyles);
1398 225 : for(TextContentSet::const_iterator_t it = rShapes.getBegin();
1399 150 : it != rShapes.getEnd();
1400 : ++it)
1401 2 : exportShape(*it, bAutoStyles);
1402 73 : }
1403 :
1404 59 : void XMLTextParagraphExport::exportFrameFrames(
1405 : bool bAutoStyles,
1406 : bool bIsProgress,
1407 : const Reference < XTextFrame > *pParentTxtFrame )
1408 : {
1409 59 : const TextContentSet* const pTexts = pBoundFrameSets->GetTexts()->GetFrameBoundContents(*pParentTxtFrame);
1410 59 : if(pTexts)
1411 0 : for(TextContentSet::const_iterator_t it = pTexts->getBegin();
1412 0 : it != pTexts->getEnd();
1413 : ++it)
1414 0 : exportTextFrame(*it, bAutoStyles, bIsProgress, true);
1415 59 : const TextContentSet* const pGraphics = pBoundFrameSets->GetGraphics()->GetFrameBoundContents(*pParentTxtFrame);
1416 59 : if(pGraphics)
1417 0 : for(TextContentSet::const_iterator_t it = pGraphics->getBegin();
1418 0 : it != pGraphics->getEnd();
1419 : ++it)
1420 0 : exportTextGraphic(*it, bAutoStyles);
1421 59 : const TextContentSet* const pEmbeddeds = pBoundFrameSets->GetEmbeddeds()->GetFrameBoundContents(*pParentTxtFrame);
1422 59 : if(pEmbeddeds)
1423 0 : for(TextContentSet::const_iterator_t it = pEmbeddeds->getBegin();
1424 0 : it != pEmbeddeds->getEnd();
1425 : ++it)
1426 0 : exportTextEmbedded(*it, bAutoStyles);
1427 59 : const TextContentSet* const pShapes = pBoundFrameSets->GetShapes()->GetFrameBoundContents(*pParentTxtFrame);
1428 59 : if(pShapes)
1429 0 : for(TextContentSet::const_iterator_t it = pShapes->getBegin();
1430 0 : it != pShapes->getEnd();
1431 : ++it)
1432 0 : exportShape(*it, bAutoStyles);
1433 59 : }
1434 :
1435 : // bookmarks, reference marks (and TOC marks) are the same except for the
1436 : // element names. We use the same method for export and it an array with
1437 : // the proper element names
1438 : static const enum XMLTokenEnum lcl_XmlReferenceElements[] = {
1439 : XML_REFERENCE_MARK, XML_REFERENCE_MARK_START, XML_REFERENCE_MARK_END };
1440 : static const enum XMLTokenEnum lcl_XmlBookmarkElements[] = {
1441 : XML_BOOKMARK, XML_BOOKMARK_START, XML_BOOKMARK_END };
1442 :
1443 : // This function replaces the text portion iteration during auto style
1444 : // collection.
1445 73 : bool XMLTextParagraphExport::collectTextAutoStylesOptimized( bool bIsProgress )
1446 : {
1447 73 : GetExport().GetShapeExport(); // make sure the graphics styles family is added
1448 :
1449 73 : const bool bAutoStyles = true;
1450 73 : const bool bExportContent = false;
1451 :
1452 : // Export AutoStyles:
1453 73 : Reference< XAutoStylesSupplier > xAutoStylesSupp( GetExport().GetModel(), UNO_QUERY );
1454 73 : if ( xAutoStylesSupp.is() )
1455 : {
1456 73 : Reference< XAutoStyles > xAutoStyleFamilies = xAutoStylesSupp->getAutoStyles();
1457 146 : OUString sName;
1458 : sal_uInt16 nFamily;
1459 :
1460 292 : for ( int i = 0; i < 3; ++i )
1461 : {
1462 219 : if ( 0 == i )
1463 : {
1464 73 : sName = "CharacterStyles" ;
1465 73 : nFamily = XML_STYLE_FAMILY_TEXT_TEXT;
1466 : }
1467 146 : else if ( 1 == i )
1468 : {
1469 73 : sName = "RubyStyles" ;
1470 73 : nFamily = XML_STYLE_FAMILY_TEXT_RUBY;
1471 : }
1472 : else
1473 : {
1474 73 : sName = "ParagraphStyles" ;
1475 73 : nFamily = XML_STYLE_FAMILY_TEXT_PARAGRAPH;
1476 : }
1477 :
1478 219 : Any aAny = xAutoStyleFamilies->getByName( sName );
1479 438 : Reference< XAutoStyleFamily > xAutoStyles = *static_cast<Reference<XAutoStyleFamily> const *>(aAny.getValue());
1480 438 : Reference < XEnumeration > xAutoStylesEnum( xAutoStyles->createEnumeration() );
1481 :
1482 699 : while ( xAutoStylesEnum->hasMoreElements() )
1483 : {
1484 261 : aAny = xAutoStylesEnum->nextElement();
1485 261 : Reference< XAutoStyle > xAutoStyle = *static_cast<Reference<XAutoStyle> const *>(aAny.getValue());
1486 522 : Reference < XPropertySet > xPSet( xAutoStyle, uno::UNO_QUERY );
1487 261 : Add( nFamily, xPSet, 0, true );
1488 261 : }
1489 292 : }
1490 : }
1491 :
1492 : // Export Field AutoStyles:
1493 146 : Reference< XTextFieldsSupplier > xTextFieldsSupp( GetExport().GetModel(), UNO_QUERY );
1494 73 : if ( xTextFieldsSupp.is() )
1495 : {
1496 73 : Reference< XEnumerationAccess > xTextFields = xTextFieldsSupp->getTextFields();
1497 146 : Reference < XEnumeration > xTextFieldsEnum( xTextFields->createEnumeration() );
1498 :
1499 268 : while ( xTextFieldsEnum->hasMoreElements() )
1500 : {
1501 122 : Any aAny = xTextFieldsEnum->nextElement();
1502 244 : Reference< XTextField > xTextField = *static_cast<Reference<XTextField> const *>(aAny.getValue());
1503 : exportTextField( xTextField, bAutoStyles, bIsProgress,
1504 122 : !xAutoStylesSupp.is() );
1505 : try
1506 : {
1507 122 : Reference < XPropertySet > xSet( xTextField, UNO_QUERY );
1508 244 : Reference < XText > xText;
1509 244 : Any a = xSet->getPropertyValue("TextRange");
1510 17 : a >>= xText;
1511 17 : if ( xText.is() )
1512 : {
1513 17 : exportText( xText, true, bIsProgress, bExportContent );
1514 17 : GetExport().GetTextParagraphExport()
1515 17 : ->collectTextAutoStyles( xText );
1516 122 : }
1517 : }
1518 105 : catch (Exception&)
1519 : {
1520 : }
1521 195 : }
1522 : }
1523 :
1524 : // Export text frames:
1525 146 : Reference<XEnumeration> xTextFramesEnum = pBoundFrameSets->GetTexts()->createEnumeration();
1526 73 : if(xTextFramesEnum.is())
1527 205 : while(xTextFramesEnum->hasMoreElements())
1528 : {
1529 59 : Reference<XTextContent> xTxtCntnt(xTextFramesEnum->nextElement(), UNO_QUERY);
1530 59 : if(xTxtCntnt.is())
1531 59 : exportTextFrame(xTxtCntnt, bAutoStyles, bIsProgress, bExportContent, 0);
1532 59 : }
1533 :
1534 : // Export graphic objects:
1535 146 : Reference<XEnumeration> xGraphicsEnum = pBoundFrameSets->GetGraphics()->createEnumeration();
1536 73 : if(xGraphicsEnum.is())
1537 152 : while(xGraphicsEnum->hasMoreElements())
1538 : {
1539 6 : Reference<XTextContent> xTxtCntnt(xGraphicsEnum->nextElement(), UNO_QUERY);
1540 6 : if(xTxtCntnt.is())
1541 6 : exportTextGraphic(xTxtCntnt, true, 0);
1542 6 : }
1543 :
1544 : // Export embedded objects:
1545 146 : Reference<XEnumeration> xEmbeddedsEnum = pBoundFrameSets->GetEmbeddeds()->createEnumeration();
1546 73 : if(xEmbeddedsEnum.is())
1547 155 : while(xEmbeddedsEnum->hasMoreElements())
1548 : {
1549 9 : Reference<XTextContent> xTxtCntnt(xEmbeddedsEnum->nextElement(), UNO_QUERY);
1550 9 : if(xTxtCntnt.is())
1551 9 : exportTextEmbedded(xTxtCntnt, true, 0);
1552 9 : }
1553 :
1554 : // Export shapes:
1555 146 : Reference<XEnumeration> xShapesEnum = pBoundFrameSets->GetShapes()->createEnumeration();
1556 73 : if(xShapesEnum.is())
1557 247 : while(xShapesEnum->hasMoreElements())
1558 : {
1559 101 : Reference<XTextContent> xTxtCntnt(xShapesEnum->nextElement(), UNO_QUERY);
1560 101 : if(xTxtCntnt.is())
1561 : {
1562 101 : Reference<XServiceInfo> xServiceInfo(xTxtCntnt, UNO_QUERY);
1563 101 : if( xServiceInfo->supportsService(sShapeService))
1564 27 : exportShape(xTxtCntnt, true, 0);
1565 : }
1566 101 : }
1567 :
1568 : sal_Int32 nCount;
1569 : // AutoStyles for sections
1570 146 : Reference< XTextSectionsSupplier > xSectionsSupp( GetExport().GetModel(), UNO_QUERY );
1571 73 : if ( xSectionsSupp.is() )
1572 : {
1573 73 : Reference< XIndexAccess > xSections( xSectionsSupp->getTextSections(), UNO_QUERY );
1574 73 : if ( xSections.is() )
1575 : {
1576 73 : nCount = xSections->getCount();
1577 111 : for( sal_Int32 i = 0; i < nCount; ++i )
1578 : {
1579 38 : Any aAny = xSections->getByIndex( i );
1580 76 : Reference< XTextSection > xSection = *static_cast<Reference<XTextSection> const *>(aAny.getValue());
1581 76 : Reference < XPropertySet > xPSet( xSection, uno::UNO_QUERY );
1582 38 : Add( XML_STYLE_FAMILY_TEXT_SECTION, xPSet );
1583 38 : }
1584 73 : }
1585 : }
1586 :
1587 : // AutoStyles for tables (Note: suppress autostyle collection for paragraphs in exportTable)
1588 146 : Reference< XTextTablesSupplier > xTablesSupp( GetExport().GetModel(), UNO_QUERY );
1589 73 : if ( xTablesSupp.is() )
1590 : {
1591 73 : Reference< XIndexAccess > xTables( xTablesSupp->getTextTables(), UNO_QUERY );
1592 73 : if ( xTables.is() )
1593 : {
1594 73 : nCount = xTables->getCount();
1595 85 : for( sal_Int32 i = 0; i < nCount; ++i )
1596 : {
1597 12 : Any aAny = xTables->getByIndex( i );
1598 24 : Reference< XTextTable > xTable = *static_cast<Reference<XTextTable> const *>(aAny.getValue());
1599 12 : exportTable( xTable, true, true );
1600 12 : }
1601 73 : }
1602 : }
1603 :
1604 146 : Reference< XNumberingRulesSupplier > xNumberingRulesSupp( GetExport().GetModel(), UNO_QUERY );
1605 73 : if ( xNumberingRulesSupp.is() )
1606 : {
1607 73 : Reference< XIndexAccess > xNumberingRules = xNumberingRulesSupp->getNumberingRules();
1608 73 : nCount = xNumberingRules->getCount();
1609 : // Custom outline assignment lost after re-importing sxw (#i73361#)
1610 222 : for( sal_Int32 i = 0; i < nCount; ++i )
1611 : {
1612 149 : Reference< XIndexReplace > xNumRule( xNumberingRules->getByIndex( i ), UNO_QUERY );
1613 149 : if( xNumRule.is() && xNumRule->getCount() )
1614 : {
1615 149 : Reference < XNamed > xNamed( xNumRule, UNO_QUERY );
1616 298 : OUString sName;
1617 149 : if( xNamed.is() )
1618 149 : sName = xNamed->getName();
1619 149 : bool bAdd = sName.isEmpty();
1620 149 : if( !bAdd )
1621 : {
1622 : Reference < XPropertySet > xNumPropSet( xNumRule,
1623 149 : UNO_QUERY );
1624 745 : if( xNumPropSet.is() &&
1625 149 : xNumPropSet->getPropertySetInfo()
1626 745 : ->hasPropertyByName( "IsAutomatic" ) )
1627 : {
1628 149 : bAdd = *static_cast<sal_Bool const *>(xNumPropSet->getPropertyValue( "IsAutomatic" ).getValue());
1629 : // Check on outline style (#i73361#)
1630 595 : if ( bAdd &&
1631 74 : xNumPropSet->getPropertySetInfo()
1632 445 : ->hasPropertyByName( "NumberingIsOutline" ) )
1633 : {
1634 74 : bAdd = !(*static_cast<sal_Bool const *>(xNumPropSet->getPropertyValue( "NumberingIsOutline" ).getValue()));
1635 : }
1636 : }
1637 : else
1638 : {
1639 0 : bAdd = true;
1640 149 : }
1641 : }
1642 149 : if( bAdd )
1643 150 : pListAutoPool->Add( xNumRule );
1644 : }
1645 222 : }
1646 : }
1647 :
1648 146 : return true;
1649 : }
1650 :
1651 1310 : void XMLTextParagraphExport::exportText(
1652 : const Reference < XText > & rText,
1653 : bool bAutoStyles,
1654 : bool bIsProgress,
1655 : bool bExportParagraph,
1656 : TextPNS eExtensionNS)
1657 : {
1658 1310 : if( bAutoStyles )
1659 877 : GetExport().GetShapeExport(); // make sure the graphics styles family
1660 : // is added
1661 1310 : Reference < XEnumerationAccess > xEA( rText, UNO_QUERY );
1662 2620 : Reference < XEnumeration > xParaEnum(xEA->createEnumeration());
1663 2620 : Reference < XPropertySet > xPropertySet( rText, UNO_QUERY );
1664 2620 : Reference < XTextSection > xBaseSection;
1665 :
1666 : // #97718# footnotes don't supply paragraph enumerations in some cases
1667 : // This is always a bug, but at least we don't want to crash.
1668 : DBG_ASSERT( xParaEnum.is(), "We need a paragraph enumeration" );
1669 1310 : if( ! xParaEnum.is() )
1670 1310 : return;
1671 :
1672 1310 : bool bExportLevels = true;
1673 :
1674 1310 : if (xPropertySet.is())
1675 : {
1676 433 : Reference < XPropertySetInfo > xInfo ( xPropertySet->getPropertySetInfo() );
1677 :
1678 433 : if( xInfo.is() )
1679 : {
1680 433 : if (xInfo->hasPropertyByName( sTextSection ))
1681 : {
1682 0 : xPropertySet->getPropertyValue(sTextSection) >>= xBaseSection ;
1683 : }
1684 :
1685 : /* #i35937#
1686 : // for applications that use the outliner we need to check if
1687 : // the current text object needs the level information exported
1688 : if( !bAutoStyles )
1689 : {
1690 : // fixme: move string to class member, couldn't do now because
1691 : // of no incompatible build
1692 : OUString sHasLevels( "HasLevels" );
1693 : if (xInfo->hasPropertyByName( sHasLevels ) )
1694 : {
1695 : xPropertySet->getPropertyValue(sHasLevels) >>= bExportLevels;
1696 : }
1697 : }
1698 : */
1699 433 : }
1700 : }
1701 :
1702 : // #96530# Export redlines at start & end of XText before & after
1703 : // exporting the text content enumeration
1704 1310 : if( !bAutoStyles && (pRedlineExport != NULL) )
1705 193 : pRedlineExport->ExportStartOrEndRedline( xPropertySet, true );
1706 : exportTextContentEnumeration( xParaEnum, bAutoStyles, xBaseSection,
1707 1310 : bIsProgress, bExportParagraph, 0, bExportLevels, eExtensionNS );
1708 1310 : if( !bAutoStyles && (pRedlineExport != NULL) )
1709 1503 : pRedlineExport->ExportStartOrEndRedline( xPropertySet, false );
1710 : }
1711 :
1712 168 : void XMLTextParagraphExport::exportText(
1713 : const Reference < XText > & rText,
1714 : const Reference < XTextSection > & rBaseSection,
1715 : bool bAutoStyles,
1716 : bool bIsProgress,
1717 : bool bExportParagraph,
1718 : TextPNS /*eExtensionNS*/)
1719 : {
1720 168 : if( bAutoStyles )
1721 0 : GetExport().GetShapeExport(); // make sure the graphics styles family
1722 : // is added
1723 168 : Reference < XEnumerationAccess > xEA( rText, UNO_QUERY );
1724 336 : Reference < XEnumeration > xParaEnum(xEA->createEnumeration());
1725 :
1726 : // #98165# don't continue without a paragraph enumeration
1727 168 : if( ! xParaEnum.is() )
1728 168 : return;
1729 :
1730 : // #96530# Export redlines at start & end of XText before & after
1731 : // exporting the text content enumeration
1732 336 : Reference<XPropertySet> xPropertySet;
1733 168 : if( !bAutoStyles && (pRedlineExport != NULL) )
1734 : {
1735 168 : xPropertySet.set(rText, uno::UNO_QUERY );
1736 168 : pRedlineExport->ExportStartOrEndRedline( xPropertySet, true );
1737 : }
1738 : exportTextContentEnumeration( xParaEnum, bAutoStyles, rBaseSection,
1739 168 : bIsProgress, bExportParagraph );
1740 168 : if( !bAutoStyles && (pRedlineExport != NULL) )
1741 336 : pRedlineExport->ExportStartOrEndRedline( xPropertySet, false );
1742 : }
1743 :
1744 1514 : bool XMLTextParagraphExport::exportTextContentEnumeration(
1745 : const Reference < XEnumeration > & rContEnum,
1746 : bool bAutoStyles,
1747 : const Reference < XTextSection > & rBaseSection,
1748 : bool bIsProgress,
1749 : bool bExportParagraph,
1750 : const Reference < XPropertySet > *pRangePropSet,
1751 : bool bExportLevels, TextPNS eExtensionNS )
1752 : {
1753 : DBG_ASSERT( rContEnum.is(), "No enumeration to export!" );
1754 1514 : bool bHasMoreElements = rContEnum->hasMoreElements();
1755 1514 : if( !bHasMoreElements )
1756 0 : return false;
1757 :
1758 1514 : XMLTextNumRuleInfo aPrevNumInfo;
1759 3028 : XMLTextNumRuleInfo aNextNumInfo;
1760 :
1761 1514 : bool bHasContent = false;
1762 3028 : Reference<XTextSection> xCurrentTextSection(rBaseSection);
1763 :
1764 : MultiPropertySetHelper aPropSetHelper(
1765 : bAutoStyles ? aParagraphPropertyNamesAuto :
1766 3028 : aParagraphPropertyNames );
1767 :
1768 1514 : bool bHoldElement = false;
1769 3028 : Reference < XTextContent > xTxtCntnt;
1770 5619 : while( bHoldElement || bHasMoreElements )
1771 : {
1772 2591 : if (bHoldElement)
1773 : {
1774 0 : bHoldElement = false;
1775 : }
1776 : else
1777 : {
1778 2591 : xTxtCntnt.set(rContEnum->nextElement(), uno::UNO_QUERY);
1779 :
1780 2591 : aPropSetHelper.resetValues();
1781 :
1782 : }
1783 :
1784 2591 : Reference<XServiceInfo> xServiceInfo( xTxtCntnt, UNO_QUERY );
1785 2591 : if( xServiceInfo->supportsService( sParagraphService ) )
1786 : {
1787 2487 : if( bExportLevels )
1788 : {
1789 2487 : if( bAutoStyles )
1790 : {
1791 : exportListAndSectionChange( xCurrentTextSection, xTxtCntnt,
1792 : aPrevNumInfo, aNextNumInfo,
1793 1154 : bAutoStyles );
1794 : }
1795 : else
1796 : {
1797 : /* Pass list auto style pool to <XMLTextNumRuleInfo> instance
1798 : Pass info about request to export <text:number> element
1799 : to <XMLTextNumRuleInfo> instance (#i69627#)
1800 : */
1801 : aNextNumInfo.Set( xTxtCntnt,
1802 1333 : GetExport().writeOutlineStyleAsNormalListStyle(),
1803 1333 : GetListAutoStylePool(),
1804 2666 : GetExport().exportTextNumberElement() );
1805 :
1806 : exportListAndSectionChange( xCurrentTextSection, aPropSetHelper,
1807 : TEXT_SECTION, xTxtCntnt,
1808 : aPrevNumInfo, aNextNumInfo,
1809 1333 : bAutoStyles );
1810 : }
1811 : }
1812 :
1813 : // if we found a mute section: skip all section content
1814 2487 : if (pSectionExport->IsMuteSection(xCurrentTextSection))
1815 : {
1816 : // Make sure headings are exported anyway.
1817 0 : if( !bAutoStyles )
1818 0 : pSectionExport->ExportMasterDocHeadingDummies();
1819 :
1820 0 : while (rContEnum->hasMoreElements() &&
1821 : pSectionExport->IsInSection( xCurrentTextSection,
1822 0 : xTxtCntnt, true ))
1823 : {
1824 0 : xTxtCntnt.set(rContEnum->nextElement(), uno::UNO_QUERY);
1825 0 : aPropSetHelper.resetValues();
1826 0 : aNextNumInfo.Reset();
1827 : }
1828 : // the first non-mute element still needs to be processed
1829 : bHoldElement =
1830 : ! pSectionExport->IsInSection( xCurrentTextSection,
1831 0 : xTxtCntnt, false );
1832 : }
1833 : else
1834 : exportParagraph( xTxtCntnt, bAutoStyles, bIsProgress,
1835 2487 : bExportParagraph, aPropSetHelper, eExtensionNS );
1836 2487 : bHasContent = true;
1837 : }
1838 104 : else if( xServiceInfo->supportsService( sTableService ) )
1839 : {
1840 14 : if( !bAutoStyles )
1841 : {
1842 12 : aNextNumInfo.Reset();
1843 : }
1844 :
1845 : exportListAndSectionChange( xCurrentTextSection, xTxtCntnt,
1846 : aPrevNumInfo, aNextNumInfo,
1847 14 : bAutoStyles );
1848 :
1849 14 : if (! pSectionExport->IsMuteSection(xCurrentTextSection))
1850 : {
1851 : // export start + end redlines (for wholly redlined tables)
1852 14 : if ((! bAutoStyles) && (NULL != pRedlineExport))
1853 12 : pRedlineExport->ExportStartOrEndRedline(xTxtCntnt, true);
1854 :
1855 14 : exportTable( xTxtCntnt, bAutoStyles, bIsProgress );
1856 :
1857 14 : if ((! bAutoStyles) && (NULL != pRedlineExport))
1858 12 : pRedlineExport->ExportStartOrEndRedline(xTxtCntnt, false);
1859 : }
1860 0 : else if( !bAutoStyles )
1861 : {
1862 : // Make sure headings are exported anyway.
1863 0 : pSectionExport->ExportMasterDocHeadingDummies();
1864 : }
1865 :
1866 14 : bHasContent = true;
1867 : }
1868 90 : else if( xServiceInfo->supportsService( sTextFrameService ) )
1869 : {
1870 56 : exportTextFrame( xTxtCntnt, bAutoStyles, bIsProgress, true, pRangePropSet );
1871 : }
1872 34 : else if( xServiceInfo->supportsService( sTextGraphicService ) )
1873 : {
1874 6 : exportTextGraphic( xTxtCntnt, bAutoStyles, pRangePropSet );
1875 : }
1876 28 : else if( xServiceInfo->supportsService( sTextEmbeddedService ) )
1877 : {
1878 9 : exportTextEmbedded( xTxtCntnt, bAutoStyles, pRangePropSet );
1879 : }
1880 19 : else if( xServiceInfo->supportsService( sShapeService ) )
1881 : {
1882 19 : exportShape( xTxtCntnt, bAutoStyles, pRangePropSet );
1883 : }
1884 : else
1885 : {
1886 : DBG_ASSERT( !xTxtCntnt.is(), "unknown text content" );
1887 : }
1888 :
1889 2591 : if( !bAutoStyles )
1890 : {
1891 1434 : aPrevNumInfo = aNextNumInfo;
1892 : }
1893 :
1894 2591 : bHasMoreElements = rContEnum->hasMoreElements();
1895 2591 : }
1896 :
1897 1514 : if( bExportLevels && bHasContent && !bAutoStyles )
1898 : {
1899 601 : aNextNumInfo.Reset();
1900 :
1901 : // close open lists and sections; no new styles
1902 : exportListAndSectionChange( xCurrentTextSection, rBaseSection,
1903 : aPrevNumInfo, aNextNumInfo,
1904 601 : bAutoStyles );
1905 : }
1906 :
1907 3028 : return true;
1908 : }
1909 :
1910 2487 : void XMLTextParagraphExport::exportParagraph(
1911 : const Reference < XTextContent > & rTextContent,
1912 : bool bAutoStyles, bool bIsProgress, bool bExportParagraph,
1913 : MultiPropertySetHelper& rPropSetHelper, TextPNS eExtensionNS)
1914 : {
1915 2487 : sal_Int16 nOutlineLevel = -1;
1916 :
1917 2487 : if( bIsProgress )
1918 : {
1919 1086 : ProgressBarHelper *pProgress = GetExport().GetProgressBarHelper();
1920 1086 : pProgress->SetValue( pProgress->GetValue()+1 );
1921 : }
1922 :
1923 : // get property set or multi property set and initialize helper
1924 2487 : Reference<XMultiPropertySet> xMultiPropSet( rTextContent, UNO_QUERY );
1925 4974 : Reference<XPropertySet> xPropSet( rTextContent, UNO_QUERY );
1926 :
1927 : // check for supported properties
1928 2487 : if( !rPropSetHelper.checkedProperties() )
1929 877 : rPropSetHelper.hasProperties( xPropSet->getPropertySetInfo() );
1930 :
1931 : // if( xMultiPropSet.is() )
1932 : // rPropSetHelper.getValues( xMultiPropSet );
1933 : // else
1934 : // rPropSetHelper.getValues( xPropSet );
1935 :
1936 2487 : if( bExportParagraph )
1937 : {
1938 1467 : if( bAutoStyles )
1939 : {
1940 279 : Add( XML_STYLE_FAMILY_TEXT_PARAGRAPH, rPropSetHelper, xPropSet );
1941 : }
1942 : else
1943 : {
1944 : // xml:id for RDF metadata
1945 1188 : GetExport().AddAttributeXmlId(rTextContent);
1946 1188 : GetExport().AddAttributesRDFa(rTextContent);
1947 :
1948 1188 : OUString sStyle;
1949 1188 : if( rPropSetHelper.hasProperty( PARA_STYLE_NAME ) )
1950 : {
1951 932 : if( xMultiPropSet.is() )
1952 : rPropSetHelper.getValue( PARA_STYLE_NAME,
1953 932 : xMultiPropSet ) >>= sStyle;
1954 : else
1955 : rPropSetHelper.getValue( PARA_STYLE_NAME,
1956 0 : xPropSet ) >>= sStyle;
1957 : }
1958 :
1959 1188 : if( rTextContent.is() )
1960 : {
1961 1188 : const OUString& rIdentifier = GetExport().getInterfaceToIdentifierMapper().getIdentifier( rTextContent );
1962 1188 : if( !rIdentifier.isEmpty() )
1963 : {
1964 : // FIXME: this is just temporary until EditEngine
1965 : // paragraphs implement XMetadatable.
1966 : // then that must be used and not the mapper, because
1967 : // when both can be used we get two xml:id!
1968 : uno::Reference<rdf::XMetadatable> const xMeta(rTextContent,
1969 0 : uno::UNO_QUERY);
1970 : OSL_ENSURE(!xMeta.is(), "paragraph that implements "
1971 : "XMetadatable used in interfaceToIdentifierMapper?");
1972 0 : GetExport().AddAttributeIdLegacy(XML_NAMESPACE_TEXT,
1973 0 : rIdentifier);
1974 : }
1975 : }
1976 :
1977 2376 : OUString sAutoStyle( sStyle );
1978 1188 : sAutoStyle = Find( XML_STYLE_FAMILY_TEXT_PARAGRAPH, xPropSet, sStyle );
1979 1188 : if( !sAutoStyle.isEmpty() )
1980 1008 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_STYLE_NAME,
1981 2016 : GetExport().EncodeStyleName( sAutoStyle ) );
1982 :
1983 1188 : if( rPropSetHelper.hasProperty( PARA_CONDITIONAL_STYLE_NAME ) )
1984 : {
1985 932 : OUString sCondStyle;
1986 932 : if( xMultiPropSet.is() )
1987 : rPropSetHelper.getValue( PARA_CONDITIONAL_STYLE_NAME,
1988 932 : xMultiPropSet ) >>= sCondStyle;
1989 : else
1990 : rPropSetHelper.getValue( PARA_CONDITIONAL_STYLE_NAME,
1991 0 : xPropSet ) >>= sCondStyle;
1992 932 : if( sCondStyle != sStyle )
1993 : {
1994 0 : sCondStyle = Find( XML_STYLE_FAMILY_TEXT_PARAGRAPH, xPropSet,
1995 0 : sCondStyle );
1996 0 : if( !sCondStyle.isEmpty() )
1997 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
1998 : XML_COND_STYLE_NAME,
1999 0 : GetExport().EncodeStyleName( sCondStyle ) );
2000 932 : }
2001 : }
2002 :
2003 1188 : if( rPropSetHelper.hasProperty( PARA_OUTLINE_LEVEL ) )
2004 : {
2005 932 : if( xMultiPropSet.is() )
2006 : rPropSetHelper.getValue( PARA_OUTLINE_LEVEL,
2007 932 : xMultiPropSet ) >>= nOutlineLevel;
2008 : else
2009 : rPropSetHelper.getValue( PARA_OUTLINE_LEVEL,
2010 0 : xPropSet ) >>= nOutlineLevel;
2011 :
2012 932 : if( 0 < nOutlineLevel )
2013 : {
2014 13 : OUStringBuffer sTmp;
2015 13 : sTmp.append( sal_Int32( nOutlineLevel) );
2016 13 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
2017 : XML_OUTLINE_LEVEL,
2018 26 : sTmp.makeStringAndClear() );
2019 :
2020 13 : if( rPropSetHelper.hasProperty( NUMBERING_IS_NUMBER ) )
2021 : {
2022 13 : bool bIsNumber = false;
2023 13 : if( xMultiPropSet.is() )
2024 : rPropSetHelper.getValue(
2025 13 : NUMBERING_IS_NUMBER, xMultiPropSet ) >>= bIsNumber;
2026 : else
2027 : rPropSetHelper.getValue(
2028 0 : NUMBERING_IS_NUMBER, xPropSet ) >>= bIsNumber;
2029 :
2030 13 : OUString sListStyleName;
2031 13 : if( xMultiPropSet.is() )
2032 : rPropSetHelper.getValue(
2033 13 : PARA_NUMBERING_STYLENAME, xMultiPropSet ) >>= sListStyleName;
2034 : else
2035 : rPropSetHelper.getValue(
2036 0 : PARA_NUMBERING_STYLENAME, xPropSet ) >>= sListStyleName;
2037 :
2038 13 : bool bAssignedtoOutlineStyle = false;
2039 : {
2040 13 : Reference< XChapterNumberingSupplier > xCNSupplier( GetExport().GetModel(), UNO_QUERY );
2041 :
2042 26 : OUString sOutlineName;
2043 13 : if (xCNSupplier.is())
2044 : {
2045 13 : Reference< XIndexReplace > xNumRule ( xCNSupplier->getChapterNumberingRules() );
2046 : DBG_ASSERT( xNumRule.is(), "no chapter numbering rules" );
2047 :
2048 13 : if (xNumRule.is())
2049 : {
2050 13 : Reference< XPropertySet > xNumRulePropSet( xNumRule, UNO_QUERY );
2051 13 : xNumRulePropSet->getPropertyValue(
2052 13 : "Name" ) >>= sOutlineName;
2053 13 : bAssignedtoOutlineStyle = ( sListStyleName == sOutlineName );
2054 13 : }
2055 13 : }
2056 : }
2057 :
2058 13 : if( ! bIsNumber && bAssignedtoOutlineStyle )
2059 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
2060 : XML_IS_LIST_HEADER,
2061 0 : XML_TRUE );
2062 : }
2063 :
2064 : {
2065 13 : bool bIsRestartNumbering = false;
2066 :
2067 : Reference< XPropertySetInfo >
2068 13 : xPropSetInfo(xMultiPropSet.is() ?
2069 13 : xMultiPropSet->getPropertySetInfo():
2070 26 : xPropSet->getPropertySetInfo());
2071 :
2072 39 : if (xPropSetInfo->
2073 26 : hasPropertyByName("ParaIsNumberingRestart"))
2074 : {
2075 13 : xPropSet->getPropertyValue("ParaIsNumberingRestart")
2076 13 : >>= bIsRestartNumbering;
2077 : }
2078 :
2079 13 : if (bIsRestartNumbering)
2080 : {
2081 0 : GetExport().AddAttribute(XML_NAMESPACE_TEXT,
2082 : XML_RESTART_NUMBERING,
2083 0 : XML_TRUE);
2084 :
2085 0 : if (xPropSetInfo->
2086 0 : hasPropertyByName("NumberingStartValue"))
2087 : {
2088 0 : sal_Int32 nStartValue = 0;
2089 :
2090 0 : xPropSet->getPropertyValue("NumberingStartValue")
2091 0 : >>= nStartValue;
2092 :
2093 0 : OUStringBuffer sTmpStartValue;
2094 :
2095 0 : sTmpStartValue.append(nStartValue);
2096 :
2097 0 : GetExport().
2098 : AddAttribute(XML_NAMESPACE_TEXT,
2099 : XML_START_VALUE,
2100 : sTmpStartValue.
2101 0 : makeStringAndClear());
2102 : }
2103 13 : }
2104 13 : }
2105 : }
2106 1188 : }
2107 : }
2108 : }
2109 :
2110 4974 : Reference < XEnumerationAccess > xEA( rTextContent, UNO_QUERY );
2111 4974 : Reference < XEnumeration > xTextEnum;
2112 2487 : xTextEnum = xEA->createEnumeration();
2113 2487 : const bool bHasPortions = xTextEnum.is();
2114 :
2115 4974 : Reference < XEnumeration> xContentEnum;
2116 4974 : Reference < XContentEnumerationAccess > xCEA( rTextContent, UNO_QUERY );
2117 2487 : if( xCEA.is() )
2118 990 : xContentEnum.set(xCEA->createContentEnumeration( sTextContentService ));
2119 3477 : const bool bHasContentEnum = xContentEnum.is() &&
2120 3477 : xContentEnum->hasMoreElements();
2121 :
2122 4974 : Reference < XTextSection > xSection;
2123 2487 : if( bHasContentEnum )
2124 : {
2125 : // For the auto styles, the multi property set helper is only used
2126 : // if hard attributes are existing. Therefore, it seems to be a better
2127 : // strategy to have the TextSection property separate, because otherwise
2128 : // we always retrieve the style names even if they are not required.
2129 23 : if( bAutoStyles )
2130 : {
2131 1 : if( xPropSet->getPropertySetInfo()->hasPropertyByName( sTextSection ) )
2132 : {
2133 1 : xSection.set(xPropSet->getPropertyValue( sTextSection ), uno::UNO_QUERY);
2134 : }
2135 : }
2136 : else
2137 : {
2138 22 : if( rPropSetHelper.hasProperty( TEXT_SECTION ) )
2139 : {
2140 22 : xSection.set(rPropSetHelper.getValue( TEXT_SECTION ), uno::UNO_QUERY);
2141 : }
2142 : }
2143 : }
2144 :
2145 2487 : if( bAutoStyles )
2146 : {
2147 1154 : if( bHasContentEnum )
2148 : exportTextContentEnumeration(
2149 : xContentEnum, bAutoStyles, xSection,
2150 1 : bIsProgress, true, 0, true );
2151 1154 : if ( bHasPortions )
2152 1154 : exportTextRangeEnumeration( xTextEnum, bAutoStyles, bIsProgress );
2153 : }
2154 : else
2155 : {
2156 1333 : bool bPrevCharIsSpace = true;
2157 : enum XMLTokenEnum eElem =
2158 1333 : 0 < nOutlineLevel ? XML_H : XML_P;
2159 1333 : SvXMLElementExport aElem( GetExport(), eExtensionNS == TextPNS::EXTENSION ? XML_NAMESPACE_LO_EXT : XML_NAMESPACE_TEXT, eElem,
2160 2666 : true, false );
2161 1333 : if( bHasContentEnum )
2162 : bPrevCharIsSpace = !exportTextContentEnumeration(
2163 : xContentEnum, bAutoStyles, xSection,
2164 22 : bIsProgress );
2165 : exportTextRangeEnumeration( xTextEnum, bAutoStyles, bIsProgress,
2166 1333 : bPrevCharIsSpace );
2167 2487 : }
2168 2487 : }
2169 :
2170 2506 : void XMLTextParagraphExport::exportTextRangeEnumeration(
2171 : const Reference < XEnumeration > & rTextEnum,
2172 : bool bAutoStyles, bool bIsProgress,
2173 : bool bPrvChrIsSpc )
2174 : {
2175 : static const char sMeta[] = "InContentMetadata";
2176 : static const char sFieldMarkName[] = "__FieldMark_";
2177 : static const char sAnnotation[] = "Annotation";
2178 : static const char sAnnotationEnd[] = "AnnotationEnd";
2179 :
2180 2506 : bool bPrevCharIsSpace = bPrvChrIsSpc;
2181 :
2182 : /* This is used for exporting to strict OpenDocument 1.2, in which case traditional
2183 : * bookmarks are used instead of fieldmarks. */
2184 2506 : FieldmarkType openFieldMark = NONE;
2185 :
2186 12339 : while( rTextEnum->hasMoreElements() )
2187 : {
2188 7327 : Reference<XPropertySet> xPropSet(rTextEnum->nextElement(), UNO_QUERY);
2189 14654 : Reference < XTextRange > xTxtRange(xPropSet, uno::UNO_QUERY);
2190 14654 : Reference<XPropertySetInfo> xPropInfo(xPropSet->getPropertySetInfo());
2191 :
2192 7327 : if (xPropInfo->hasPropertyByName(sTextPortionType))
2193 : {
2194 7327 : OUString sType;
2195 7327 : xPropSet->getPropertyValue(sTextPortionType) >>= sType;
2196 :
2197 7327 : if( sType.equals(sText))
2198 : {
2199 : exportTextRange( xTxtRange, bAutoStyles,
2200 4523 : bPrevCharIsSpace, openFieldMark);
2201 : }
2202 2804 : else if( sType.equals(sTextField))
2203 : {
2204 734 : exportTextField( xTxtRange, bAutoStyles, bIsProgress );
2205 734 : bPrevCharIsSpace = false;
2206 : }
2207 2070 : else if ( sType == sAnnotation )
2208 : {
2209 17 : exportTextField( xTxtRange, bAutoStyles, bIsProgress );
2210 17 : bPrevCharIsSpace = false;
2211 : }
2212 2053 : else if ( sType == sAnnotationEnd )
2213 : {
2214 2 : if (!bAutoStyles)
2215 : {
2216 2 : Reference<XNamed> xBookmark(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
2217 4 : const OUString& rName = xBookmark->getName();
2218 2 : if (!rName.isEmpty())
2219 : {
2220 2 : GetExport().AddAttribute(XML_NAMESPACE_OFFICE, XML_NAME, rName);
2221 : }
2222 4 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_OFFICE, XML_ANNOTATION_END, false, false );
2223 : }
2224 : }
2225 2051 : else if( sType.equals( sFrame ) )
2226 : {
2227 13 : Reference < XEnumeration> xContentEnum;
2228 : Reference < XContentEnumerationAccess > xCEA( xTxtRange,
2229 26 : UNO_QUERY );
2230 13 : if( xCEA.is() )
2231 13 : xContentEnum.set(xCEA->createContentEnumeration(
2232 13 : sTextContentService ));
2233 : // frames are never in sections
2234 26 : Reference<XTextSection> xSection;
2235 13 : if( xContentEnum.is() )
2236 : exportTextContentEnumeration( xContentEnum,
2237 : bAutoStyles,
2238 : xSection, bIsProgress, true,
2239 13 : &xPropSet );
2240 :
2241 26 : bPrevCharIsSpace = false;
2242 : }
2243 2038 : else if (sType.equals(sFootnote))
2244 : {
2245 : exportTextFootnote(xPropSet,
2246 0 : xTxtRange->getString(),
2247 0 : bAutoStyles, bIsProgress );
2248 0 : bPrevCharIsSpace = false;
2249 : }
2250 2038 : else if (sType.equals(sBookmark))
2251 : {
2252 : exportTextMark(xPropSet,
2253 : sBookmark,
2254 : lcl_XmlBookmarkElements,
2255 2006 : bAutoStyles);
2256 : }
2257 32 : else if (sType.equals(sReferenceMark))
2258 : {
2259 : exportTextMark(xPropSet,
2260 : sReferenceMark,
2261 : lcl_XmlReferenceElements,
2262 0 : bAutoStyles);
2263 : }
2264 32 : else if (sType.equals(sDocumentIndexMark))
2265 : {
2266 0 : pIndexMarkExport->ExportIndexMark(xPropSet, bAutoStyles);
2267 : }
2268 32 : else if (sType.equals(sRedline))
2269 : {
2270 0 : if (NULL != pRedlineExport)
2271 0 : pRedlineExport->ExportChange(xPropSet, bAutoStyles);
2272 : }
2273 32 : else if (sType.equals(sRuby))
2274 : {
2275 12 : exportRuby(xPropSet, bAutoStyles);
2276 : }
2277 20 : else if (sType == sMeta)
2278 : {
2279 9 : exportMeta(xPropSet, bAutoStyles, bIsProgress);
2280 : }
2281 11 : else if (sType.equals(sTextFieldStart))
2282 : {
2283 0 : Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
2284 :
2285 : /* As of now, textmarks are a proposed extension to the OpenDocument standard. */
2286 0 : if (!bAutoStyles)
2287 : {
2288 0 : if (GetExport().getDefaultVersion() > SvtSaveOptions::ODFVER_012)
2289 : {
2290 0 : Reference<XNamed> xBookmark(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
2291 0 : if (xBookmark.is())
2292 : {
2293 0 : GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, xBookmark->getName());
2294 : }
2295 :
2296 0 : if (xFormField.is())
2297 : {
2298 0 : GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_TYPE, xFormField->getFieldType());
2299 : }
2300 :
2301 0 : GetExport().StartElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_START, false);
2302 0 : if (xFormField.is())
2303 : {
2304 0 : FieldParamExporter(&GetExport(), xFormField->getParameters()).Export();
2305 : }
2306 0 : GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_START, false);
2307 : }
2308 : /* The OpenDocument standard does not include support for TextMarks for now, so use bookmarks instead. */
2309 : else
2310 : {
2311 0 : if (xFormField.is())
2312 : {
2313 0 : OUString sName;
2314 0 : Reference< ::com::sun::star::container::XNameAccess > xParameters(xFormField->getParameters(), UNO_QUERY);
2315 0 : if (xParameters.is() && xParameters->hasByName("Name"))
2316 : {
2317 0 : const Any aValue = xParameters->getByName("Name");
2318 0 : aValue >>= sName;
2319 : }
2320 0 : if (sName.isEmpty())
2321 : { // name attribute is mandatory, so have to pull a
2322 : // rabbit out of the hat here
2323 0 : sName = sFieldMarkName + OUString::number(
2324 0 : m_xImpl->AddFieldMarkStart(xFormField));
2325 : }
2326 0 : GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME,
2327 0 : sName);
2328 0 : SvXMLElementExport aElem( GetExport(), !bAutoStyles,
2329 : XML_NAMESPACE_TEXT, XML_BOOKMARK_START,
2330 0 : false, false );
2331 0 : const OUString sFieldType = xFormField->getFieldType();
2332 0 : if (sFieldType == ODF_FORMTEXT)
2333 : {
2334 0 : openFieldMark = TEXT;
2335 : }
2336 0 : else if (sFieldType == ODF_FORMCHECKBOX)
2337 : {
2338 0 : openFieldMark = CHECK;
2339 : }
2340 : else
2341 : {
2342 0 : openFieldMark = NONE;
2343 0 : }
2344 : }
2345 : }
2346 0 : }
2347 : }
2348 11 : else if (sType.equals(sTextFieldEnd))
2349 : {
2350 0 : if (!bAutoStyles)
2351 : {
2352 0 : Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
2353 :
2354 0 : if ( GetExport().getDefaultVersion() > SvtSaveOptions::ODFVER_012 )
2355 : {
2356 0 : SvXMLElementExport aElem( GetExport(), !bAutoStyles,
2357 : XML_NAMESPACE_FIELD, XML_FIELDMARK_END,
2358 0 : false, false );
2359 : }
2360 : else
2361 : {
2362 0 : if (xFormField.is())
2363 : {
2364 0 : OUString sName;
2365 0 : Reference< ::com::sun::star::container::XNameAccess > xParameters(xFormField->getParameters(), UNO_QUERY);
2366 0 : if (xParameters.is() && xParameters->hasByName("Name"))
2367 : {
2368 0 : const Any aValue = xParameters->getByName("Name");
2369 0 : aValue >>= sName;
2370 : }
2371 0 : if (sName.isEmpty())
2372 : { // name attribute is mandatory, so have to pull a
2373 : // rabbit out of the hat here
2374 0 : sName = sFieldMarkName + OUString::number(
2375 0 : m_xImpl->GetFieldMarkIndex(xFormField));
2376 : }
2377 0 : GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME,
2378 0 : sName);
2379 0 : SvXMLElementExport aElem( GetExport(), !bAutoStyles,
2380 : XML_NAMESPACE_TEXT, XML_BOOKMARK_END,
2381 0 : false, false );
2382 : }
2383 0 : }
2384 : }
2385 : }
2386 11 : else if (sType.equals(sTextFieldStartEnd))
2387 : {
2388 0 : if (!bAutoStyles)
2389 : {
2390 0 : if (GetExport().getDefaultVersion() > SvtSaveOptions::ODFVER_012)
2391 : {
2392 0 : Reference<XNamed> xBookmark(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
2393 0 : if (xBookmark.is())
2394 : {
2395 0 : GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, xBookmark->getName());
2396 : }
2397 0 : Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
2398 0 : if (xFormField.is())
2399 : {
2400 0 : GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_TYPE, xFormField->getFieldType());
2401 : }
2402 0 : GetExport().StartElement(XML_NAMESPACE_FIELD, XML_FIELDMARK, false);
2403 0 : if (xFormField.is())
2404 : {
2405 0 : FieldParamExporter(&GetExport(), xFormField->getParameters()).Export();
2406 : }
2407 0 : GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK, false);
2408 : }
2409 : else
2410 : {
2411 0 : Reference<XNamed> xBookmark(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
2412 0 : if (xBookmark.is())
2413 : {
2414 0 : GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, xBookmark->getName());
2415 0 : SvXMLElementExport aElem( GetExport(), !bAutoStyles,
2416 : XML_NAMESPACE_TEXT, XML_BOOKMARK,
2417 0 : false, false );
2418 0 : }
2419 : }
2420 : }
2421 : }
2422 11 : else if (sType.equals(sSoftPageBreak))
2423 : {
2424 11 : exportSoftPageBreak(xPropSet, bAutoStyles);
2425 : }
2426 : else {
2427 : OSL_FAIL("unknown text portion type");
2428 7327 : }
2429 : }
2430 : else
2431 : {
2432 0 : Reference<XServiceInfo> xServiceInfo( xTxtRange, UNO_QUERY );
2433 0 : if( xServiceInfo->supportsService( sTextFieldService ) )
2434 : {
2435 0 : exportTextField( xTxtRange, bAutoStyles, bIsProgress );
2436 0 : bPrevCharIsSpace = false;
2437 : }
2438 : else
2439 : {
2440 : // no TextPortionType property -> non-Writer app -> text
2441 0 : exportTextRange( xTxtRange, bAutoStyles, bPrevCharIsSpace, openFieldMark );
2442 0 : }
2443 : }
2444 7327 : }
2445 :
2446 : // now that there are nested enumerations for meta(-field), this may be valid!
2447 : // DBG_ASSERT( !bOpenRuby, "Red Alert: Ruby still open!" );
2448 2506 : }
2449 :
2450 0 : void XMLTextParagraphExport::exportTable(
2451 : const Reference < XTextContent > &,
2452 : bool /*bAutoStyles*/, bool /*bIsProgress*/ )
2453 : {
2454 0 : }
2455 :
2456 751 : void XMLTextParagraphExport::exportTextField(
2457 : const Reference < XTextRange > & rTextRange,
2458 : bool bAutoStyles, bool bIsProgress )
2459 : {
2460 751 : Reference < XPropertySet > xPropSet( rTextRange, UNO_QUERY );
2461 : // non-Writer apps need not support Property TextField, so test first
2462 751 : if (xPropSet->getPropertySetInfo()->hasPropertyByName( sTextField ))
2463 : {
2464 751 : Reference < XTextField > xTxtFld(xPropSet->getPropertyValue( sTextField ), uno::UNO_QUERY);
2465 : DBG_ASSERT( xTxtFld.is(), "text field missing" );
2466 751 : if( xTxtFld.is() )
2467 : {
2468 751 : exportTextField(xTxtFld, bAutoStyles, bIsProgress, true);
2469 : }
2470 : else
2471 : {
2472 : // write only characters
2473 0 : GetExport().Characters(rTextRange->getString());
2474 751 : }
2475 751 : }
2476 751 : }
2477 :
2478 873 : void XMLTextParagraphExport::exportTextField(
2479 : const Reference < XTextField > & xTextField,
2480 : const bool bAutoStyles, const bool bIsProgress,
2481 : const bool bRecursive )
2482 : {
2483 873 : if ( bAutoStyles )
2484 : {
2485 : pFieldExport->ExportFieldAutoStyle( xTextField, bIsProgress,
2486 446 : bRecursive );
2487 : }
2488 : else
2489 : {
2490 427 : pFieldExport->ExportField( xTextField, bIsProgress );
2491 : }
2492 873 : }
2493 :
2494 11 : void XMLTextParagraphExport::exportSoftPageBreak(
2495 : const Reference<XPropertySet> & ,
2496 : bool )
2497 : {
2498 11 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT,
2499 : XML_SOFT_PAGE_BREAK, false,
2500 11 : false );
2501 11 : }
2502 :
2503 2006 : void XMLTextParagraphExport::exportTextMark(
2504 : const Reference<XPropertySet> & rPropSet,
2505 : const OUString& rProperty,
2506 : const enum XMLTokenEnum pElements[],
2507 : bool bAutoStyles)
2508 : {
2509 : // mib said: "Hau wech!"
2510 :
2511 : // (Originally, I'd export a span element in case the (book|reference)mark
2512 : // was formatted. This actually makes a difference in case some pervert
2513 : // sets a point reference mark in the document and, say, formats it bold.
2514 : // This basically meaningless formatting will now been thrown away
2515 : // (aka cleaned up), since mib said: ... dvo
2516 :
2517 2006 : if (!bAutoStyles)
2518 : {
2519 : // name element
2520 2006 : Reference<XNamed> xName(rPropSet->getPropertyValue(rProperty), UNO_QUERY);
2521 2006 : GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME,
2522 4012 : xName->getName());
2523 :
2524 : // start, end, or point-reference?
2525 : sal_Int8 nElement;
2526 2006 : if( *static_cast<sal_Bool const *>(rPropSet->getPropertyValue(sIsCollapsed).getValue()) )
2527 : {
2528 30 : nElement = 0;
2529 : }
2530 : else
2531 : {
2532 1976 : nElement = *static_cast<sal_Bool const *>(rPropSet->getPropertyValue(sIsStart).getValue()) ? 1 : 2;
2533 : }
2534 :
2535 : // bookmark, bookmark-start: xml:id and RDFa for RDF metadata
2536 2006 : if( nElement < 2 ) {
2537 1018 : GetExport().AddAttributeXmlId(xName);
2538 : const uno::Reference<text::XTextContent> xTextContent(
2539 1018 : xName, uno::UNO_QUERY_THROW);
2540 1018 : GetExport().AddAttributesRDFa(xTextContent);
2541 : }
2542 :
2543 : // export element
2544 : DBG_ASSERT(pElements != NULL, "illegal element array");
2545 : DBG_ASSERT(nElement >= 0, "illegal element number");
2546 : DBG_ASSERT(nElement <= 2, "illegal element number");
2547 2006 : SvXMLElementExport aElem(GetExport(),
2548 2006 : XML_NAMESPACE_TEXT, pElements[nElement],
2549 4012 : false, false);
2550 : }
2551 : // else: no styles. (see above)
2552 2006 : }
2553 :
2554 13 : static bool lcl_txtpara_isBoundAsChar(
2555 : const Reference < XPropertySet > & rPropSet,
2556 : const Reference < XPropertySetInfo > & rPropSetInfo )
2557 : {
2558 13 : bool bIsBoundAsChar = false;
2559 13 : OUString sAnchorType( "AnchorType" );
2560 13 : if( rPropSetInfo->hasPropertyByName( sAnchorType ) )
2561 : {
2562 : TextContentAnchorType eAnchor;
2563 13 : rPropSet->getPropertyValue( sAnchorType ) >>= eAnchor;
2564 13 : bIsBoundAsChar = TextContentAnchorType_AS_CHARACTER == eAnchor;
2565 : }
2566 :
2567 13 : return bIsBoundAsChar;
2568 : }
2569 :
2570 94 : XMLShapeExportFlags XMLTextParagraphExport::addTextFrameAttributes(
2571 : const Reference < XPropertySet >& rPropSet,
2572 : bool bShape,
2573 : OUString *pMinHeightValue,
2574 : OUString *pMinWidthValue)
2575 : {
2576 94 : XMLShapeExportFlags nShapeFeatures = SEF_DEFAULT;
2577 :
2578 : // draw:name (#97662#: not for shapes, since those names will be
2579 : // treated in the shape export)
2580 94 : if( !bShape )
2581 : {
2582 74 : Reference < XNamed > xNamed( rPropSet, UNO_QUERY );
2583 74 : if( xNamed.is() )
2584 : {
2585 74 : OUString sName( xNamed->getName() );
2586 74 : if( !sName.isEmpty() )
2587 70 : GetExport().AddAttribute( XML_NAMESPACE_DRAW, XML_NAME,
2588 140 : xNamed->getName() );
2589 74 : }
2590 : }
2591 :
2592 94 : OUStringBuffer sValue;
2593 :
2594 : // text:anchor-type
2595 94 : TextContentAnchorType eAnchor = TextContentAnchorType_AT_PARAGRAPH;
2596 94 : rPropSet->getPropertyValue( sAnchorType ) >>= eAnchor;
2597 : {
2598 94 : XMLAnchorTypePropHdl aAnchorTypeHdl;
2599 188 : OUString sTmp;
2600 : aAnchorTypeHdl.exportXML( sTmp, uno::makeAny(eAnchor),
2601 94 : GetExport().GetMM100UnitConverter() );
2602 188 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_ANCHOR_TYPE, sTmp );
2603 : }
2604 :
2605 : // text:anchor-page-number
2606 94 : if( TextContentAnchorType_AT_PAGE == eAnchor )
2607 : {
2608 5 : sal_Int16 nPage = 0;
2609 5 : rPropSet->getPropertyValue( sAnchorPageNo ) >>= nPage;
2610 : SAL_WARN_IF(nPage <= 0, "xmloff",
2611 : "ERROR: writing invalid anchor-page-number 0");
2612 5 : ::sax::Converter::convertNumber( sValue, (sal_Int32)nPage );
2613 5 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_ANCHOR_PAGE_NUMBER,
2614 10 : sValue.makeStringAndClear() );
2615 : }
2616 : else
2617 : {
2618 : // #92210#
2619 89 : nShapeFeatures |= XMLShapeExportFlags::NO_WS;
2620 : }
2621 :
2622 : // OD 2004-06-01 #i27691# - correction: no export of svg:x, if object
2623 : // is anchored as-character.
2624 168 : if ( !bShape &&
2625 74 : eAnchor != TextContentAnchorType_AS_CHARACTER )
2626 : {
2627 : // svg:x
2628 65 : sal_Int16 nHoriOrient = HoriOrientation::NONE;
2629 65 : rPropSet->getPropertyValue( sHoriOrient ) >>= nHoriOrient;
2630 65 : if( HoriOrientation::NONE == nHoriOrient )
2631 : {
2632 59 : sal_Int32 nPos = 0;
2633 59 : rPropSet->getPropertyValue( sHoriOrientPosition ) >>= nPos;
2634 59 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
2635 118 : sValue, nPos );
2636 59 : GetExport().AddAttribute( XML_NAMESPACE_SVG, XML_X,
2637 118 : sValue.makeStringAndClear() );
2638 65 : }
2639 : }
2640 29 : else if( TextContentAnchorType_AS_CHARACTER == eAnchor )
2641 11 : nShapeFeatures = (nShapeFeatures & ~XMLShapeExportFlags::X);
2642 :
2643 94 : if( !bShape || TextContentAnchorType_AS_CHARACTER == eAnchor )
2644 : {
2645 : // svg:y
2646 76 : sal_Int16 nVertOrient = VertOrientation::NONE;
2647 76 : rPropSet->getPropertyValue( sVertOrient ) >>= nVertOrient;
2648 76 : if( VertOrientation::NONE == nVertOrient )
2649 : {
2650 59 : sal_Int32 nPos = 0;
2651 59 : rPropSet->getPropertyValue( sVertOrientPosition ) >>= nPos;
2652 59 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
2653 118 : sValue, nPos );
2654 59 : GetExport().AddAttribute( XML_NAMESPACE_SVG, XML_Y,
2655 118 : sValue.makeStringAndClear() );
2656 : }
2657 76 : if( bShape )
2658 2 : nShapeFeatures = (nShapeFeatures & ~XMLShapeExportFlags::Y);
2659 : }
2660 :
2661 188 : Reference< XPropertySetInfo > xPropSetInfo(rPropSet->getPropertySetInfo());
2662 :
2663 : // svg:width
2664 94 : sal_Int16 nWidthType = SizeType::FIX;
2665 94 : if( xPropSetInfo->hasPropertyByName( sWidthType ) )
2666 : {
2667 59 : rPropSet->getPropertyValue( sWidthType ) >>= nWidthType;
2668 : }
2669 94 : if( xPropSetInfo->hasPropertyByName( sWidth ) )
2670 : {
2671 74 : sal_Int32 nWidth = 0;
2672 : // VAR size will be written as zero min-size
2673 74 : if( SizeType::VARIABLE != nWidthType )
2674 : {
2675 74 : rPropSet->getPropertyValue( sWidth ) >>= nWidth;
2676 : }
2677 74 : GetExport().GetMM100UnitConverter().convertMeasureToXML(sValue, nWidth);
2678 74 : if( SizeType::FIX != nWidthType )
2679 : {
2680 : assert(pMinWidthValue);
2681 0 : if (pMinWidthValue)
2682 : {
2683 0 : *pMinWidthValue = sValue.makeStringAndClear();
2684 : }
2685 : }
2686 : else
2687 74 : GetExport().AddAttribute( XML_NAMESPACE_SVG, XML_WIDTH,
2688 148 : sValue.makeStringAndClear() );
2689 : }
2690 94 : bool bSyncWidth = false;
2691 94 : if( xPropSetInfo->hasPropertyByName( sIsSyncWidthToHeight ) )
2692 : {
2693 74 : bSyncWidth = *static_cast<sal_Bool const *>(rPropSet->getPropertyValue( sIsSyncWidthToHeight ).getValue());
2694 74 : if( bSyncWidth )
2695 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_REL_WIDTH,
2696 0 : XML_SCALE );
2697 : }
2698 94 : if( !bSyncWidth && xPropSetInfo->hasPropertyByName( sRelativeWidth ) )
2699 : {
2700 94 : sal_Int16 nRelWidth = 0;
2701 94 : rPropSet->getPropertyValue( sRelativeWidth ) >>= nRelWidth;
2702 : DBG_ASSERT( nRelWidth >= 0 && nRelWidth <= 254,
2703 : "Got illegal relative width from API" );
2704 94 : if( nRelWidth > 0 )
2705 : {
2706 4 : ::sax::Converter::convertPercent( sValue, nRelWidth );
2707 4 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_REL_WIDTH,
2708 8 : sValue.makeStringAndClear() );
2709 : }
2710 : }
2711 :
2712 : // svg:height, fo:min-height or style:rel-height
2713 94 : sal_Int16 nSizeType = SizeType::FIX;
2714 94 : if( xPropSetInfo->hasPropertyByName( sSizeType ) )
2715 : {
2716 59 : rPropSet->getPropertyValue( sSizeType ) >>= nSizeType;
2717 : }
2718 94 : bool bSyncHeight = false;
2719 94 : if( xPropSetInfo->hasPropertyByName( sIsSyncHeightToWidth ) )
2720 : {
2721 74 : bSyncHeight = *static_cast<sal_Bool const *>(rPropSet->getPropertyValue( sIsSyncHeightToWidth ).getValue());
2722 : }
2723 94 : sal_Int16 nRelHeight = 0;
2724 94 : if( !bSyncHeight && xPropSetInfo->hasPropertyByName( sRelativeHeight ) )
2725 : {
2726 94 : rPropSet->getPropertyValue( sRelativeHeight ) >>= nRelHeight;
2727 : }
2728 94 : if( xPropSetInfo->hasPropertyByName( sHeight ) )
2729 : {
2730 74 : sal_Int32 nHeight = 0;
2731 74 : if( SizeType::VARIABLE != nSizeType )
2732 : {
2733 74 : rPropSet->getPropertyValue( sHeight ) >>= nHeight;
2734 : }
2735 74 : GetExport().GetMM100UnitConverter().convertMeasureToXML( sValue,
2736 148 : nHeight );
2737 74 : if( SizeType::FIX != nSizeType && 0==nRelHeight && !bSyncHeight &&
2738 : pMinHeightValue )
2739 22 : *pMinHeightValue = sValue.makeStringAndClear();
2740 : else
2741 52 : GetExport().AddAttribute( XML_NAMESPACE_SVG, XML_HEIGHT,
2742 104 : sValue.makeStringAndClear() );
2743 : }
2744 94 : if( bSyncHeight )
2745 : {
2746 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_REL_HEIGHT,
2747 0 : SizeType::MIN == nSizeType ? XML_SCALE_MIN : XML_SCALE );
2748 :
2749 : }
2750 94 : else if( nRelHeight > 0 )
2751 : {
2752 4 : ::sax::Converter::convertPercent( sValue, nRelHeight );
2753 4 : if( SizeType::MIN == nSizeType )
2754 : {
2755 : assert(pMinHeightValue);
2756 0 : if (pMinHeightValue)
2757 : {
2758 0 : *pMinHeightValue = sValue.makeStringAndClear();
2759 : }
2760 : }
2761 : else
2762 4 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_REL_HEIGHT,
2763 8 : sValue.makeStringAndClear() );
2764 : }
2765 :
2766 188 : OUString sZOrder( "ZOrder" );
2767 94 : if( xPropSetInfo->hasPropertyByName( sZOrder ) )
2768 : {
2769 94 : sal_Int32 nZIndex = 0;
2770 94 : rPropSet->getPropertyValue( sZOrder ) >>= nZIndex;
2771 94 : if( -1 != nZIndex )
2772 : {
2773 94 : ::sax::Converter::convertNumber( sValue, nZIndex );
2774 94 : GetExport().AddAttribute( XML_NAMESPACE_DRAW, XML_ZINDEX,
2775 188 : sValue.makeStringAndClear() );
2776 : }
2777 : }
2778 :
2779 188 : return nShapeFeatures;
2780 : }
2781 :
2782 196 : void XMLTextParagraphExport::exportAnyTextFrame(
2783 : const Reference < XTextContent > & rTxtCntnt,
2784 : FrameType eType,
2785 : bool bAutoStyles,
2786 : bool bIsProgress,
2787 : bool bExportContent,
2788 : const Reference < XPropertySet > *pRangePropSet)
2789 : {
2790 196 : Reference < XPropertySet > xPropSet( rTxtCntnt, UNO_QUERY );
2791 :
2792 196 : if( bAutoStyles )
2793 : {
2794 102 : if( FT_EMBEDDED == eType )
2795 9 : _collectTextEmbeddedAutoStyles( xPropSet );
2796 : // No text frame style for shapes (#i28745#)
2797 93 : else if ( FT_SHAPE != eType )
2798 65 : Add( XML_STYLE_FAMILY_TEXT_FRAME, xPropSet );
2799 :
2800 306 : if( pRangePropSet && lcl_txtpara_isBoundAsChar( xPropSet,
2801 102 : xPropSet->getPropertySetInfo() ) )
2802 0 : Add( XML_STYLE_FAMILY_TEXT_TEXT, *pRangePropSet );
2803 :
2804 102 : switch( eType )
2805 : {
2806 : case FT_TEXT:
2807 : {
2808 : // frame bound frames
2809 59 : if ( bExportContent )
2810 : {
2811 0 : Reference < XTextFrame > xTxtFrame( rTxtCntnt, UNO_QUERY );
2812 0 : Reference < XText > xTxt(xTxtFrame->getText());
2813 0 : exportFrameFrames( true, bIsProgress, &xTxtFrame );
2814 0 : exportText( xTxt, bAutoStyles, bIsProgress, true );
2815 : }
2816 : }
2817 59 : break;
2818 : case FT_SHAPE:
2819 : {
2820 28 : Reference < XShape > xShape( rTxtCntnt, UNO_QUERY );
2821 28 : GetExport().GetShapeExport()->collectShapeAutoStyles( xShape );
2822 : }
2823 28 : break;
2824 : default:
2825 15 : break;
2826 : }
2827 : }
2828 : else
2829 : {
2830 94 : Reference< XPropertySetInfo > xPropSetInfo(xPropSet->getPropertySetInfo());
2831 188 : Reference< XPropertyState > xPropState( xPropSet, UNO_QUERY );
2832 : {
2833 107 : bool bAddCharStyles = pRangePropSet &&
2834 107 : lcl_txtpara_isBoundAsChar( xPropSet, xPropSetInfo );
2835 :
2836 : bool bIsUICharStyle;
2837 94 : bool bHasAutoStyle = false;
2838 :
2839 94 : OUString sStyle;
2840 :
2841 94 : if( bAddCharStyles )
2842 : {
2843 : bool bDummy;
2844 11 : sStyle = FindTextStyleAndHyperlink( *pRangePropSet, bDummy, bIsUICharStyle, bHasAutoStyle );
2845 : }
2846 : else
2847 83 : bIsUICharStyle = false;
2848 :
2849 : bool bDoSomething = bIsUICharStyle
2850 94 : && aCharStyleNamesPropInfoCache.hasProperty( *pRangePropSet );
2851 : XMLTextCharStyleNamesElementExport aCharStylesExport(
2852 94 : GetExport(), bDoSomething, bHasAutoStyle,
2853 : bDoSomething ? *pRangePropSet : Reference<XPropertySet>(),
2854 282 : sCharStyleNames );
2855 :
2856 94 : if( !sStyle.isEmpty() )
2857 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_STYLE_NAME,
2858 0 : GetExport().EncodeStyleName( sStyle ) );
2859 : {
2860 188 : SvXMLElementExport aElem( GetExport(), !sStyle.isEmpty(),
2861 188 : XML_NAMESPACE_TEXT, XML_SPAN, false, false );
2862 : {
2863 94 : SvXMLElementExport aElement( GetExport(),
2864 168 : FT_SHAPE != eType &&
2865 : addHyperlinkAttributes( xPropSet,
2866 74 : xPropState,xPropSetInfo ),
2867 188 : XML_NAMESPACE_DRAW, XML_A, false, false );
2868 94 : switch( eType )
2869 : {
2870 : case FT_TEXT:
2871 59 : _exportTextFrame( xPropSet, xPropSetInfo, bIsProgress );
2872 59 : break;
2873 : case FT_GRAPHIC:
2874 6 : _exportTextGraphic( xPropSet, xPropSetInfo );
2875 6 : break;
2876 : case FT_EMBEDDED:
2877 9 : _exportTextEmbedded( xPropSet, xPropSetInfo );
2878 9 : break;
2879 : case FT_SHAPE:
2880 : {
2881 20 : Reference < XShape > xShape( rTxtCntnt, UNO_QUERY );
2882 : XMLShapeExportFlags nFeatures =
2883 20 : addTextFrameAttributes( xPropSet, true );
2884 20 : GetExport().GetShapeExport()
2885 20 : ->exportShape( xShape, nFeatures );
2886 : }
2887 20 : break;
2888 94 : }
2889 94 : }
2890 94 : }
2891 94 : }
2892 196 : }
2893 196 : }
2894 :
2895 59 : void XMLTextParagraphExport::_exportTextFrame(
2896 : const Reference < XPropertySet > & rPropSet,
2897 : const Reference < XPropertySetInfo > & rPropSetInfo,
2898 : bool bIsProgress )
2899 : {
2900 59 : Reference < XTextFrame > xTxtFrame( rPropSet, UNO_QUERY );
2901 118 : Reference < XText > xTxt(xTxtFrame->getText());
2902 :
2903 118 : OUString sStyle;
2904 59 : if( rPropSetInfo->hasPropertyByName( sFrameStyleName ) )
2905 : {
2906 59 : rPropSet->getPropertyValue( sFrameStyleName ) >>= sStyle;
2907 : }
2908 :
2909 118 : OUString sAutoStyle( sStyle );
2910 118 : OUString aMinHeightValue;
2911 118 : OUString sMinWidthValue;
2912 59 : sAutoStyle = Find( XML_STYLE_FAMILY_TEXT_FRAME, rPropSet, sStyle );
2913 59 : if( !sAutoStyle.isEmpty() )
2914 59 : GetExport().AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE_NAME,
2915 118 : GetExport().EncodeStyleName( sAutoStyle ) );
2916 59 : addTextFrameAttributes(rPropSet, false, &aMinHeightValue, &sMinWidthValue);
2917 :
2918 59 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_DRAW,
2919 118 : XML_FRAME, false, true );
2920 :
2921 59 : if( !aMinHeightValue.isEmpty() )
2922 22 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_MIN_HEIGHT,
2923 22 : aMinHeightValue );
2924 :
2925 59 : if (!sMinWidthValue.isEmpty())
2926 : {
2927 0 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_MIN_WIDTH,
2928 0 : sMinWidthValue );
2929 : }
2930 :
2931 : // draw:chain-next-name
2932 59 : if( rPropSetInfo->hasPropertyByName( sChainNextName ) )
2933 : {
2934 59 : OUString sNext;
2935 59 : if( (rPropSet->getPropertyValue( sChainNextName ) >>= sNext) && !sNext.isEmpty() )
2936 0 : GetExport().AddAttribute( XML_NAMESPACE_DRAW,
2937 : XML_CHAIN_NEXT_NAME,
2938 0 : sNext );
2939 : }
2940 :
2941 : {
2942 59 : SvXMLElementExport aElement( GetExport(), XML_NAMESPACE_DRAW,
2943 59 : XML_TEXT_BOX, true, true );
2944 :
2945 : // frame bound frames
2946 59 : exportFramesBoundToFrame( xTxtFrame, bIsProgress );
2947 :
2948 59 : exportText( xTxt, false, bIsProgress, true );
2949 : }
2950 :
2951 : // script:events
2952 118 : Reference<XEventsSupplier> xEventsSupp( xTxtFrame, UNO_QUERY );
2953 59 : GetExport().GetEventExport().Export(xEventsSupp);
2954 :
2955 : // image map
2956 59 : GetExport().GetImageMapExport().Export( rPropSet );
2957 :
2958 : // svg:title and svg:desc (#i73249#)
2959 118 : exportTitleAndDescription( rPropSet, rPropSetInfo );
2960 59 : }
2961 :
2962 15 : void XMLTextParagraphExport::exportContour(
2963 : const Reference < XPropertySet > & rPropSet,
2964 : const Reference < XPropertySetInfo > & rPropSetInfo )
2965 : {
2966 15 : if( !rPropSetInfo->hasPropertyByName( sContourPolyPolygon ) )
2967 : {
2968 15 : return;
2969 : }
2970 :
2971 15 : PointSequenceSequence aSourcePolyPolygon;
2972 15 : rPropSet->getPropertyValue( sContourPolyPolygon ) >>= aSourcePolyPolygon;
2973 : const basegfx::B2DPolyPolygon aPolyPolygon(
2974 : basegfx::tools::UnoPointSequenceSequenceToB2DPolyPolygon(
2975 15 : aSourcePolyPolygon));
2976 15 : const sal_uInt32 nPolygonCount(aPolyPolygon.count());
2977 :
2978 15 : if(!nPolygonCount)
2979 : {
2980 15 : return;
2981 : }
2982 :
2983 0 : const basegfx::B2DRange aPolyPolygonRange(aPolyPolygon.getB2DRange());
2984 0 : bool bPixel(false);
2985 :
2986 0 : if( rPropSetInfo->hasPropertyByName( sIsPixelContour ) )
2987 : {
2988 0 : bPixel = *static_cast<sal_Bool const *>(rPropSet->getPropertyValue( sIsPixelContour ).getValue());
2989 : }
2990 :
2991 : // svg: width
2992 0 : OUStringBuffer aStringBuffer( 10 );
2993 :
2994 0 : if(bPixel)
2995 : {
2996 0 : ::sax::Converter::convertMeasurePx(aStringBuffer, basegfx::fround(aPolyPolygonRange.getWidth()));
2997 : }
2998 : else
2999 : {
3000 0 : GetExport().GetMM100UnitConverter().convertMeasureToXML(aStringBuffer, basegfx::fround(aPolyPolygonRange.getWidth()));
3001 : }
3002 :
3003 0 : GetExport().AddAttribute(XML_NAMESPACE_SVG, XML_WIDTH, aStringBuffer.makeStringAndClear());
3004 :
3005 : // svg: height
3006 0 : if(bPixel)
3007 : {
3008 0 : ::sax::Converter::convertMeasurePx(aStringBuffer, basegfx::fround(aPolyPolygonRange.getHeight()));
3009 : }
3010 : else
3011 : {
3012 0 : GetExport().GetMM100UnitConverter().convertMeasureToXML(aStringBuffer, basegfx::fround(aPolyPolygonRange.getHeight()));
3013 : }
3014 :
3015 0 : GetExport().AddAttribute(XML_NAMESPACE_SVG, XML_HEIGHT, aStringBuffer.makeStringAndClear());
3016 :
3017 : // svg:viewbox
3018 0 : SdXMLImExViewBox aViewBox(0.0, 0.0, aPolyPolygonRange.getWidth(), aPolyPolygonRange.getHeight());
3019 0 : GetExport().AddAttribute(XML_NAMESPACE_SVG, XML_VIEWBOX, aViewBox.GetExportString());
3020 0 : enum XMLTokenEnum eElem = XML_TOKEN_INVALID;
3021 :
3022 0 : if(1 == nPolygonCount )
3023 : {
3024 : // simple polygon shape, can be written as svg:points sequence
3025 : const OUString aPointString(
3026 : basegfx::tools::exportToSvgPoints(
3027 0 : aPolyPolygon.getB2DPolygon(0)));
3028 :
3029 : // write point array
3030 0 : GetExport().AddAttribute(XML_NAMESPACE_DRAW, XML_POINTS, aPointString);
3031 0 : eElem = XML_CONTOUR_POLYGON;
3032 : }
3033 : else
3034 : {
3035 : // polypolygon, needs to be written as a svg:path sequence
3036 : const OUString aPolygonString(
3037 : basegfx::tools::exportToSvgD(
3038 : aPolyPolygon,
3039 : true, // bUseRelativeCoordinates
3040 : false, // bDetectQuadraticBeziers: not used in old, but maybe activated now
3041 0 : true)); // bHandleRelativeNextPointCompatible
3042 :
3043 : // write point array
3044 0 : GetExport().AddAttribute( XML_NAMESPACE_SVG, XML_D, aPolygonString);
3045 0 : eElem = XML_CONTOUR_PATH;
3046 : }
3047 :
3048 0 : if( rPropSetInfo->hasPropertyByName( sIsAutomaticContour ) )
3049 : {
3050 0 : bool bTmp = *static_cast<sal_Bool const *>(rPropSet->getPropertyValue(
3051 0 : sIsAutomaticContour ).getValue());
3052 0 : GetExport().AddAttribute( XML_NAMESPACE_DRAW,
3053 0 : XML_RECREATE_ON_EDIT, bTmp ? XML_TRUE : XML_FALSE );
3054 : }
3055 :
3056 : // write object now
3057 0 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_DRAW, eElem,
3058 0 : true, true );
3059 : }
3060 :
3061 6 : void XMLTextParagraphExport::_exportTextGraphic(
3062 : const Reference < XPropertySet > & rPropSet,
3063 : const Reference < XPropertySetInfo > & rPropSetInfo )
3064 : {
3065 6 : OUString sStyle;
3066 6 : if( rPropSetInfo->hasPropertyByName( sFrameStyleName ) )
3067 : {
3068 6 : rPropSet->getPropertyValue( sFrameStyleName ) >>= sStyle;
3069 : }
3070 :
3071 12 : OUString sAutoStyle( sStyle );
3072 6 : sAutoStyle = Find( XML_STYLE_FAMILY_TEXT_FRAME, rPropSet, sStyle );
3073 6 : if( !sAutoStyle.isEmpty() )
3074 6 : GetExport().AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE_NAME,
3075 12 : GetExport().EncodeStyleName( sAutoStyle ) );
3076 6 : addTextFrameAttributes( rPropSet, false );
3077 :
3078 : // svg:transform
3079 6 : sal_Int16 nVal = 0;
3080 6 : rPropSet->getPropertyValue( sGraphicRotation ) >>= nVal;
3081 6 : if( nVal != 0 )
3082 : {
3083 0 : OUStringBuffer sRet( GetXMLToken(XML_ROTATE).getLength()+4 );
3084 0 : sRet.append( GetXMLToken(XML_ROTATE));
3085 0 : sRet.append( '(' );
3086 0 : ::sax::Converter::convertNumber( sRet, (sal_Int32)nVal );
3087 0 : sRet.append( ')' );
3088 0 : GetExport().AddAttribute( XML_NAMESPACE_SVG, XML_TRANSFORM,
3089 0 : sRet.makeStringAndClear() );
3090 : }
3091 :
3092 : // original content
3093 12 : SvXMLElementExport aElem(GetExport(), XML_NAMESPACE_DRAW, XML_FRAME, false, true);
3094 :
3095 : // replacement graphic for backwards compatibility, but
3096 : // only for SVG currently
3097 12 : OUString sReplacementOrigURL;
3098 6 : rPropSet->getPropertyValue( sReplacementGraphicURL ) >>= sReplacementOrigURL;
3099 :
3100 : // xlink:href
3101 12 : OUString sOrigURL;
3102 6 : rPropSet->getPropertyValue( sGraphicURL ) >>= sOrigURL;
3103 12 : OUString sURL(GetExport().AddEmbeddedGraphicObject( sOrigURL ));
3104 :
3105 : // If there still is no url, then then graphic is empty
3106 6 : if( !sURL.isEmpty() )
3107 : {
3108 6 : GetExport().AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sURL );
3109 6 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
3110 6 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
3111 6 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE,
3112 6 : XML_ONLOAD );
3113 : }
3114 :
3115 : // draw:filter-name
3116 12 : OUString sGrfFilter;
3117 6 : rPropSet->getPropertyValue( sGraphicFilter ) >>= sGrfFilter;
3118 6 : if( !sGrfFilter.isEmpty() )
3119 0 : GetExport().AddAttribute( XML_NAMESPACE_DRAW, XML_FILTER_NAME,
3120 0 : sGrfFilter );
3121 :
3122 : {
3123 6 : SvXMLElementExport aElement( GetExport(), XML_NAMESPACE_DRAW,
3124 6 : XML_IMAGE, false, true );
3125 :
3126 : // optional office:binary-data
3127 6 : GetExport().AddEmbeddedGraphicObjectAsBase64( sOrigURL );
3128 : }
3129 :
3130 : //Resolves: fdo#62461 put preferred image first above, followed by
3131 : //fallback here
3132 6 : if (!sReplacementOrigURL.isEmpty())
3133 : {
3134 0 : const OUString sReplacementURL(GetExport().AddEmbeddedGraphicObject( sReplacementOrigURL ));
3135 :
3136 : // If there is no url, then then graphic is empty
3137 0 : if(sReplacementURL.getLength())
3138 : {
3139 0 : GetExport().AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sReplacementURL);
3140 0 : GetExport().AddAttribute(XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE);
3141 0 : GetExport().AddAttribute(XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED);
3142 0 : GetExport().AddAttribute(XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD);
3143 :
3144 : // xlink:href for replacement, only written for Svg content
3145 0 : SvXMLElementExport aElement(GetExport(), XML_NAMESPACE_DRAW, XML_IMAGE, false, true);
3146 :
3147 : // optional office:binary-data
3148 0 : GetExport().AddEmbeddedGraphicObjectAsBase64(sReplacementURL);
3149 0 : }
3150 : }
3151 :
3152 :
3153 :
3154 : // script:events
3155 12 : Reference<XEventsSupplier> xEventsSupp( rPropSet, UNO_QUERY );
3156 6 : GetExport().GetEventExport().Export(xEventsSupp);
3157 :
3158 : // image map
3159 6 : GetExport().GetImageMapExport().Export( rPropSet );
3160 :
3161 : // svg:title and svg:desc (#i73249#)
3162 6 : exportTitleAndDescription( rPropSet, rPropSetInfo );
3163 :
3164 : // draw:contour
3165 12 : exportContour( rPropSet, rPropSetInfo );
3166 6 : }
3167 :
3168 0 : void XMLTextParagraphExport::_collectTextEmbeddedAutoStyles(const Reference < XPropertySet > & )
3169 : {
3170 : DBG_ASSERT( false, "no API implementation avialable" );
3171 0 : }
3172 :
3173 0 : void XMLTextParagraphExport::_exportTextEmbedded(
3174 : const Reference < XPropertySet > &,
3175 : const Reference < XPropertySetInfo > & )
3176 : {
3177 : DBG_ASSERT( false, "no API implementation avialable" );
3178 0 : }
3179 :
3180 9 : void XMLTextParagraphExport::exportEvents( const Reference < XPropertySet > & rPropSet )
3181 : {
3182 : // script:events
3183 9 : Reference<XEventsSupplier> xEventsSupp( rPropSet, UNO_QUERY );
3184 9 : GetExport().GetEventExport().Export(xEventsSupp);
3185 :
3186 : // image map
3187 18 : OUString sImageMap("ImageMap");
3188 9 : if (rPropSet->getPropertySetInfo()->hasPropertyByName(sImageMap))
3189 18 : GetExport().GetImageMapExport().Export( rPropSet );
3190 9 : }
3191 :
3192 : // Implement Title/Description Elements UI (#i73249#)
3193 74 : void XMLTextParagraphExport::exportTitleAndDescription(
3194 : const Reference < XPropertySet > & rPropSet,
3195 : const Reference < XPropertySetInfo > & rPropSetInfo )
3196 : {
3197 : // svg:title
3198 74 : if( rPropSetInfo->hasPropertyByName( sTitle ) )
3199 : {
3200 74 : OUString sObjTitle;
3201 74 : rPropSet->getPropertyValue( sTitle ) >>= sObjTitle;
3202 74 : if( !sObjTitle.isEmpty() )
3203 : {
3204 0 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_SVG,
3205 0 : XML_TITLE, true, false );
3206 0 : GetExport().Characters( sObjTitle );
3207 74 : }
3208 : }
3209 :
3210 : // svg:description
3211 74 : if( rPropSetInfo->hasPropertyByName( sDescription ) )
3212 : {
3213 74 : OUString sObjDesc;
3214 74 : rPropSet->getPropertyValue( sDescription ) >>= sObjDesc;
3215 74 : if( !sObjDesc.isEmpty() )
3216 : {
3217 1 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_SVG,
3218 1 : XML_DESC, true, false );
3219 1 : GetExport().Characters( sObjDesc );
3220 74 : }
3221 : }
3222 74 : }
3223 :
3224 93 : bool XMLTextParagraphExport::addHyperlinkAttributes(
3225 : const Reference< XPropertySet > & rPropSet,
3226 : const Reference< XPropertyState > & rPropState,
3227 : const Reference< XPropertySetInfo > & rPropSetInfo )
3228 : {
3229 93 : bool bExport = false;
3230 186 : OUString sHRef, sName, sTargetFrame, sUStyleName, sVStyleName;
3231 93 : bool bServerMap = false;
3232 :
3233 205 : if( rPropSetInfo->hasPropertyByName( sHyperLinkURL ) &&
3234 186 : ( !rPropState.is() || PropertyState_DIRECT_VALUE ==
3235 93 : rPropState->getPropertyState( sHyperLinkURL ) ) )
3236 : {
3237 19 : rPropSet->getPropertyValue( sHyperLinkURL ) >>= sHRef;
3238 :
3239 19 : if( !sHRef.isEmpty() )
3240 19 : bExport = true;
3241 : }
3242 :
3243 93 : if ( sHRef.isEmpty() )
3244 : {
3245 : // hyperlink without an URL does not make sense
3246 : OSL_ENSURE( false, "hyperlink without an URL --> no export to ODF" );
3247 74 : return false;
3248 : }
3249 :
3250 38 : if ( rPropSetInfo->hasPropertyByName( sHyperLinkName )
3251 38 : && ( !rPropState.is()
3252 19 : || PropertyState_DIRECT_VALUE == rPropState->getPropertyState( sHyperLinkName ) ) )
3253 : {
3254 19 : rPropSet->getPropertyValue( sHyperLinkName ) >>= sName;
3255 19 : if( !sName.isEmpty() )
3256 0 : bExport = true;
3257 : }
3258 :
3259 38 : if ( rPropSetInfo->hasPropertyByName( sHyperLinkTarget )
3260 38 : && ( !rPropState.is()
3261 19 : || PropertyState_DIRECT_VALUE == rPropState->getPropertyState( sHyperLinkTarget ) ) )
3262 : {
3263 19 : rPropSet->getPropertyValue( sHyperLinkTarget ) >>= sTargetFrame;
3264 19 : if( !sTargetFrame.isEmpty() )
3265 0 : bExport = true;
3266 : }
3267 :
3268 38 : if ( rPropSetInfo->hasPropertyByName( sServerMap )
3269 19 : && ( !rPropState.is()
3270 0 : || PropertyState_DIRECT_VALUE == rPropState->getPropertyState( sServerMap ) ) )
3271 : {
3272 0 : bServerMap = *static_cast<sal_Bool const *>(rPropSet->getPropertyValue( sServerMap ).getValue());
3273 0 : if ( bServerMap )
3274 0 : bExport = true;
3275 : }
3276 :
3277 38 : if ( rPropSetInfo->hasPropertyByName( sUnvisitedCharStyleName )
3278 38 : && ( !rPropState.is()
3279 19 : || PropertyState_DIRECT_VALUE == rPropState->getPropertyState( sUnvisitedCharStyleName ) ) )
3280 : {
3281 19 : rPropSet->getPropertyValue( sUnvisitedCharStyleName ) >>= sUStyleName;
3282 19 : if( !sUStyleName.isEmpty() )
3283 19 : bExport = true;
3284 : }
3285 :
3286 38 : if ( rPropSetInfo->hasPropertyByName( sVisitedCharStyleName )
3287 38 : && ( !rPropState.is()
3288 19 : || PropertyState_DIRECT_VALUE == rPropState->getPropertyState( sVisitedCharStyleName ) ) )
3289 : {
3290 19 : rPropSet->getPropertyValue( sVisitedCharStyleName ) >>= sVStyleName;
3291 19 : if( !sVStyleName.isEmpty() )
3292 19 : bExport = true;
3293 : }
3294 :
3295 19 : if ( bExport )
3296 : {
3297 19 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
3298 19 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference( sHRef ) );
3299 :
3300 19 : if( !sName.isEmpty() )
3301 0 : GetExport().AddAttribute( XML_NAMESPACE_OFFICE, XML_NAME, sName );
3302 :
3303 19 : if( !sTargetFrame.isEmpty() )
3304 : {
3305 0 : GetExport().AddAttribute( XML_NAMESPACE_OFFICE,
3306 0 : XML_TARGET_FRAME_NAME, sTargetFrame );
3307 0 : enum XMLTokenEnum eTok = sTargetFrame == "_blank" ? XML_NEW : XML_REPLACE;
3308 0 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, eTok );
3309 : }
3310 :
3311 19 : if( bServerMap )
3312 0 : GetExport().AddAttribute( XML_NAMESPACE_OFFICE,
3313 0 : XML_SERVER_MAP, XML_TRUE );
3314 :
3315 19 : if( !sUStyleName.isEmpty() )
3316 19 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
3317 38 : XML_STYLE_NAME, GetExport().EncodeStyleName( sUStyleName ) );
3318 :
3319 19 : if( !sVStyleName.isEmpty() )
3320 19 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
3321 38 : XML_VISITED_STYLE_NAME, GetExport().EncodeStyleName( sVStyleName ) );
3322 : }
3323 :
3324 112 : return bExport;
3325 : }
3326 :
3327 3231 : void XMLTextParagraphExport::exportTextRangeSpan(
3328 : const com::sun::star::uno::Reference< com::sun::star::text::XTextRange > & rTextRange,
3329 : Reference< XPropertySet > & xPropSet,
3330 : Reference < XPropertySetInfo > & xPropSetInfo,
3331 : const bool bIsUICharStyle,
3332 : const bool bHasAutoStyle,
3333 : const OUString& sStyle,
3334 : bool& rPrevCharIsSpace,
3335 : FieldmarkType& openFieldMark )
3336 : {
3337 : XMLTextCharStyleNamesElementExport aCharStylesExport(
3338 3231 : GetExport(),
3339 3231 : bIsUICharStyle && aCharStyleNamesPropInfoCache.hasProperty( xPropSet, xPropSetInfo ),
3340 : bHasAutoStyle,
3341 : xPropSet,
3342 9693 : sCharStyleNames );
3343 :
3344 3231 : if ( !sStyle.isEmpty() )
3345 : {
3346 224 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_STYLE_NAME, GetExport().EncodeStyleName( sStyle ) );
3347 : }
3348 : {
3349 3231 : SvXMLElementExport aElement( GetExport(), !sStyle.isEmpty(), XML_NAMESPACE_TEXT, XML_SPAN, false, false );
3350 6462 : const OUString aText( rTextRange->getString() );
3351 3231 : SvXMLElementExport aElem2( GetExport(), TEXT == openFieldMark,
3352 : XML_NAMESPACE_TEXT, XML_TEXT_INPUT,
3353 9693 : false, false );
3354 3231 : exportText( aText, rPrevCharIsSpace );
3355 6462 : openFieldMark = NONE;
3356 3231 : }
3357 3231 : }
3358 :
3359 4523 : void XMLTextParagraphExport::exportTextRange(
3360 : const Reference< XTextRange > & rTextRange,
3361 : bool bAutoStyles,
3362 : bool& rPrevCharIsSpace,
3363 : FieldmarkType& openFieldMark )
3364 : {
3365 4523 : Reference< XPropertySet > xPropSet( rTextRange, UNO_QUERY );
3366 4523 : if ( bAutoStyles )
3367 : {
3368 1292 : Add( XML_STYLE_FAMILY_TEXT_TEXT, xPropSet );
3369 : }
3370 : else
3371 : {
3372 3231 : bool bHyperlink = false;
3373 3231 : bool bIsUICharStyle = false;
3374 3231 : bool bHasAutoStyle = false;
3375 : const OUString sStyle(
3376 3231 : FindTextStyleAndHyperlink( xPropSet, bHyperlink, bIsUICharStyle, bHasAutoStyle ) );
3377 :
3378 6462 : Reference < XPropertySetInfo > xPropSetInfo;
3379 3231 : bool bHyperlinkAttrsAdded = false;
3380 3231 : if ( bHyperlink )
3381 : {
3382 19 : Reference< XPropertyState > xPropState( xPropSet, UNO_QUERY );
3383 19 : xPropSetInfo.set( xPropSet->getPropertySetInfo() );
3384 19 : bHyperlinkAttrsAdded = addHyperlinkAttributes( xPropSet, xPropState, xPropSetInfo );
3385 : }
3386 :
3387 3231 : if ( bHyperlink && bHyperlinkAttrsAdded )
3388 : {
3389 19 : SvXMLElementExport aElem( GetExport(), true, XML_NAMESPACE_TEXT, XML_A, false, false );
3390 :
3391 : // export events (if supported)
3392 : OUString sHyperLinkEvents(
3393 38 : "HyperLinkEvents");
3394 19 : if (xPropSetInfo->hasPropertyByName(sHyperLinkEvents))
3395 : {
3396 19 : Reference< XNameReplace > xName( xPropSet->getPropertyValue( sHyperLinkEvents ), uno::UNO_QUERY );
3397 19 : GetExport().GetEventExport().Export( xName, false );
3398 : }
3399 :
3400 38 : exportTextRangeSpan( rTextRange, xPropSet, xPropSetInfo, bIsUICharStyle, bHasAutoStyle, sStyle, rPrevCharIsSpace, openFieldMark );
3401 : }
3402 : else
3403 : {
3404 3212 : exportTextRangeSpan( rTextRange, xPropSet, xPropSetInfo, bIsUICharStyle, bHasAutoStyle, sStyle, rPrevCharIsSpace, openFieldMark );
3405 3231 : }
3406 4523 : }
3407 4523 : }
3408 :
3409 3567 : void XMLTextParagraphExport::exportText( const OUString& rText,
3410 : bool& rPrevCharIsSpace, TextPNS /*eExtensionNS*/ )
3411 : {
3412 3567 : sal_Int32 nExpStartPos = 0;
3413 3567 : sal_Int32 nEndPos = rText.getLength();
3414 3567 : sal_Int32 nSpaceChars = 0;
3415 27306 : for( sal_Int32 nPos = 0; nPos < nEndPos; nPos++ )
3416 : {
3417 23739 : sal_Unicode cChar = rText[nPos];
3418 23739 : bool bExpCharAsText = true;
3419 23739 : bool bExpCharAsElement = false;
3420 23739 : bool bCurrCharIsSpace = false;
3421 23739 : switch( cChar )
3422 : {
3423 : case 0x0009: // Tab
3424 : case 0x000A: // LF
3425 : // These characters are exported as text.
3426 19 : bExpCharAsElement = true;
3427 19 : bExpCharAsText = false;
3428 19 : break;
3429 : case 0x000D:
3430 0 : break; // legal character
3431 : case 0x0020: // Blank
3432 2035 : if( rPrevCharIsSpace )
3433 : {
3434 : // If the previous character is a space character,
3435 : // too, export a special space element.
3436 554 : bExpCharAsText = false;
3437 : }
3438 2035 : bCurrCharIsSpace = true;
3439 2035 : break;
3440 : default:
3441 21685 : if( cChar < 0x0020 )
3442 : {
3443 : #ifdef DBG_UTIL
3444 : OSL_ENSURE( txtparae_bContainsIllegalCharacters ||
3445 : cChar >= 0x0020,
3446 : "illegal character in text content" );
3447 : txtparae_bContainsIllegalCharacters = true;
3448 : #endif
3449 0 : bExpCharAsText = false;
3450 : }
3451 21685 : break;
3452 : }
3453 :
3454 : // If the current character is not exported as text
3455 : // the text that has not been exported by now has to be exported now.
3456 23739 : if( nPos > nExpStartPos && !bExpCharAsText )
3457 : {
3458 : DBG_ASSERT( 0==nSpaceChars, "pending spaces" );
3459 15 : OUString sExp( rText.copy( nExpStartPos, nPos - nExpStartPos ) );
3460 15 : GetExport().Characters( sExp );
3461 15 : nExpStartPos = nPos;
3462 : }
3463 :
3464 : // If there are spaces left that have not been exported and the
3465 : // current character is not a space , the pending spaces have to be
3466 : // exported now.
3467 23739 : if( nSpaceChars > 0 && !bCurrCharIsSpace )
3468 : {
3469 : DBG_ASSERT( nExpStartPos == nPos, " pending characters" );
3470 :
3471 1 : if( nSpaceChars > 1 )
3472 : {
3473 1 : OUStringBuffer sTmp;
3474 1 : sTmp.append( (sal_Int32)nSpaceChars );
3475 1 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_C,
3476 2 : sTmp.makeStringAndClear() );
3477 : }
3478 :
3479 1 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT,
3480 1 : XML_S, false, false );
3481 :
3482 1 : nSpaceChars = 0;
3483 : }
3484 :
3485 : // If the current character has to be exported as a special
3486 : // element, the elemnt will be exported now.
3487 23739 : if( bExpCharAsElement )
3488 : {
3489 19 : switch( cChar )
3490 : {
3491 : case 0x0009: // Tab
3492 : {
3493 19 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT,
3494 : XML_TAB, false,
3495 19 : false );
3496 : }
3497 19 : break;
3498 : case 0x000A: // LF
3499 : {
3500 0 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT,
3501 : XML_LINE_BREAK, false,
3502 0 : false );
3503 : }
3504 0 : break;
3505 : }
3506 : }
3507 :
3508 : // If the current character is a space, and the previous one
3509 : // is a space, too, the number of pending spaces is incremented
3510 : // only.
3511 23739 : if( bCurrCharIsSpace && rPrevCharIsSpace )
3512 554 : nSpaceChars++;
3513 23739 : rPrevCharIsSpace = bCurrCharIsSpace;
3514 :
3515 : // If the current character is not exported as text, the start
3516 : // position for text is the position behind the current position.
3517 23739 : if( !bExpCharAsText )
3518 : {
3519 : DBG_ASSERT( nExpStartPos == nPos, "wrong export start pos" );
3520 573 : nExpStartPos = nPos+1;
3521 : }
3522 : }
3523 :
3524 3567 : if( nExpStartPos < nEndPos )
3525 : {
3526 : DBG_ASSERT( 0==nSpaceChars, " pending spaces " );
3527 2950 : OUString sExp( rText.copy( nExpStartPos, nEndPos - nExpStartPos ) );
3528 2950 : GetExport().Characters( sExp );
3529 : }
3530 :
3531 : // If there are some spaces left, they have to be exported now.
3532 3567 : if( nSpaceChars > 0 )
3533 : {
3534 105 : if( nSpaceChars > 1 )
3535 : {
3536 93 : OUStringBuffer sTmp;
3537 93 : sTmp.append( (sal_Int32)nSpaceChars );
3538 93 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_C,
3539 186 : sTmp.makeStringAndClear() );
3540 : }
3541 :
3542 105 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT, XML_S,
3543 105 : false, false );
3544 : }
3545 3567 : }
3546 :
3547 73 : void XMLTextParagraphExport::exportTextDeclarations()
3548 : {
3549 73 : pFieldExport->ExportFieldDeclarations();
3550 :
3551 : // get XPropertySet from the document and ask for AutoMarkFileURL.
3552 : // If it exists, export the auto-mark-file element.
3553 73 : Reference<XPropertySet> xPropertySet( GetExport().GetModel(), UNO_QUERY );
3554 73 : if (xPropertySet.is())
3555 : {
3556 73 : OUString sUrl;
3557 : OUString sIndexAutoMarkFileURL(
3558 146 : "IndexAutoMarkFileURL");
3559 146 : if (xPropertySet->getPropertySetInfo()->hasPropertyByName(
3560 73 : sIndexAutoMarkFileURL))
3561 : {
3562 73 : xPropertySet->getPropertyValue(sIndexAutoMarkFileURL) >>= sUrl;
3563 73 : if (!sUrl.isEmpty())
3564 : {
3565 0 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_HREF,
3566 0 : GetExport().GetRelativeReference(sUrl) );
3567 : SvXMLElementExport aAutoMarkElement(
3568 0 : GetExport(), XML_NAMESPACE_TEXT,
3569 : XML_ALPHABETICAL_INDEX_AUTO_MARK_FILE,
3570 0 : true, true );
3571 : }
3572 73 : }
3573 73 : }
3574 73 : }
3575 :
3576 168 : void XMLTextParagraphExport::exportTextDeclarations(
3577 : const Reference<XText> & rText )
3578 : {
3579 168 : pFieldExport->ExportFieldDeclarations(rText);
3580 168 : }
3581 :
3582 71 : void XMLTextParagraphExport::exportUsedDeclarations( bool bOnlyUsed )
3583 : {
3584 71 : pFieldExport->SetExportOnlyUsedFieldDeclarations( bOnlyUsed );
3585 71 : }
3586 :
3587 146 : void XMLTextParagraphExport::exportTrackedChanges(bool bAutoStyles)
3588 : {
3589 146 : if (NULL != pRedlineExport)
3590 146 : pRedlineExport->ExportChangesList( bAutoStyles );
3591 146 : }
3592 :
3593 46 : void XMLTextParagraphExport::exportTrackedChanges(
3594 : const Reference<XText> & rText,
3595 : bool bAutoStyle)
3596 : {
3597 46 : if (NULL != pRedlineExport)
3598 46 : pRedlineExport->ExportChangesList(rText, bAutoStyle);
3599 46 : }
3600 :
3601 46 : void XMLTextParagraphExport::recordTrackedChangesForXText(
3602 : const Reference<XText> & rText )
3603 : {
3604 46 : if (NULL != pRedlineExport)
3605 46 : pRedlineExport->SetCurrentXText(rText);
3606 46 : }
3607 :
3608 46 : void XMLTextParagraphExport::recordTrackedChangesNoXText()
3609 : {
3610 46 : if (NULL != pRedlineExport)
3611 46 : pRedlineExport->SetCurrentXText();
3612 46 : }
3613 :
3614 499 : void XMLTextParagraphExport::exportTextAutoStyles()
3615 : {
3616 499 : GetAutoStylePool().exportXML( XML_STYLE_FAMILY_TEXT_PARAGRAPH,
3617 499 : GetExport().GetDocHandler(),
3618 499 : GetExport().GetMM100UnitConverter(),
3619 998 : GetExport().GetNamespaceMap() );
3620 :
3621 499 : GetAutoStylePool().exportXML( XML_STYLE_FAMILY_TEXT_TEXT,
3622 499 : GetExport().GetDocHandler(),
3623 499 : GetExport().GetMM100UnitConverter(),
3624 998 : GetExport().GetNamespaceMap() );
3625 :
3626 499 : GetAutoStylePool().exportXML( XML_STYLE_FAMILY_TEXT_FRAME,
3627 499 : GetExport().GetDocHandler(),
3628 499 : GetExport().GetMM100UnitConverter(),
3629 998 : GetExport().GetNamespaceMap() );
3630 :
3631 499 : GetAutoStylePool().exportXML( XML_STYLE_FAMILY_TEXT_SECTION,
3632 499 : GetExport().GetDocHandler(),
3633 499 : GetExport().GetMM100UnitConverter(),
3634 998 : GetExport().GetNamespaceMap() );
3635 :
3636 499 : GetAutoStylePool().exportXML( XML_STYLE_FAMILY_TEXT_RUBY,
3637 499 : GetExport().GetDocHandler(),
3638 499 : GetExport().GetMM100UnitConverter(),
3639 998 : GetExport().GetNamespaceMap() );
3640 :
3641 499 : pListAutoPool->exportXML();
3642 499 : }
3643 :
3644 12 : void XMLTextParagraphExport::exportRuby(
3645 : const Reference<XPropertySet> & rPropSet,
3646 : bool bAutoStyles )
3647 : {
3648 : // early out: a collapsed ruby makes no sense
3649 12 : if (*static_cast<sal_Bool const *>(rPropSet->getPropertyValue(sIsCollapsed).getValue()))
3650 0 : return;
3651 :
3652 : // start value ?
3653 12 : bool bStart = *static_cast<sal_Bool const *>(rPropSet->getPropertyValue(sIsStart).getValue());
3654 :
3655 12 : if (bAutoStyles)
3656 : {
3657 : // ruby auto styles
3658 0 : if (bStart)
3659 0 : Add( XML_STYLE_FAMILY_TEXT_RUBY, rPropSet );
3660 : }
3661 : else
3662 : {
3663 12 : if (bStart)
3664 : {
3665 : // ruby start
3666 :
3667 : // we can only start a ruby if none is open
3668 : DBG_ASSERT(! bOpenRuby, "Can't open a ruby inside of ruby!");
3669 6 : if( bOpenRuby )
3670 0 : return;
3671 :
3672 : // save ruby text + ruby char style
3673 6 : rPropSet->getPropertyValue(sRubyText) >>= sOpenRubyText;
3674 6 : rPropSet->getPropertyValue(sRubyCharStyleName) >>= sOpenRubyCharStyle;
3675 :
3676 : // ruby style
3677 6 : GetExport().CheckAttrList();
3678 6 : OUString sEmpty;
3679 : OUString sStyleName(Find( XML_STYLE_FAMILY_TEXT_RUBY, rPropSet,
3680 12 : sEmpty ));
3681 : DBG_ASSERT(!sStyleName.isEmpty(), "I can't find the style!");
3682 6 : GetExport().AddAttribute(XML_NAMESPACE_TEXT,
3683 6 : XML_STYLE_NAME, sStyleName);
3684 :
3685 : // export <text:ruby> and <text:ruby-base> start elements
3686 6 : GetExport().StartElement( XML_NAMESPACE_TEXT, XML_RUBY, false);
3687 6 : GetExport().ClearAttrList();
3688 6 : GetExport().StartElement( XML_NAMESPACE_TEXT, XML_RUBY_BASE,
3689 6 : false );
3690 12 : bOpenRuby = true;
3691 : }
3692 : else
3693 : {
3694 : // ruby end
3695 :
3696 : // check for an open ruby
3697 : DBG_ASSERT(bOpenRuby, "Can't close a ruby if none is open!");
3698 6 : if( !bOpenRuby )
3699 0 : return;
3700 :
3701 : // close <text:ruby-base>
3702 6 : GetExport().EndElement(XML_NAMESPACE_TEXT, XML_RUBY_BASE,
3703 6 : false);
3704 :
3705 : // write the ruby text (with char style)
3706 : {
3707 6 : if (!sOpenRubyCharStyle.isEmpty())
3708 0 : GetExport().AddAttribute(
3709 : XML_NAMESPACE_TEXT, XML_STYLE_NAME,
3710 0 : GetExport().EncodeStyleName( sOpenRubyCharStyle) );
3711 :
3712 : SvXMLElementExport aRubyElement(
3713 6 : GetExport(), XML_NAMESPACE_TEXT, XML_RUBY_TEXT,
3714 6 : false, false);
3715 :
3716 6 : GetExport().Characters(sOpenRubyText);
3717 : }
3718 :
3719 : // and finally, close the ruby
3720 6 : GetExport().EndElement(XML_NAMESPACE_TEXT, XML_RUBY, false);
3721 6 : bOpenRuby = false;
3722 : }
3723 : }
3724 : }
3725 :
3726 9 : void XMLTextParagraphExport::exportMeta(
3727 : const Reference<XPropertySet> & i_xPortion,
3728 : bool i_bAutoStyles, bool i_isProgress)
3729 : {
3730 : static const char sMeta[] = "InContentMetadata";
3731 :
3732 9 : bool doExport(!i_bAutoStyles); // do not export element if autostyles
3733 : // check version >= 1.2
3734 9 : switch (GetExport().getDefaultVersion()) {
3735 : case SvtSaveOptions::ODFVER_011: // fall through
3736 0 : case SvtSaveOptions::ODFVER_010: doExport = false; break;
3737 9 : default: break;
3738 : }
3739 :
3740 : const Reference< XTextContent > xTextContent(
3741 9 : i_xPortion->getPropertyValue(sMeta), UNO_QUERY_THROW);
3742 18 : const Reference< XEnumerationAccess > xEA( xTextContent, UNO_QUERY_THROW );
3743 18 : const Reference< XEnumeration > xTextEnum( xEA->createEnumeration() );
3744 :
3745 9 : if (doExport)
3746 : {
3747 9 : const Reference<rdf::XMetadatable> xMeta(xTextContent, UNO_QUERY_THROW);
3748 :
3749 : // text:meta with neither xml:id nor RDFa is invalid
3750 9 : xMeta->ensureMetadataReference();
3751 :
3752 : // xml:id and RDFa for RDF metadata
3753 9 : GetExport().AddAttributeXmlId(xMeta);
3754 9 : GetExport().AddAttributesRDFa(xTextContent);
3755 : }
3756 :
3757 9 : SvXMLElementExport aElem( GetExport(), doExport,
3758 27 : XML_NAMESPACE_TEXT, XML_META, false, false );
3759 :
3760 : // recurse to export content
3761 18 : exportTextRangeEnumeration( xTextEnum, i_bAutoStyles, i_isProgress );
3762 9 : }
3763 :
3764 73 : void XMLTextParagraphExport::PreventExportOfControlsInMuteSections(
3765 : const Reference<XIndexAccess> & rShapes,
3766 : rtl::Reference<xmloff::OFormLayerXMLExport> xFormExport )
3767 : {
3768 : // check parameters ad pre-conditions
3769 73 : if( ( ! rShapes.is() ) || ( ! xFormExport.is() ) )
3770 : {
3771 : // if we don't have shapes or a form export, there's nothing to do
3772 0 : return;
3773 : }
3774 : DBG_ASSERT( pSectionExport != NULL, "We need the section export." );
3775 :
3776 73 : Reference<XEnumeration> xShapesEnum = pBoundFrameSets->GetShapes()->createEnumeration();
3777 73 : if(!xShapesEnum.is())
3778 0 : return;
3779 247 : while( xShapesEnum->hasMoreElements() )
3780 : {
3781 : // now we need to check
3782 : // 1) if this is a control shape, and
3783 : // 2) if it's in a mute section
3784 : // if both answers are 'yes', notify the form layer export
3785 :
3786 : // we join accessing the shape and testing for control
3787 101 : Reference<XControlShape> xControlShape(xShapesEnum->nextElement(), UNO_QUERY);
3788 101 : if( xControlShape.is() )
3789 : {
3790 : // Reference<XPropertySet> xPropSet( xControlShape, UNO_QUERY );
3791 : // Reference<XTextContent> xTextContent;
3792 : // xPropSet->getPropertyValue("TextRange") >>= xTextContent;
3793 :
3794 0 : Reference<XTextContent> xTextContent( xControlShape, UNO_QUERY );
3795 0 : if( xTextContent.is() )
3796 : {
3797 0 : if( pSectionExport->IsMuteSection( xTextContent, false ) )
3798 : {
3799 : // Ah, we've found a shape that
3800 : // 1) is a control shape
3801 : // 2) is anchored in a mute section
3802 : // so: don't export it!
3803 : xFormExport->excludeFromExport(
3804 0 : xControlShape->getControl() );
3805 : }
3806 : // else: not in mute section -> should be exported -> nothing
3807 : // to do
3808 0 : }
3809 : // else: no anchor -> ignore
3810 : }
3811 : // else: no control shape -> nothing to do
3812 174 : }
3813 : }
3814 :
3815 1281 : void XMLTextParagraphExport::PushNewTextListsHelper()
3816 : {
3817 1281 : mpTextListsHelper = new XMLTextListsHelper();
3818 1281 : maTextListsHelperStack.push_back( mpTextListsHelper );
3819 1281 : }
3820 :
3821 1281 : void XMLTextParagraphExport::PopTextListsHelper()
3822 : {
3823 1281 : delete mpTextListsHelper;
3824 1281 : mpTextListsHelper = 0;
3825 1281 : maTextListsHelperStack.pop_back();
3826 1281 : if ( !maTextListsHelperStack.empty() )
3827 : {
3828 222 : mpTextListsHelper = maTextListsHelperStack.back();
3829 : }
3830 1281 : }
3831 :
3832 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|