xref: /trunk/main/xmloff/source/draw/sdxmlexp.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmloff.hxx"
30 #include "unointerfacetouniqueidentifiermapper.hxx"
31 #include <xmloff/nmspmap.hxx>
32 #include "xmloff/xmlnmspe.hxx"
33 #include <xmloff/xmluconv.hxx>
34 #include <xmloff/xmltoken.hxx>
35 #include <xmloff/xmlmetae.hxx>
36 #include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
37 #include <com/sun/star/presentation/XPresentationSupplier.hpp>
38 #include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
39 #include <com/sun/star/geometry/RealPoint2D.hpp>
40 #include <com/sun/star/task/XStatusIndicatorSupplier.hpp>
41 #include <com/sun/star/office/XAnnotationAccess.hpp>
42 #include <com/sun/star/lang/Locale.hpp>
43 #include <com/sun/star/uno/Any.hxx>
44 #include "sdxmlexp_impl.hxx"
45 #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
46 #include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
47 #include <com/sun/star/presentation/XHandoutMasterSupplier.hpp>
48 #include <com/sun/star/container/XIndexContainer.hpp>
49 #include <com/sun/star/view/PaperOrientation.hpp>
50 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
51 #include <com/sun/star/style/XStyle.hpp>
52 
53 #include <com/sun/star/form/XFormsSupplier2.hpp>
54 #include <com/sun/star/presentation/XPresentationPage.hpp>
55 #include <com/sun/star/drawing/XMasterPageTarget.hpp>
56 #include <com/sun/star/text/XText.hpp>
57 #include <com/sun/star/chart/XChartDocument.hpp>
58 #include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
59 #include <com/sun/star/container/XNamed.hpp>
60 #include <rtl/ustrbuf.hxx>
61 #include <tools/gen.hxx>
62 #include <tools/debug.hxx>
63 #include <xmloff/xmlaustp.hxx>
64 #include <xmloff/families.hxx>
65 #include <xmloff/styleexp.hxx>
66 #include "sdpropls.hxx"
67 #include <xmloff/xmlexppr.hxx>
68 #include <com/sun/star/beans/XPropertyState.hpp>
69 #include "xexptran.hxx"
70 
71 #ifndef _CPPUHELPER_IMPLBASE1_HXX
72 #include <cppuhelper/implbase1.hxx>
73 #endif
74 #include <comphelper/extract.hxx>
75 #include <com/sun/star/lang/XServiceInfo.hpp>
76 #include "PropertySetMerger.hxx"
77 #include "layerexp.hxx"
78 
79 
80 #include "xmloff/VisAreaExport.hxx"
81 #include "XMLNumberStylesExport.hxx"
82 #include <tools/list.hxx>
83 #include <tools/string.hxx>
84 
85 #include "animationexport.hxx"
86 
87 #include <com/sun/star/document/XDocumentProperties.hpp>
88 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
89 
90 using ::rtl::OUString;
91 using ::rtl::OUStringBuffer;
92 
93 using namespace ::com::sun::star;
94 using namespace ::com::sun::star::uno;
95 using namespace ::com::sun::star::beans;
96 using namespace ::com::sun::star::util;
97 using namespace ::com::sun::star::container;
98 using namespace ::com::sun::star::drawing;
99 using namespace ::com::sun::star::office;
100 using namespace ::com::sun::star::presentation;
101 using namespace ::com::sun::star::geometry;
102 using namespace ::com::sun::star::text;
103 using namespace ::xmloff::token;
104 
105 
106 //////////////////////////////////////////////////////////////////////////////
107 
108 class ImpXMLEXPPageMasterInfo
109 {
110     sal_Int32                   mnBorderBottom;
111     sal_Int32                   mnBorderLeft;
112     sal_Int32                   mnBorderRight;
113     sal_Int32                   mnBorderTop;
114     sal_Int32                   mnWidth;
115     sal_Int32                   mnHeight;
116     view::PaperOrientation      meOrientation;
117     OUString                    msName;
118     OUString                    msMasterPageName;
119 
120 public:
121     ImpXMLEXPPageMasterInfo(const SdXMLExport& rExp, const Reference<XDrawPage>& xPage);
122     sal_Bool operator==(const ImpXMLEXPPageMasterInfo& rInfo) const;
123     void SetName(const OUString& rStr);
124 
125     const OUString& GetName() const { return msName; }
126     const OUString& GetMasterPageName() const { return msMasterPageName; }
127 
128     sal_Int32 GetBorderBottom() const { return mnBorderBottom; }
129     sal_Int32 GetBorderLeft() const { return mnBorderLeft; }
130     sal_Int32 GetBorderRight() const { return mnBorderRight; }
131     sal_Int32 GetBorderTop() const { return mnBorderTop; }
132     sal_Int32 GetWidth() const { return mnWidth; }
133     sal_Int32 GetHeight() const { return mnHeight; }
134     view::PaperOrientation GetOrientation() const { return meOrientation; }
135 };
136 
137 ImpXMLEXPPageMasterInfo::ImpXMLEXPPageMasterInfo(
138     const SdXMLExport& rExp,
139     const Reference<XDrawPage>& xPage)
140 :   mnBorderBottom(0),
141     mnBorderLeft(0),
142     mnBorderRight(0),
143     mnBorderTop(0),
144     mnWidth(0),
145     mnHeight(0),
146     meOrientation(rExp.IsDraw() ? view::PaperOrientation_PORTRAIT : view::PaperOrientation_LANDSCAPE)
147 {
148     Reference <beans::XPropertySet> xPropSet(xPage, UNO_QUERY);
149     if(xPropSet.is())
150     {
151         Any aAny;
152 
153         Reference< beans::XPropertySetInfo > xPropsInfo( xPropSet->getPropertySetInfo() );
154         if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("BorderBottom") )))
155         {
156             aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("BorderBottom")));
157             aAny >>= mnBorderBottom;
158 
159             aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("BorderLeft")));
160             aAny >>= mnBorderLeft;
161 
162             aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("BorderRight")));
163             aAny >>= mnBorderRight;
164 
165             aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("BorderTop")));
166             aAny >>= mnBorderTop;
167         }
168 
169         if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("Width") )))
170         {
171             aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Width")));
172             aAny >>= mnWidth;
173 
174             aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Height")));
175             aAny >>= mnHeight;
176         }
177 
178         if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("Orientation") )))
179         {
180             aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Orientation")));
181             aAny >>= meOrientation;
182         }
183     }
184 
185     Reference <container::XNamed> xMasterNamed(xPage, UNO_QUERY);
186     if(xMasterNamed.is())
187     {
188         msMasterPageName = xMasterNamed->getName();
189     }
190 }
191 
192 sal_Bool ImpXMLEXPPageMasterInfo::operator==(const ImpXMLEXPPageMasterInfo& rInfo) const
193 {
194     return ((mnBorderBottom == rInfo.mnBorderBottom)
195         && (mnBorderLeft == rInfo.mnBorderLeft)
196         && (mnBorderRight == rInfo.mnBorderRight)
197         && (mnBorderTop == rInfo.mnBorderTop)
198         && (mnWidth == rInfo.mnWidth)
199         && (mnHeight == rInfo.mnHeight)
200         && (meOrientation == rInfo.meOrientation));
201 }
202 
203 void ImpXMLEXPPageMasterInfo::SetName(const OUString& rStr)
204 {
205     msName = rStr;
206 }
207 
208 DECLARE_LIST(ImpXMLEXPPageMasterList, ImpXMLEXPPageMasterInfo*)
209 
210 //////////////////////////////////////////////////////////////////////////////
211 
212 #define IMP_AUTOLAYOUT_INFO_MAX         (35L)
213 
214 class ImpXMLAutoLayoutInfo
215 {
216     sal_uInt16                  mnType;
217     ImpXMLEXPPageMasterInfo*    mpPageMasterInfo;
218     OUString                    msLayoutName;
219     Rectangle                   maTitleRect;
220     Rectangle                   maPresRect;
221     sal_Int32                   mnGapX;
222     sal_Int32                   mnGapY;
223 
224 public:
225     ImpXMLAutoLayoutInfo(sal_uInt16 nTyp, ImpXMLEXPPageMasterInfo* pInf);
226 
227     sal_Bool operator==(const ImpXMLAutoLayoutInfo& rInfo) const;
228 
229     sal_uInt16 GetLayoutType() const { return mnType; }
230     sal_Int32 GetGapX() const { return mnGapX; }
231     sal_Int32 GetGapY() const { return mnGapY; }
232 
233     const OUString& GetLayoutName() const { return msLayoutName; }
234     void SetLayoutName(const OUString& rNew) { msLayoutName = rNew; }
235 
236     const Rectangle& GetTitleRectangle() const { return maTitleRect; }
237     const Rectangle& GetPresRectangle() const { return maPresRect; }
238 
239     static sal_Bool IsCreateNecessary(sal_uInt16 nTyp);
240 };
241 
242 sal_Bool ImpXMLAutoLayoutInfo::IsCreateNecessary(sal_uInt16 nTyp)
243 {
244     if(nTyp == 5 /* AUTOLAYOUT_ORG */
245         || nTyp == 20 /* AUTOLAYOUT_NONE */
246         || nTyp >= IMP_AUTOLAYOUT_INFO_MAX)
247         return sal_False;
248     return sal_True;
249 }
250 
251 sal_Bool ImpXMLAutoLayoutInfo::operator==(const ImpXMLAutoLayoutInfo& rInfo) const
252 {
253     return ((mnType == rInfo.mnType
254         && mpPageMasterInfo == rInfo.mpPageMasterInfo));
255 }
256 
257 ImpXMLAutoLayoutInfo::ImpXMLAutoLayoutInfo(sal_uInt16 nTyp, ImpXMLEXPPageMasterInfo* pInf)
258 :   mnType(nTyp),
259     mpPageMasterInfo(pInf)
260 {
261     // create full info (initialze with typical values)
262     Point aPagePos(0,0);
263     Size aPageSize(28000, 21000);
264     Size aPageInnerSize(28000, 21000);
265 
266     if(mpPageMasterInfo)
267     {
268         aPagePos = Point(mpPageMasterInfo->GetBorderLeft(), mpPageMasterInfo->GetBorderTop());
269         aPageSize = Size(mpPageMasterInfo->GetWidth(), mpPageMasterInfo->GetHeight());
270         aPageInnerSize = aPageSize;
271         aPageInnerSize.Width() -= mpPageMasterInfo->GetBorderLeft() + mpPageMasterInfo->GetBorderRight();
272         aPageInnerSize.Height() -= mpPageMasterInfo->GetBorderTop() + mpPageMasterInfo->GetBorderBottom();
273     }
274 
275     // title rectangle aligning
276     Point aTitlePos(aPagePos);
277     Size aTitleSize(aPageInnerSize);
278 
279     if(mnType == 21 /* AUTOLAYOUT_NOTES */)
280     {
281         aTitleSize.Height() = (long) (aTitleSize.Height() / 2.5);
282         Point aPos = aTitlePos;
283         aPos.Y() += long( aTitleSize.Height() * 0.083 );
284         Size aPartArea = aTitleSize;
285         Size aSize;
286 
287         // tatsaechliche Seitengroesse in das Handout-Rechteck skalieren
288         double fH = (double) aPartArea.Width()  / aPageSize.Width();
289         double fV = (double) aPartArea.Height() / aPageSize.Height();
290 
291         if ( fH > fV )
292             fH = fV;
293         aSize.Width()  = (long) (fH * aPageSize.Width());
294         aSize.Height() = (long) (fH * aPageSize.Height());
295 
296         aPos.X() += (aPartArea.Width() - aSize.Width()) / 2;
297         aPos.Y() += (aPartArea.Height()- aSize.Height())/ 2;
298 
299         aTitlePos = aPos;
300         aTitleSize = aSize;
301     }
302     else if(mnType == 27 || mnType == 28)
303     {
304         // AUTOLAYOUT_VERTICAL_TITLE_TEXT_CHART or
305         // AUTOLAYOUT_VERTICAL_TITLE_VERTICAL_OUTLINE
306         Point aClassicTPos(
307             aTitlePos.X() + long( aTitleSize.Width() * 0.0735 ),
308             aTitlePos.Y() + long( aTitleSize.Height() * 0.083 ));
309         Size aClassicTSize(
310             long( aTitleSize.Width() * 0.854 ),
311             long( aTitleSize.Height() * 0.167 ));
312         Point aLPos(aPagePos);
313         Size aLSize(aPageInnerSize);
314         Point aClassicLPos(
315             aLPos.X() + long( aLSize.Width() * 0.0735 ),
316             aLPos.Y() + long( aLSize.Height() * 0.472 ));
317         Size aClassicLSize(
318             long( aLSize.Width() * 0.854 ),
319             long( aLSize.Height() * 0.444 ));
320 
321         aTitlePos.X() = (aClassicTPos.X() + aClassicTSize.Width()) - aClassicTSize.Height();
322         aTitlePos.Y() = aClassicTPos.Y();
323         aTitleSize.Width() = aClassicTSize.Height();
324         aTitleSize.Height() = (aClassicLPos.Y() + aClassicLSize.Height()) - aClassicTPos.Y();
325     }
326     else
327     {
328         aTitlePos.X() += long( aTitleSize.Width() * 0.0735 );
329         aTitlePos.Y() += long( aTitleSize.Height() * 0.083 );
330         aTitleSize.Width() = long( aTitleSize.Width() * 0.854 );
331         aTitleSize.Height() = long( aTitleSize.Height() * 0.167 );
332     }
333 
334     maTitleRect.SetPos(aTitlePos);
335     maTitleRect.SetSize(aTitleSize);
336 
337     // layout rectangle aligning
338     Point aLayoutPos(aPagePos);
339     Size aLayoutSize(aPageInnerSize);
340 
341     if(mnType == 21 /* AUTOLAYOUT_NOTES */)
342     {
343         aLayoutPos.X() += long( aLayoutSize.Width() * 0.0735 );
344         aLayoutPos.Y() += long( aLayoutSize.Height() * 0.472 );
345         aLayoutSize.Width() = long( aLayoutSize.Width() * 0.854 );
346         aLayoutSize.Height() = long( aLayoutSize.Height() * 0.444 );
347     }
348     else if((mnType >= 22 && mnType <= 26) || (mnType == 31)) // AUTOLAYOUT_HANDOUT
349     {
350         // keep info for inner area in maPresRect, put info for gap size
351         // to maTitleRect position
352         mnGapX = (aPageSize.Width() - aPageInnerSize.Width()) / 2;
353         mnGapY = (aPageSize.Height() - aPageInnerSize.Height()) / 2;
354 
355         if(!mnGapX)
356             mnGapX = aPageSize.Width() / 10;
357 
358         if(!mnGapY)
359             mnGapY = aPageSize.Height() / 10;
360 
361         if(mnGapX < aPageInnerSize.Width() / 10)
362             mnGapX = aPageInnerSize.Width() / 10;
363 
364         if(mnGapY < aPageInnerSize.Height() / 10)
365             mnGapY = aPageInnerSize.Height() / 10;
366     }
367     else if(mnType == 27 || mnType == 28)
368     {
369         // AUTOLAYOUT_VERTICAL_TITLE_TEXT_CHART or
370         // AUTOLAYOUT_VERTICAL_TITLE_VERTICAL_OUTLINE
371         Point aClassicTPos(
372             aTitlePos.X() + long( aTitleSize.Width() * 0.0735 ),
373             aTitlePos.Y() + long( aTitleSize.Height() * 0.083 ));
374         Size aClassicTSize(
375             long( aTitleSize.Width() * 0.854 ),
376             long( aTitleSize.Height() * 0.167 ));
377         Point aClassicLPos(
378             aLayoutPos.X() + long( aLayoutSize.Width() * 0.0735 ),
379             aLayoutPos.Y() + long( aLayoutSize.Height() * 0.472 ));
380         Size aClassicLSize(
381             long( aLayoutSize.Width() * 0.854 ),
382             long( aLayoutSize.Height() * 0.444 ));
383 
384         aLayoutPos.X() = aClassicLPos.X();
385         aLayoutPos.Y() = aClassicTPos.Y();
386         aLayoutSize.Width() = (aClassicLPos.X() + aClassicLSize.Width())
387             - (aClassicTSize.Height() + (aClassicLPos.Y() - (aClassicTPos.Y() + aClassicTSize.Height())));
388         aLayoutSize.Height() = (aClassicLPos.Y() + aClassicLSize.Height()) - aClassicTPos.Y();
389     }
390     else if( mnType == 32 )
391     {
392         // AUTOLAYOUT_ONLY_TEXT
393         aLayoutPos = aTitlePos;
394         aLayoutSize.Width() = aTitleSize.Width();
395         aLayoutSize.Height() = long( aLayoutSize.Height() * 0.825 );
396     }
397     else
398     {
399         aLayoutPos.X() += long( aLayoutSize.Width() * 0.0735 );
400         aLayoutPos.Y() += long( aLayoutSize.Height() * 0.278 );
401         aLayoutSize.Width() = long( aLayoutSize.Width() * 0.854 );
402         aLayoutSize.Height() = long( aLayoutSize.Height() * 0.630 );
403     }
404 
405     maPresRect.SetPos(aLayoutPos);
406     maPresRect.SetSize(aLayoutSize);
407 }
408 
409 DECLARE_LIST(ImpXMLAutoLayoutInfoList, ImpXMLAutoLayoutInfo*)
410 
411 //////////////////////////////////////////////////////////////////////////////
412 
413 // #110680#
414 SdXMLExport::SdXMLExport(
415     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory,
416     sal_Bool bIsDraw, sal_uInt16 nExportFlags )
417 :   SvXMLExport( xServiceFactory, MAP_CM, bIsDraw ? XML_DRAWING : XML_PRESENTATION, nExportFlags ),
418     mnDocMasterPageCount(0L),
419     mnDocDrawPageCount(0L),
420     mnShapeStyleInfoIndex(0L),
421     mnObjectCount(0L),
422     mpPageMasterInfoList(new ImpXMLEXPPageMasterList(1, 4, 4)),
423     mpPageMasterUsageList(new ImpXMLEXPPageMasterList(1, 4, 4)),
424     mpNotesPageMasterUsageList(new ImpXMLEXPPageMasterList(1, 4, 4)),
425     mpHandoutPageMaster(NULL),
426     mpAutoLayoutInfoList(new ImpXMLAutoLayoutInfoList(1, 4, 4)),
427     mpSdPropHdlFactory(0L),
428     mpPropertySetMapper(0L),
429     mpPresPagePropsMapper(0L),
430     mbIsDraw(bIsDraw),
431     mbFamilyGraphicUsed(sal_False),
432     mbFamilyPresentationUsed(sal_False),
433     msZIndex( GetXMLToken(XML_ZINDEX) ),
434     msEmptyPres( RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ),
435     msModel( RTL_CONSTASCII_USTRINGPARAM("Model") ),
436     msStartShape( RTL_CONSTASCII_USTRINGPARAM("StartShape") ),
437     msEndShape( RTL_CONSTASCII_USTRINGPARAM("EndShape") ),
438     msPageLayoutNames( RTL_CONSTASCII_USTRINGPARAM("PageLayoutNames") )
439 {
440 
441 
442 }
443 
444 // XExporter
445 void SAL_CALL SdXMLExport::setSourceDocument( const Reference< lang::XComponent >& xDoc )
446     throw(lang::IllegalArgumentException, uno::RuntimeException)
447 {
448     SvXMLExport::setSourceDocument( xDoc );
449 
450     const OUString aEmpty;
451 
452     // prepare factory parts
453     mpSdPropHdlFactory = new XMLSdPropHdlFactory( GetModel(), *this );
454     if(mpSdPropHdlFactory)
455     {
456         // set lock to avoid deletion
457         mpSdPropHdlFactory->acquire();
458 
459         // build one ref
460         const UniReference< XMLPropertyHandlerFactory > aFactoryRef = mpSdPropHdlFactory;
461 
462         // construct PropertySetMapper
463         UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( aFactoryRef);
464 
465         mpPropertySetMapper = new XMLShapeExportPropertyMapper( xMapper, (XMLTextListAutoStylePool*)&GetTextParagraphExport()->GetListAutoStylePool(), *this );
466         // set lock to avoid deletion
467         mpPropertySetMapper->acquire();
468 
469         // chain text attributes
470         mpPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this));
471 
472         // construct PresPagePropsMapper
473         xMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLSDPresPageProps, aFactoryRef);
474 
475         mpPresPagePropsMapper = new XMLPageExportPropertyMapper( xMapper, *this  );
476         if(mpPresPagePropsMapper)
477         {
478             // set lock to avoid deletion
479             mpPresPagePropsMapper->acquire();
480         }
481     }
482 
483     // add family name
484     GetAutoStylePool()->AddFamily(
485         XML_STYLE_FAMILY_SD_GRAPHICS_ID,
486         OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)),
487         GetPropertySetMapper(),
488         OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_PREFIX)));
489     GetAutoStylePool()->AddFamily(
490         XML_STYLE_FAMILY_SD_PRESENTATION_ID,
491         OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_NAME)),
492         GetPropertySetMapper(),
493         OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_PREFIX)));
494     GetAutoStylePool()->AddFamily(
495         XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID,
496         OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_DRAWINGPAGE_NAME)),
497         GetPresPagePropsMapper(),
498         OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_DRAWINGPAGE_PREFIX)));
499     // prepare access to styles
500     Reference< style::XStyleFamiliesSupplier > xFamSup( GetModel(), UNO_QUERY );
501     if(xFamSup.is())
502     {
503         mxDocStyleFamilies = xFamSup->getStyleFamilies();
504     }
505 
506     // prepare access to master pages
507     Reference < drawing::XMasterPagesSupplier > xMasterPagesSupplier(GetModel(), UNO_QUERY);
508     if(xMasterPagesSupplier.is())
509     {
510         mxDocMasterPages = mxDocMasterPages.query( xMasterPagesSupplier->getMasterPages() );
511         if(mxDocMasterPages.is())
512         {
513             mnDocMasterPageCount = mxDocMasterPages->getCount();
514             maMasterPagesStyleNames.insert( maMasterPagesStyleNames.begin(), mnDocMasterPageCount, aEmpty );
515         }
516     }
517 
518     // prepare access to draw pages
519     Reference <XDrawPagesSupplier> xDrawPagesSupplier(GetModel(), UNO_QUERY);
520     if(xDrawPagesSupplier.is())
521     {
522         mxDocDrawPages = mxDocDrawPages.query( xDrawPagesSupplier->getDrawPages() );
523         if(mxDocDrawPages.is())
524         {
525             mnDocDrawPageCount = mxDocDrawPages->getCount();
526             maDrawPagesStyleNames.insert( maDrawPagesStyleNames.begin(), mnDocDrawPageCount, aEmpty );
527             maDrawNotesPagesStyleNames.insert( maDrawNotesPagesStyleNames.begin(), mnDocDrawPageCount, aEmpty );
528             if( !mbIsDraw )
529                 maDrawPagesAutoLayoutNames.realloc( mnDocDrawPageCount + 1 );
530 
531             HeaderFooterPageSettingsImpl aEmptySettings;
532             maDrawPagesHeaderFooterSettings.insert( maDrawPagesHeaderFooterSettings.begin(), mnDocDrawPageCount, aEmptySettings );
533             maDrawNotesPagesHeaderFooterSettings.insert( maDrawNotesPagesHeaderFooterSettings.begin(), mnDocDrawPageCount, aEmptySettings );
534         }
535     }
536 
537     // #82003# count all draw objects for use with progress bar.
538     // #88245# init mnObjectCount once, use counter itself as flag. It
539     // is initialized to 0.
540     if(!mnObjectCount)
541     {
542         if( IsImpress() )
543         {
544             // #91587# add handout master count
545             Reference<presentation::XHandoutMasterSupplier> xHandoutSupp(GetModel(), UNO_QUERY);
546             if(xHandoutSupp.is())
547             {
548                 Reference<XDrawPage> xHandoutPage(xHandoutSupp->getHandoutMasterPage());
549                 if(xHandoutPage.is())
550                 {
551                     Reference<drawing::XShapes> xShapes(xHandoutPage, UNO_QUERY);
552                     if(xShapes.is() && xShapes->getCount())
553                     {
554                         mnObjectCount += ImpRecursiveObjectCount(xShapes);
555                     }
556                 }
557             }
558         }
559 
560         if(mxDocMasterPages.is())
561         {
562             for(sal_Int32 a(0); a < mnDocMasterPageCount; a++)
563             {
564                 Any aAny(mxDocMasterPages->getByIndex(a));
565                 Reference< drawing::XShapes > xMasterPage;
566 
567                 if((aAny >>= xMasterPage) && xMasterPage.is())
568                 {
569                     mnObjectCount += ImpRecursiveObjectCount(xMasterPage);
570                 }
571 
572                 if( IsImpress() )
573                 {
574                     // #91587# take notes pages from master pages into account
575                     Reference<presentation::XPresentationPage> xPresPage;
576                     if((aAny >>= xPresPage) && xPresPage.is())
577                     {
578                         Reference<XDrawPage> xNotesPage(xPresPage->getNotesPage());
579                         if(xNotesPage.is())
580                         {
581                             Reference<drawing::XShapes> xShapes(xNotesPage, UNO_QUERY);
582                             if(xShapes.is() && xShapes->getCount())
583                             {
584                                 mnObjectCount += ImpRecursiveObjectCount(xShapes);
585                             }
586                         }
587                     }
588                 }
589             }
590         }
591 
592         if(mxDocDrawPages.is())
593         {
594             for(sal_Int32 a(0); a < mnDocDrawPageCount; a++)
595             {
596                 Any aAny(mxDocDrawPages->getByIndex(a));
597                 Reference< drawing::XShapes > xPage;
598 
599                 if((aAny >>= xPage) && xPage.is())
600                 {
601                     mnObjectCount += ImpRecursiveObjectCount(xPage);
602                 }
603 
604                 if( IsImpress() )
605                 {
606                     // #91587# take notes pages from draw pages into account
607                     Reference<presentation::XPresentationPage> xPresPage;
608                     if((aAny >>= xPresPage) && xPresPage.is())
609                     {
610                         Reference<XDrawPage> xNotesPage(xPresPage->getNotesPage());
611                         if(xNotesPage.is())
612                         {
613                             Reference<drawing::XShapes> xShapes(xNotesPage, UNO_QUERY);
614                             if(xShapes.is() && xShapes->getCount())
615                             {
616                                 mnObjectCount += ImpRecursiveObjectCount(xShapes);
617                             }
618                         }
619                     }
620                 }
621             }
622         }
623 
624         // #82003# init progress bar
625         GetProgressBarHelper()->SetReference(mnObjectCount);
626     }
627 
628     // add namespaces
629     _GetNamespaceMap().Add(
630         GetXMLToken(XML_NP_PRESENTATION),
631         GetXMLToken(XML_N_PRESENTATION),
632         XML_NAMESPACE_PRESENTATION);
633 
634     _GetNamespaceMap().Add(
635         GetXMLToken(XML_NP_SMIL),
636         GetXMLToken(XML_N_SMIL_COMPAT),
637         XML_NAMESPACE_SMIL);
638 
639     _GetNamespaceMap().Add(
640         GetXMLToken(XML_NP_ANIMATION),
641         GetXMLToken(XML_N_ANIMATION),
642         XML_NAMESPACE_ANIMATION);
643 
644     if( getDefaultVersion() > SvtSaveOptions::ODFVER_012 )
645     {
646         _GetNamespaceMap().Add(
647             GetXMLToken(XML_NP_OFFICE_EXT),
648             GetXMLToken(XML_N_OFFICE_EXT),
649             XML_NAMESPACE_OFFICE_EXT);
650 
651         _GetNamespaceMap().Add(
652             GetXMLToken(XML_NP_DRAW_EXT),
653             GetXMLToken(XML_N_DRAW_EXT),
654             XML_NAMESPACE_DRAW_EXT);
655     }
656 
657     GetShapeExport()->enableLayerExport();
658 
659     // #88546# enable progress bar increments
660     GetShapeExport()->enableHandleProgressBar();
661 }
662 
663 //////////////////////////////////////////////////////////////////////////////
664 // #82003# helper function for recursive object count
665 sal_uInt32 SdXMLExport::ImpRecursiveObjectCount(Reference< drawing::XShapes > xShapes)
666 {
667     sal_uInt32 nRetval(0L);
668 
669     if(xShapes.is())
670     {
671         sal_Int32 nCount = xShapes->getCount();
672 
673         for(sal_Int32 a(0L); a < nCount; a++)
674         {
675             Any aAny(xShapes->getByIndex(a));
676             Reference< drawing::XShapes > xGroup;
677 
678             if((aAny >>= xGroup) && xGroup.is())
679             {
680                 // #93180# count group objects, too.
681                 nRetval += 1 + ImpRecursiveObjectCount(xGroup);
682             }
683             else
684             {
685                 nRetval++;
686             }
687         }
688     }
689 
690     return nRetval;
691 }
692 
693 //////////////////////////////////////////////////////////////////////////////
694 
695 __EXPORT SdXMLExport::~SdXMLExport()
696 {
697     // cleanup factory, decrease refcount. Should lead to destruction.
698     if(mpSdPropHdlFactory)
699     {
700         mpSdPropHdlFactory->release();
701         mpSdPropHdlFactory = 0L;
702     }
703 
704     // cleanup mapper, decrease refcount. Should lead to destruction.
705     if(mpPropertySetMapper)
706     {
707         mpPropertySetMapper->release();
708         mpPropertySetMapper = 0L;
709     }
710 
711     // cleanup presPage mapper, decrease refcount. Should lead to destruction.
712     if(mpPresPagePropsMapper)
713     {
714         mpPresPagePropsMapper->release();
715         mpPresPagePropsMapper = 0L;
716     }
717 
718     // clear evtl. temporary page master infos
719     if(mpPageMasterInfoList)
720     {
721         while(mpPageMasterInfoList->Count())
722             delete mpPageMasterInfoList->Remove(mpPageMasterInfoList->Count() - 1L);
723         delete mpPageMasterInfoList;
724         mpPageMasterInfoList = 0L;
725     }
726     if(mpPageMasterUsageList)
727     {
728         delete mpPageMasterUsageList;
729         mpPageMasterUsageList = 0L;
730     }
731     if(mpNotesPageMasterUsageList)
732     {
733         delete mpNotesPageMasterUsageList;
734         mpNotesPageMasterUsageList = 0L;
735     }
736 
737     // clear auto-layout infos
738     if(mpAutoLayoutInfoList)
739     {
740         while(mpAutoLayoutInfoList->Count())
741             delete mpAutoLayoutInfoList->Remove(mpAutoLayoutInfoList->Count() - 1L);
742         delete mpAutoLayoutInfoList;
743         mpAutoLayoutInfoList = 0L;
744     }
745 
746 // #82003# status indicator stop is called exclusively
747 // from SdXMLFilter::Export() now.
748 //
749 // stop progress view
750 //  if(GetStatusIndicator().is())
751 //  {
752 //      GetStatusIndicator()->end();
753 //      GetStatusIndicator()->reset();
754 //  }
755 }
756 
757 //////////////////////////////////////////////////////////////////////////////
758 // to get default values in XPropertySet use this wrapper class
759 
760 class ImpDefaultMapper : public ::cppu::WeakAggImplHelper1< beans::XPropertySet >
761 {
762     Reference< beans::XPropertyState >      mxState;
763     Reference< beans::XPropertySet >        mxSet;
764 
765 public:
766     ImpDefaultMapper( Reference< beans::XPropertyState >& rxState );
767 
768     // Methods
769     virtual Reference< beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() throw(uno::RuntimeException);
770     virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException);
771     virtual Any SAL_CALL getPropertyValue( const OUString& PropertyName ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
772 
773     // empty implementations
774     virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const Reference< beans::XPropertyChangeListener >& xListener ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
775     virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const Reference< beans::XPropertyChangeListener >& aListener ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
776     virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const Reference< beans::XVetoableChangeListener >& aListener ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
777     virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const Reference< beans::XVetoableChangeListener >& aListener ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
778 };
779 
780 ImpDefaultMapper::ImpDefaultMapper( Reference< beans::XPropertyState >& rxState )
781 :   mxState( rxState ),
782     mxSet( rxState, UNO_QUERY )
783 {
784 }
785 
786 Reference< beans::XPropertySetInfo > SAL_CALL ImpDefaultMapper::getPropertySetInfo() throw(uno::RuntimeException)
787 {
788     return mxSet->getPropertySetInfo();
789 }
790 
791 void SAL_CALL ImpDefaultMapper::setPropertyValue( const OUString& aPropertyName, const Any& /*aValue*/ ) throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
792 {
793     mxState->setPropertyToDefault( aPropertyName /*, aValue */ );
794 }
795 
796 Any SAL_CALL ImpDefaultMapper::getPropertyValue( const OUString& PropertyName ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
797 {
798     return mxState->getPropertyDefault(  PropertyName  );
799 }
800 
801 // empty implementations
802 void SAL_CALL ImpDefaultMapper::addPropertyChangeListener( const OUString&, const Reference< beans::XPropertyChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
803 void SAL_CALL ImpDefaultMapper::removePropertyChangeListener( const OUString&, const Reference< beans::XPropertyChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
804 void SAL_CALL ImpDefaultMapper::addVetoableChangeListener( const OUString&, const Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
805 void SAL_CALL ImpDefaultMapper::removeVetoableChangeListener( const OUString&, const Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
806 
807 //////////////////////////////////////////////////////////////////////////////
808 
809 /* moved to shapeexport.cxx
810 void SdXMLExport::ImpWriteObjGraphicStyleInfos()
811 {
812     XMLStyleExport aStEx(*this, OUString(), GetAutoStylePool().get());
813     const UniReference< SvXMLExportPropertyMapper > aMapperRef( GetPropertySetMapper() );
814 
815     // write graphic family default style
816     Reference< lang::XMultiServiceFactory > xFact( GetModel(), UNO_QUERY );
817     if( xFact.is() )
818     {
819         try
820         {
821             Reference< beans::XPropertySet > xDefaults( xFact->createInstance( OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.Defaults") ) ), UNO_QUERY );
822             if( xDefaults.is() )
823             {
824                 aStEx.exportDefaultStyle( xDefaults, OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)), aMapperRef );
825 
826                 // write graphic family styles
827                 aStEx.exportStyleFamily(XML_STYLE_FAMILY_SD_GRAPHICS_NAME, OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)), aMapperRef, sal_False, XML_STYLE_FAMILY_SD_GRAPHICS_ID);
828             }
829         }
830         catch( lang::ServiceNotRegisteredException& )
831         {
832         }
833     }
834 }
835 */
836 //////////////////////////////////////////////////////////////////////////////
837 
838 void SdXMLExport::ImpPrepAutoLayoutInfos()
839 {
840     if(IsImpress())
841     {
842         OUString aStr;
843 
844         Reference< presentation::XHandoutMasterSupplier > xHandoutSupp( GetModel(), UNO_QUERY );
845         if( xHandoutSupp.is() )
846         {
847             Reference< XDrawPage > xHandoutPage( xHandoutSupp->getHandoutMasterPage() );
848             if( xHandoutPage.is() )
849             {
850                 if(ImpPrepAutoLayoutInfo(xHandoutPage, aStr))
851                     maDrawPagesAutoLayoutNames[0] = aStr;
852             }
853         }
854 
855         // prepare name creation
856         for (sal_Int32 nCnt = 0; nCnt < mnDocDrawPageCount; nCnt++)
857         {
858             Any aAny(mxDocDrawPages->getByIndex(nCnt));
859             Reference<XDrawPage> xDrawPage;
860 
861             if((aAny >>= xDrawPage) && xDrawPage.is())
862             {
863                 if(ImpPrepAutoLayoutInfo(xDrawPage, aStr))
864                     maDrawPagesAutoLayoutNames[nCnt+1] = aStr;
865             }
866         }
867     }
868 }
869 
870 sal_Bool SdXMLExport::ImpPrepAutoLayoutInfo(const Reference<XDrawPage>& xPage, OUString& rName)
871 {
872     rName = OUString();
873     sal_Bool bRetval(sal_False);
874 
875     Reference <beans::XPropertySet> xPropSet(xPage, UNO_QUERY);
876     if(xPropSet.is())
877     {
878         sal_uInt16 nType = sal_uInt16();
879         Any aAny;
880 
881         aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Layout")));
882         if(aAny >>= nType)
883         {
884             if(ImpXMLAutoLayoutInfo::IsCreateNecessary(nType))
885             {
886                 ImpXMLEXPPageMasterInfo* pInfo = 0L;
887 
888                 // get master-page info
889                 Reference < drawing::XMasterPageTarget > xMasterPageInt(xPage, UNO_QUERY);
890                 if(xMasterPageInt.is())
891                 {
892                     Reference<XDrawPage> xUsedMasterPage(xMasterPageInt->getMasterPage());
893                     if(xUsedMasterPage.is())
894                     {
895                         Reference < container::XNamed > xMasterNamed(xUsedMasterPage, UNO_QUERY);
896                         if(xMasterNamed.is())
897                         {
898                             OUString sMasterPageName = xMasterNamed->getName();
899                             pInfo = ImpGetPageMasterInfoByName(sMasterPageName);
900                         }
901                     }
902                 }
903 
904                 // create entry and look for existance
905                 ImpXMLAutoLayoutInfo* pNew = new ImpXMLAutoLayoutInfo(nType, pInfo);
906                 sal_Bool bDidExist(sal_False);
907 
908                 for(sal_uInt32 nCnt = 0L; !bDidExist && nCnt < mpAutoLayoutInfoList->Count(); nCnt++)
909                 {
910                     if(*mpAutoLayoutInfoList->GetObject(nCnt) == *pNew)
911                     {
912                         delete pNew;
913                         pNew = mpAutoLayoutInfoList->GetObject(nCnt);
914                         bDidExist = sal_True;
915                     }
916                 }
917 
918                 if(!bDidExist)
919                 {
920                     mpAutoLayoutInfoList->Insert(pNew, LIST_APPEND);
921                     OUString sNewName = OUString(RTL_CONSTASCII_USTRINGPARAM("AL"));
922                     sNewName += OUString::valueOf(sal_Int32(mpAutoLayoutInfoList->Count() - 1));
923                     sNewName += OUString(RTL_CONSTASCII_USTRINGPARAM("T"));
924                     sNewName += OUString::valueOf(sal_Int32(nType));
925                     pNew->SetLayoutName(sNewName);
926                 }
927 
928                 rName = pNew->GetLayoutName();
929                 bRetval = sal_True;
930             }
931         }
932     }
933 
934     return bRetval;
935 }
936 
937 //////////////////////////////////////////////////////////////////////////////
938 
939 void SdXMLExport::ImpWriteAutoLayoutInfos()
940 {
941     if(mpAutoLayoutInfoList->Count())
942     {
943         for(sal_uInt32 nCnt = 0L; nCnt < mpAutoLayoutInfoList->Count(); nCnt++)
944         {
945             ImpXMLAutoLayoutInfo* pInfo = mpAutoLayoutInfoList->GetObject(nCnt);
946             if(pInfo)
947             {
948                 // prepare presentation-page layout attributes, style-name
949                 AddAttribute(XML_NAMESPACE_STYLE, XML_NAME, pInfo->GetLayoutName());
950 
951                 // write draw-style attributes
952                 SvXMLElementExport aDSE(*this, XML_NAMESPACE_STYLE, XML_PRESENTATION_PAGE_LAYOUT, sal_True, sal_True);
953 
954                 // write presentation placeholders
955                 switch(pInfo->GetLayoutType())
956                 {
957                     case 0 : // AUTOLAYOUT_TITLE
958                     {
959                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
960                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderSubtitle, pInfo->GetPresRectangle());
961                         break;
962                     }
963                     case 1 : // AUTOLAYOUT_ENUM
964                     {
965                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
966                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, pInfo->GetPresRectangle());
967                         break;
968                     }
969                     case 2 : // AUTOLAYOUT_CHART
970                     {
971                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
972                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderChart, pInfo->GetPresRectangle());
973                         break;
974                     }
975                     case 3 : // AUTOLAYOUT_2TEXT
976                     {
977                         Rectangle aLeft(pInfo->GetPresRectangle());
978                         aLeft.setWidth(long(aLeft.GetWidth() * 0.488));
979                         Rectangle aRight(aLeft);
980                         aRight.Left() = long(aRight.Left() + aRight.GetWidth() * 1.05);
981 
982                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
983                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aLeft);
984                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aRight);
985                         break;
986                     }
987                     case 4 : // AUTOLAYOUT_TEXTCHART
988                     {
989                         Rectangle aLeft(pInfo->GetPresRectangle());
990                         aLeft.setWidth(long(aLeft.GetWidth() * 0.488));
991                         Rectangle aRight(aLeft);
992                         aRight.Left() = long(aRight.Left() + aRight.GetWidth() * 1.05);
993 
994                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
995                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aLeft);
996                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderChart, aRight);
997                         break;
998                     }
999                     case 6 : // AUTOLAYOUT_TEXTCLIP
1000                     {
1001                         Rectangle aLeft(pInfo->GetPresRectangle());
1002                         aLeft.setWidth(long(aLeft.GetWidth() * 0.488));
1003                         Rectangle aRight(aLeft);
1004                         aRight.Left() = long(aRight.Left() + aRight.GetWidth() * 1.05);
1005 
1006                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1007                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aLeft);
1008                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aRight);
1009                         break;
1010                     }
1011                     case 7 : // AUTOLAYOUT_CHARTTEXT
1012                     {
1013                         Rectangle aLeft(pInfo->GetPresRectangle());
1014                         aLeft.setWidth(long(aLeft.GetWidth() * 0.488));
1015                         Rectangle aRight(aLeft);
1016                         aRight.Left() = long(aRight.Left() + aRight.GetWidth() * 1.05);
1017 
1018                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1019                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderChart, aLeft);
1020                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aRight);
1021                         break;
1022                     }
1023                     case 8 : // AUTOLAYOUT_TAB
1024                     {
1025                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1026                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTable, pInfo->GetPresRectangle());
1027                         break;
1028                     }
1029                     case 9 : // AUTOLAYOUT_CLIPTEXT
1030                     {
1031                         Rectangle aLeft(pInfo->GetPresRectangle());
1032                         aLeft.setWidth(long(aLeft.GetWidth() * 0.488));
1033                         Rectangle aRight(aLeft);
1034                         aRight.Left() = long(aRight.Left() + aRight.GetWidth() * 1.05);
1035 
1036                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1037                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aLeft);
1038                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aRight);
1039                         break;
1040                     }
1041                     case 10 : // AUTOLAYOUT_TEXTOBJ
1042                     {
1043                         Rectangle aLeft(pInfo->GetPresRectangle());
1044                         aLeft.setWidth(long(aLeft.GetWidth() * 0.488));
1045                         Rectangle aRight(aLeft);
1046                         aRight.Left() = long(aRight.Left() + aRight.GetWidth() * 1.05);
1047 
1048                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1049                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aLeft);
1050                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aRight);
1051                         break;
1052                     }
1053                     case 11 : // AUTOLAYOUT_OBJ
1054                     {
1055                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1056                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, pInfo->GetPresRectangle());
1057                         break;
1058                     }
1059                     case 12 : // AUTOLAYOUT_TEXT2OBJ
1060                     {
1061                         Rectangle aLeft(pInfo->GetPresRectangle());
1062                         aLeft.setWidth(long(aLeft.GetWidth() * 0.488));
1063                         Rectangle aRightTop(aLeft);
1064                         aRightTop.Left() = long(aRightTop.Left() + aRightTop.GetWidth() * 1.05);
1065                         aRightTop.setHeight(long(aRightTop.GetHeight() * 0.477));
1066                         Rectangle aRightBottom(aRightTop);
1067                         aRightBottom.Top() = long(aRightBottom.Top() + aRightBottom.GetHeight() * 1.095);
1068 
1069                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1070                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aLeft);
1071                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aRightTop);
1072                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aRightBottom);
1073                         break;
1074                     }
1075                     case 13 : // AUTOLAYOUT_OBJTEXT
1076                     {
1077                         Rectangle aLeft(pInfo->GetPresRectangle());
1078                         aLeft.setWidth(long(aLeft.GetWidth() * 0.488));
1079                         Rectangle aRight(aLeft);
1080                         aRight.Left() = long(aRight.Left() + aRight.GetWidth() * 1.05);
1081 
1082                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1083                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aLeft);
1084                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aRight);
1085                         break;
1086                     }
1087                     case 14 : // AUTOLAYOUT_OBJOVERTEXT
1088                     {
1089                         Rectangle aTop(pInfo->GetPresRectangle());
1090                         aTop.setHeight(long(aTop.GetHeight() * 0.477));
1091                         Rectangle aBottom(aTop);
1092                         aBottom.Top() = long(aBottom.Top() + aBottom.GetHeight() * 1.095);
1093 
1094                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1095                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aTop);
1096                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aBottom);
1097                         break;
1098                     }
1099                     case 15 : // AUTOLAYOUT_2OBJTEXT
1100                     {
1101                         Rectangle aLeftTop(pInfo->GetPresRectangle());
1102                         aLeftTop.setWidth(long(aLeftTop.GetWidth() * 0.488));
1103                         Rectangle aRight(aLeftTop);
1104                         aRight.Left() = long(aRight.Left() + aRight.GetWidth() * 1.05);
1105                         aLeftTop.setHeight(long(aLeftTop.GetHeight() * 0.477));
1106                         Rectangle aLeftBottom(aLeftTop);
1107                         aLeftBottom.Top() = long(aLeftBottom.Top() + aLeftBottom.GetHeight() * 1.095);
1108 
1109                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1110                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aLeftTop);
1111                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aLeftBottom);
1112                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aRight);
1113                         break;
1114                     }
1115                     case 16 : // AUTOLAYOUT_2OBJOVERTEXT
1116                     {
1117                         Rectangle aTopLeft(pInfo->GetPresRectangle());
1118                         aTopLeft.setHeight(long(aTopLeft.GetHeight() * 0.477));
1119                         Rectangle aBottom(aTopLeft);
1120                         aBottom.Top() = long(aBottom.Top() + aBottom.GetHeight() * 1.095);
1121                         aTopLeft.setWidth(long(aTopLeft.GetWidth() * 0.488));
1122                         Rectangle aTopRight(aTopLeft);
1123                         aTopRight.Left() = long(aTopRight.Left() + aTopRight.GetWidth() * 1.05);
1124 
1125                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1126                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aTopLeft);
1127                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aTopRight);
1128                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aBottom);
1129                         break;
1130                     }
1131                     case 17 : // AUTOLAYOUT_TEXTOVEROBJ
1132                     {
1133                         Rectangle aTop(pInfo->GetPresRectangle());
1134                         aTop.setHeight(long(aTop.GetHeight() * 0.477));
1135                         Rectangle aBottom(aTop);
1136                         aBottom.Top() = long(aBottom.Top() + aBottom.GetHeight() * 1.095);
1137 
1138                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1139                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderOutline, aTop);
1140                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aBottom);
1141                         break;
1142                     }
1143                     case 18 : // AUTOLAYOUT_4OBJ
1144                     {
1145                         Rectangle aTopLeft(pInfo->GetPresRectangle());
1146                         aTopLeft.setHeight(long(aTopLeft.GetHeight() * 0.477));
1147                         aTopLeft.setWidth(long(aTopLeft.GetWidth() * 0.488));
1148                         Rectangle aBottomLeft(aTopLeft);
1149                         aBottomLeft.Top() = long(aBottomLeft.Top() + aBottomLeft.GetHeight() * 1.095);
1150                         Rectangle aTopRight(aTopLeft);
1151                         aTopRight.Left() = long(aTopRight.Left() + aTopRight.GetWidth() * 1.05);
1152                         Rectangle aBottomRight(aTopRight);
1153                         aBottomRight.Top() = long(aBottomRight.Top() + aBottomRight.GetHeight() * 1.095);
1154 
1155                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1156                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aTopLeft);
1157                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aTopRight);
1158                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aBottomLeft);
1159                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderObject, aBottomRight);
1160                         break;
1161                     }
1162                     case 19 : // AUTOLAYOUT_ONLY_TITLE
1163                     {
1164                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1165                         break;
1166                     }
1167                     case 21 : // AUTOLAYOUT_NOTES
1168                     {
1169                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderPage, pInfo->GetTitleRectangle());
1170                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderNotes, pInfo->GetPresRectangle());
1171                         break;
1172                     }
1173                     case 22 : // AUTOLAYOUT_HANDOUT1
1174                     case 23 : // AUTOLAYOUT_HANDOUT2
1175                     case 24 : // AUTOLAYOUT_HANDOUT3
1176                     case 25 : // AUTOLAYOUT_HANDOUT4
1177                     case 26 : // AUTOLAYOUT_HANDOUT6
1178                     case 31 : // AUTOLAYOUT_HANDOUT9
1179                     {
1180                         sal_Int32 nColCnt, nRowCnt;
1181                         sal_Int32 nGapX = pInfo->GetGapX();
1182                         sal_Int32 nGapY = pInfo->GetGapY();
1183 
1184                         switch(pInfo->GetLayoutType())
1185                         {
1186                             case 22 : nColCnt = 1; nRowCnt = 1; break;
1187                             case 23 : nColCnt = 1; nRowCnt = 2; break;
1188                             case 24 : nColCnt = 1; nRowCnt = 3; break;
1189                             case 25 : nColCnt = 2; nRowCnt = 2; break;
1190                             case 26 : nColCnt = 3; nRowCnt = 2; break;
1191                             case 31 : nColCnt = 3; nRowCnt = 3; break;
1192                             default:  nColCnt = 0; nRowCnt = 0; break;  // FIXME - What is correct values?
1193                         }
1194 
1195                         Size aPartSize(pInfo->GetTitleRectangle().GetSize());
1196                         Point aPartPos(pInfo->GetTitleRectangle().TopLeft());
1197 
1198                         if(aPartSize.Width() > aPartSize.Height())
1199                         {
1200                             sal_Int32 nZwi(nColCnt);
1201                             nColCnt = nRowCnt;
1202                             nRowCnt = nZwi;
1203                         }
1204 
1205                         aPartSize.Width() = (aPartSize.Width() - ((nColCnt - 1) * nGapX)) / nColCnt;
1206                         aPartSize.Height() = (aPartSize.Height() - ((nRowCnt - 1) * nGapY)) / nRowCnt;
1207 
1208                         Point aTmpPos(aPartPos);
1209 
1210                         for (sal_Int32 a = 0; a < nRowCnt; a++)
1211                         {
1212                             aTmpPos.X() = aPartPos.X();
1213 
1214                             for (sal_Int32 b = 0; b < nColCnt; b++)
1215                             {
1216                                 Rectangle aTmpRect(aTmpPos, aPartSize);
1217 
1218                                 ImpWriteAutoLayoutPlaceholder(XmlPlaceholderHandout, aTmpRect);
1219                                 aTmpPos.X() += aPartSize.Width() + nGapX;
1220                             }
1221 
1222                             aTmpPos.Y() += aPartSize.Height() + nGapY;
1223                         }
1224                         break;
1225                     }
1226                     case 27 : // AUTOLAYOUT_VERTICAL_TITLE_TEXT_CHART
1227                     {
1228                         Rectangle aTop(pInfo->GetPresRectangle());
1229                         aTop.setHeight(long(aTop.GetHeight() * 0.488));
1230                         Rectangle aBottom(aTop);
1231                         aBottom.Top() = long(aBottom.Top() + aBottom.GetHeight() * 1.05);
1232 
1233                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderVerticalTitle, pInfo->GetTitleRectangle());
1234                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderVerticalOutline, aTop);
1235                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderChart, aBottom);
1236                         break;
1237                     }
1238                     case 28 : // AUTOLAYOUT_VERTICAL_TITLE_VERTICAL_OUTLINE
1239                     {
1240                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderVerticalTitle, pInfo->GetTitleRectangle());
1241                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderVerticalOutline, pInfo->GetPresRectangle());
1242                         break;
1243                     }
1244                     case 29 : // AUTOLAYOUT_TITLE_VERTICAL_OUTLINE
1245                     {
1246                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1247                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderVerticalOutline, pInfo->GetPresRectangle());
1248                         break;
1249                     }
1250                     case 30 : // AUTOLAYOUT_TITLE_VERTICAL_OUTLINE_CLIPART
1251                     {
1252                         Rectangle aLeft(pInfo->GetPresRectangle());
1253                         aLeft.setWidth(long(aLeft.GetWidth() * 0.488));
1254                         Rectangle aRight(aLeft);
1255                         aRight.Left() = long(aRight.Left() + aRight.GetWidth() * 1.05);
1256 
1257                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1258                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aLeft);
1259                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderVerticalOutline, aRight);
1260                         break;
1261                     }
1262                     case 32 : // AUTOLAYOUT_TITLE
1263                     {
1264                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderSubtitle, pInfo->GetPresRectangle());
1265                         break;
1266                     }
1267 
1268                     case 33 : // AUTOLAYOUT_4CLIPART
1269                     {
1270                         Rectangle aTopLeft(pInfo->GetPresRectangle());
1271                         aTopLeft.setHeight(long(aTopLeft.GetHeight() * 0.477));
1272                         aTopLeft.setWidth(long(aTopLeft.GetWidth() * 0.488));
1273                         Rectangle aBottomLeft(aTopLeft);
1274                         aBottomLeft.Top() = long(aBottomLeft.Top() + aBottomLeft.GetHeight() * 1.095);
1275                         Rectangle aTopRight(aTopLeft);
1276                         aTopRight.Left() = long(aTopRight.Left() + aTopRight.GetWidth() * 1.05);
1277                         Rectangle aBottomRight(aTopRight);
1278                         aBottomRight.Top() = long(aBottomRight.Top() + aBottomRight.GetHeight() * 1.095);
1279 
1280                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1281                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aTopLeft);
1282                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aTopRight);
1283                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aBottomLeft);
1284                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aBottomRight);
1285                         break;
1286                     }
1287 
1288                     case 34 : // AUTOLAYOUT_6CLIPART
1289                     {
1290                         Rectangle aTopLeft(pInfo->GetPresRectangle());
1291                         aTopLeft.setHeight(long(aTopLeft.GetHeight() * 0.477));
1292                         aTopLeft.setWidth(long(aTopLeft.GetWidth() * 0.322));
1293                         Rectangle aTopCenter(aTopLeft);
1294                         aTopCenter.Left() = long(aTopCenter.Left() + aTopCenter.GetWidth() * 1.05);
1295                         Rectangle aTopRight(aTopLeft);
1296                         aTopRight.Left() = long(aTopRight.Left() + aTopRight.GetWidth() * 2 * 1.05);
1297 
1298                         Rectangle aBottomLeft(aTopLeft);
1299                         aBottomLeft.Top() = long(aBottomLeft.Top() + aBottomLeft.GetHeight() * 1.095);
1300                         Rectangle aBottomCenter(aTopCenter);
1301                         aBottomCenter.Top() = long(aBottomCenter.Top() + aBottomCenter.GetHeight() * 1.095);
1302                         Rectangle aBottomRight(aTopRight);
1303                         aBottomRight.Top() = long(aBottomRight.Top() + aBottomRight.GetHeight() * 1.095);
1304 
1305                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderTitle, pInfo->GetTitleRectangle());
1306                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aTopLeft);
1307                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aTopCenter);
1308                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aTopRight);
1309                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aBottomLeft);
1310                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aBottomCenter);
1311                         ImpWriteAutoLayoutPlaceholder(XmlPlaceholderGraphic, aBottomRight);
1312                         break;
1313                     }
1314                     default:
1315                     {
1316                         DBG_ERROR("XMLEXP: unknown autolayout export");
1317                         break;
1318                     }
1319                 }
1320             }
1321         }
1322     }
1323 }
1324 
1325 //////////////////////////////////////////////////////////////////////////////
1326 
1327 void SdXMLExport::ImpWriteAutoLayoutPlaceholder(XmlPlaceholder ePl, const Rectangle& rRect)
1328 {
1329     OUString aStr;
1330     OUStringBuffer sStringBuffer;
1331 
1332     // prepare presentation-placeholder attributes, presentation:object
1333     switch(ePl)
1334     {
1335         case XmlPlaceholderTitle: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("title")); break;
1336         case XmlPlaceholderOutline: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("outline")); break;
1337         case XmlPlaceholderSubtitle: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("subtitle")); break;
1338         case XmlPlaceholderText: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("text")); break;
1339         case XmlPlaceholderGraphic: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("graphic")); break;
1340         case XmlPlaceholderObject: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("object")); break;
1341         case XmlPlaceholderChart: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("chart")); break;
1342         case XmlPlaceholderOrgchart: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("orgchart")); break;
1343         case XmlPlaceholderTable: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("table")); break;
1344         case XmlPlaceholderPage: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("page")); break;
1345         case XmlPlaceholderNotes: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("notes")); break;
1346         case XmlPlaceholderHandout: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("handout")); break;
1347         case XmlPlaceholderVerticalTitle: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_title")); break;
1348         case XmlPlaceholderVerticalOutline: aStr = OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_outline")); break;
1349     }
1350 
1351     AddAttribute(XML_NAMESPACE_PRESENTATION, XML_OBJECT, aStr);
1352 
1353     // svg:x,y,width,height
1354     GetMM100UnitConverter().convertMeasure(sStringBuffer, rRect.Left());
1355     aStr = sStringBuffer.makeStringAndClear();
1356     AddAttribute(XML_NAMESPACE_SVG, XML_X, aStr);
1357 
1358     GetMM100UnitConverter().convertMeasure(sStringBuffer, rRect.Top());
1359     aStr = sStringBuffer.makeStringAndClear();
1360     AddAttribute(XML_NAMESPACE_SVG, XML_Y, aStr);
1361 
1362     GetMM100UnitConverter().convertMeasure(sStringBuffer, rRect.GetWidth());
1363     aStr = sStringBuffer.makeStringAndClear();
1364     AddAttribute(XML_NAMESPACE_SVG, XML_WIDTH, aStr);
1365 
1366     GetMM100UnitConverter().convertMeasure(sStringBuffer, rRect.GetHeight());
1367     aStr = sStringBuffer.makeStringAndClear();
1368     AddAttribute(XML_NAMESPACE_SVG, XML_HEIGHT, aStr);
1369 
1370     // write presentation-placeholder
1371     SvXMLElementExport aPPL(*this, XML_NAMESPACE_PRESENTATION, XML_PLACEHOLDER, sal_True, sal_True);
1372 }
1373 
1374 //////////////////////////////////////////////////////////////////////////////
1375 
1376 ImpXMLEXPPageMasterInfo* SdXMLExport::ImpGetOrCreatePageMasterInfo( Reference< XDrawPage > xMasterPage )
1377 {
1378     bool bDoesExist = false;
1379 
1380     ImpXMLEXPPageMasterInfo* pNewInfo = new ImpXMLEXPPageMasterInfo(*this, xMasterPage);
1381 
1382     // compare with prev page-master infos
1383     for(sal_uInt32 a = 0; !bDoesExist && a < mpPageMasterInfoList->Count(); a++)
1384     {
1385         if(mpPageMasterInfoList->GetObject(a)
1386             && *mpPageMasterInfoList->GetObject(a) == *pNewInfo)
1387         {
1388             delete pNewInfo;
1389             pNewInfo = mpPageMasterInfoList->GetObject(a);
1390             bDoesExist = true;
1391         }
1392     }
1393     // add entry when not found same page-master infos
1394     if(!bDoesExist)
1395         mpPageMasterInfoList->Insert(pNewInfo, LIST_APPEND);
1396 
1397     return pNewInfo;
1398 }
1399 
1400 void SdXMLExport::ImpPrepPageMasterInfos()
1401 {
1402     if( IsImpress() )
1403     {
1404         // create page master info for handout master page
1405 
1406         Reference< XHandoutMasterSupplier > xHMS( GetModel(), UNO_QUERY );
1407         if( xHMS.is() )
1408         {
1409             Reference< XDrawPage > xMasterPage( xHMS->getHandoutMasterPage() );
1410             if( xMasterPage.is() )
1411                 mpHandoutPageMaster = ImpGetOrCreatePageMasterInfo(xMasterPage);
1412         }
1413     }
1414 
1415     // create page master infos for master pages
1416     if(mnDocMasterPageCount)
1417     {
1418         // look for needed page-masters, create these
1419         for (sal_Int32 nMPageId = 0; nMPageId < mnDocMasterPageCount; nMPageId++)
1420         {
1421             Reference< XDrawPage > xMasterPage( mxDocMasterPages->getByIndex(nMPageId), UNO_QUERY );
1422             ImpXMLEXPPageMasterInfo* pNewInfo = 0L;
1423 
1424             if(xMasterPage.is())
1425                 pNewInfo = ImpGetOrCreatePageMasterInfo(xMasterPage);
1426 
1427             mpPageMasterUsageList->Insert(pNewInfo, LIST_APPEND);
1428 
1429             // look for page master of handout page
1430             if(IsImpress())
1431             {
1432                 pNewInfo = NULL;
1433                 Reference< presentation::XPresentationPage > xPresPage(xMasterPage, UNO_QUERY);
1434                 if(xPresPage.is())
1435                 {
1436                     Reference< XDrawPage > xNotesPage(xPresPage->getNotesPage());
1437                     if(xNotesPage.is())
1438                     {
1439                         pNewInfo = ImpGetOrCreatePageMasterInfo(xNotesPage);
1440                     }
1441                 }
1442                 mpNotesPageMasterUsageList->Insert( pNewInfo, LIST_APPEND );
1443             }
1444         }
1445     }
1446 }
1447 
1448 //////////////////////////////////////////////////////////////////////////////
1449 
1450 void SdXMLExport::ImpWritePageMasterInfos()
1451 {
1452     // write created page-masters, create names for these
1453     for(sal_uInt32 nCnt = 0L; nCnt < mpPageMasterInfoList->Count(); nCnt++)
1454     {
1455         ImpXMLEXPPageMasterInfo* pInfo = mpPageMasterInfoList->GetObject(nCnt);
1456         if(pInfo)
1457         {
1458             // create name
1459             OUString sNewName = OUString(RTL_CONSTASCII_USTRINGPARAM("PM"));
1460 
1461             sNewName += OUString::valueOf((sal_Int32)nCnt);
1462             pInfo->SetName(sNewName);
1463 
1464             // prepare page-master attributes
1465             OUString sString;
1466             OUStringBuffer sStringBuffer;
1467 
1468             sString = sNewName;
1469             AddAttribute(XML_NAMESPACE_STYLE, XML_NAME, sString);
1470 
1471             // write page-layout
1472             SvXMLElementExport aPME(*this, XML_NAMESPACE_STYLE, XML_PAGE_LAYOUT, sal_True, sal_True);
1473 
1474             // prepare style:properties inside page-master
1475             GetMM100UnitConverter().convertMeasure(sStringBuffer, pInfo->GetBorderTop());
1476             sString = sStringBuffer.makeStringAndClear();
1477             AddAttribute(XML_NAMESPACE_FO, XML_MARGIN_TOP, sString);
1478 
1479             GetMM100UnitConverter().convertMeasure(sStringBuffer, pInfo->GetBorderBottom());
1480             sString = sStringBuffer.makeStringAndClear();
1481             AddAttribute(XML_NAMESPACE_FO, XML_MARGIN_BOTTOM, sString);
1482 
1483             GetMM100UnitConverter().convertMeasure(sStringBuffer, pInfo->GetBorderLeft());
1484             sString = sStringBuffer.makeStringAndClear();
1485             AddAttribute(XML_NAMESPACE_FO, XML_MARGIN_LEFT, sString);
1486 
1487             GetMM100UnitConverter().convertMeasure(sStringBuffer, pInfo->GetBorderRight());
1488             sString = sStringBuffer.makeStringAndClear();
1489             AddAttribute(XML_NAMESPACE_FO, XML_MARGIN_RIGHT, sString);
1490 
1491             GetMM100UnitConverter().convertMeasure(sStringBuffer, pInfo->GetWidth());
1492             sString = sStringBuffer.makeStringAndClear();
1493             AddAttribute(XML_NAMESPACE_FO, XML_PAGE_WIDTH, sString);
1494 
1495             GetMM100UnitConverter().convertMeasure(sStringBuffer, pInfo->GetHeight());
1496             sString = sStringBuffer.makeStringAndClear();
1497             AddAttribute(XML_NAMESPACE_FO, XML_PAGE_HEIGHT, sString);
1498 
1499             if(pInfo->GetOrientation() == view::PaperOrientation_PORTRAIT)
1500                 AddAttribute(XML_NAMESPACE_STYLE, XML_PRINT_ORIENTATION, XML_PORTRAIT);
1501             else
1502                 AddAttribute(XML_NAMESPACE_STYLE, XML_PRINT_ORIENTATION, XML_LANDSCAPE);
1503 
1504             // write style:properties
1505             SvXMLElementExport aPMF(*this, XML_NAMESPACE_STYLE, XML_PAGE_LAYOUT_PROPERTIES, sal_True, sal_True);
1506         }
1507     }
1508 }
1509 
1510 //////////////////////////////////////////////////////////////////////////////
1511 
1512 ImpXMLEXPPageMasterInfo* SdXMLExport::ImpGetPageMasterInfoByName(const OUString& rName)
1513 {
1514     if(rName.getLength() && mpPageMasterInfoList->Count())
1515     {
1516         for(sal_uInt32 nCnt = 0L; nCnt < mpPageMasterInfoList->Count(); nCnt++)
1517         {
1518             ImpXMLEXPPageMasterInfo* pInfo = mpPageMasterInfoList->GetObject(nCnt);
1519             if(pInfo)
1520             {
1521                 if(pInfo->GetMasterPageName().getLength() && rName.equals(pInfo->GetMasterPageName()))
1522                 {
1523                     return pInfo;
1524                 }
1525             }
1526         }
1527     }
1528     return 0L;
1529 }
1530 
1531 //////////////////////////////////////////////////////////////////////////////
1532 
1533 void SdXMLExport::ImpPrepDrawPageInfos()
1534 {
1535     // create draw:style-name entries for page export
1536     // containing presentation page attributes AND background attributes
1537     // fixed family for page-styles is "drawing-page" (XML_STYLE_FAMILY_SD_DRAWINGPAGE_NAME)
1538 
1539     sal_Int32 nCnt;
1540     for(nCnt = 0; nCnt < mnDocDrawPageCount; nCnt++)
1541     {
1542         Reference<XDrawPage> xDrawPage;
1543         mxDocDrawPages->getByIndex(nCnt) >>= xDrawPage;
1544         maDrawPagesStyleNames[nCnt] = ImpCreatePresPageStyleName( xDrawPage );
1545 
1546         Reference< presentation::XPresentationPage > xPresPage(xDrawPage, UNO_QUERY);
1547         if(xPresPage.is())
1548         {
1549             maDrawNotesPagesStyleNames[nCnt] = ImpCreatePresPageStyleName( xPresPage->getNotesPage(), false );
1550 
1551             maDrawPagesHeaderFooterSettings[nCnt] = ImpPrepDrawPageHeaderFooterDecls( xDrawPage );
1552             maDrawNotesPagesHeaderFooterSettings[nCnt] = ImpPrepDrawPageHeaderFooterDecls( xPresPage->getNotesPage() );
1553         }
1554     }
1555 }
1556 
1557 //////////////////////////////////////////////////////////////////////////////
1558 
1559 static OUString findOrAppendImpl( std::vector< OUString >& rVector, const OUString& rText, const sal_Char* pPrefix )
1560 {
1561     // search rVector if there is already a string that equals rText
1562     std::vector< OUString >::iterator aIter;
1563     sal_Int32 nIndex;
1564     for( nIndex = 1, aIter = rVector.begin(); aIter != rVector.end(); aIter++, nIndex++ )
1565     {
1566         if( (*aIter) == rText )
1567             break;
1568     }
1569 
1570     // if nothing is found, append the string at the end of rVector
1571     if( aIter == rVector.end() )
1572         rVector.push_back( rText );
1573 
1574     // create a reference string with pPrefix and the index of the
1575     // found or created rText
1576     OUString aStr( OUString::createFromAscii( pPrefix ) );
1577     aStr += OUString::valueOf( nIndex );
1578     return aStr;
1579 }
1580 
1581 static OUString findOrAppendImpl( std::vector< DateTimeDeclImpl >& rVector, const OUString& rText, sal_Bool bFixed, sal_Int32 nFormat, const sal_Char* pPrefix )
1582 {
1583     // search rVector if there is already a DateTimeDeclImpl with rText,bFixed and nFormat
1584     std::vector< DateTimeDeclImpl >::iterator aIter;
1585     sal_Int32 nIndex;
1586     for( nIndex = 1, aIter = rVector.begin(); aIter != rVector.end(); aIter++, nIndex++ )
1587     {
1588         const DateTimeDeclImpl& rDecl = (*aIter);
1589         if( (rDecl.mbFixed == bFixed ) &&
1590             (!bFixed || rDecl.maStrText == rText) &&
1591             (bFixed || (rDecl.mnFormat == nFormat) ) )
1592             break;
1593     }
1594 
1595     // if nothing is found, append a new DateTimeDeclImpl
1596     if( aIter == rVector.end() )
1597     {
1598         DateTimeDeclImpl aDecl;
1599         aDecl.maStrText = rText;
1600         aDecl.mbFixed = bFixed;
1601         aDecl.mnFormat = nFormat;
1602         rVector.push_back( aDecl );
1603     }
1604 
1605     // create a reference string with pPrefix and the index of the
1606     // found or created DateTimeDeclImpl
1607     OUString aStr( OUString::createFromAscii( pPrefix ) );
1608     aStr += OUString::valueOf( nIndex );
1609     return aStr;
1610 
1611 }
1612 
1613 static const sal_Char* gpStrHeaderTextPrefix = "hdr";
1614 static const sal_Char* gpStrFooterTextPrefix = "ftr";
1615 static const sal_Char* gpStrDateTimeTextPrefix = "dtd";
1616 
1617 HeaderFooterPageSettingsImpl SdXMLExport::ImpPrepDrawPageHeaderFooterDecls( const Reference<XDrawPage>& xDrawPage )
1618 {
1619     HeaderFooterPageSettingsImpl aSettings;
1620 
1621     if( xDrawPage.is() ) try
1622     {
1623         Reference< XPropertySet > xSet( xDrawPage, UNO_QUERY_THROW );
1624         Reference< XPropertySetInfo > xInfo( xSet->getPropertySetInfo() );
1625 
1626         OUString aStrText;
1627 
1628         const OUString aStrHeaderTextProp( RTL_CONSTASCII_USTRINGPARAM( "HeaderText" ) );
1629         if( xInfo->hasPropertyByName( aStrHeaderTextProp ) )
1630         {
1631             xSet->getPropertyValue( aStrHeaderTextProp  ) >>= aStrText;
1632             if( aStrText.getLength() )
1633                 aSettings.maStrHeaderDeclName = findOrAppendImpl( maHeaderDeclsVector, aStrText, gpStrHeaderTextPrefix );
1634         }
1635 
1636         const OUString aStrFooterTextProp( RTL_CONSTASCII_USTRINGPARAM( "FooterText" ) );
1637         if( xInfo->hasPropertyByName( aStrFooterTextProp ) )
1638         {
1639             xSet->getPropertyValue( aStrFooterTextProp ) >>= aStrText;
1640             if( aStrText.getLength() )
1641                 aSettings.maStrFooterDeclName = findOrAppendImpl( maFooterDeclsVector, aStrText, gpStrFooterTextPrefix );
1642         }
1643 
1644         const OUString aStrDateTimeTextProp( RTL_CONSTASCII_USTRINGPARAM( "DateTimeText" ) );
1645         if( xInfo->hasPropertyByName( aStrDateTimeTextProp ) )
1646         {
1647             sal_Bool bFixed = false;
1648             sal_Int32 nFormat = 0;
1649             xSet->getPropertyValue( aStrDateTimeTextProp ) >>= aStrText;
1650             xSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "IsDateTimeFixed" ) ) ) >>= bFixed;
1651             xSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "DateTimeFormat" ) ) ) >>= nFormat;
1652 
1653             if( !bFixed || aStrText.getLength() )
1654             {
1655                 aSettings.maStrDateTimeDeclName = findOrAppendImpl( maDateTimeDeclsVector, aStrText, bFixed, nFormat, gpStrDateTimeTextPrefix );
1656                 if( !bFixed )
1657                     addDataStyle( nFormat );
1658             }
1659         }
1660     }
1661     catch( Exception& e )
1662     {
1663         (void)e;
1664         DBG_ERROR( "SdXMLExport::ImpPrepDrawPageHeaderFooterDecls(), unexpected exception cought!" );
1665     }
1666 
1667     return aSettings;
1668 }
1669 
1670 //////////////////////////////////////////////////////////////////////////////
1671 
1672 void SdXMLExport::ImpWriteHeaderFooterDecls()
1673 {
1674     OUStringBuffer sBuffer;
1675 
1676     if( !maHeaderDeclsVector.empty() )
1677     {
1678         // export header decls
1679         const OUString aPrefix( OUString::createFromAscii( gpStrHeaderTextPrefix ) );
1680         std::vector< OUString >::iterator aIter;
1681         sal_Int32 nIndex;
1682         for( nIndex = 1, aIter = maHeaderDeclsVector.begin(); aIter != maHeaderDeclsVector.end(); aIter++, nIndex++ )
1683         {
1684             sBuffer.append( aPrefix );
1685             sBuffer.append( nIndex );
1686             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_NAME, sBuffer.makeStringAndClear());
1687 
1688             SvXMLElementExport aElem(*this, XML_NAMESPACE_PRESENTATION, XML_HEADER_DECL, sal_True, sal_True);
1689             Characters((*aIter));
1690         }
1691     }
1692 
1693     if( !maFooterDeclsVector.empty() )
1694     {
1695         // export footer decls
1696         const OUString aPrefix( OUString::createFromAscii( gpStrFooterTextPrefix ) );
1697         std::vector< OUString >::iterator aIter;
1698         sal_Int32 nIndex;
1699         for( nIndex = 1, aIter = maFooterDeclsVector.begin(); aIter != maFooterDeclsVector.end(); aIter++, nIndex++ )
1700         {
1701             sBuffer.append( aPrefix );
1702             sBuffer.append( nIndex );
1703             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_NAME, sBuffer.makeStringAndClear());
1704 
1705             SvXMLElementExport aElem(*this, XML_NAMESPACE_PRESENTATION, XML_FOOTER_DECL, sal_False, sal_False);
1706             Characters((*aIter));
1707         }
1708     }
1709 
1710     if( !maDateTimeDeclsVector.empty() )
1711     {
1712         // export footer decls
1713         const OUString aPrefix( OUString::createFromAscii( gpStrDateTimeTextPrefix ) );
1714         std::vector< DateTimeDeclImpl >::iterator aIter;
1715         sal_Int32 nIndex;
1716         for( nIndex = 1, aIter = maDateTimeDeclsVector.begin(); aIter != maDateTimeDeclsVector.end(); aIter++, nIndex++ )
1717         {
1718             const DateTimeDeclImpl& rDecl = (*aIter);
1719 
1720             sBuffer.append( aPrefix );
1721             sBuffer.append( nIndex );
1722             AddAttribute( XML_NAMESPACE_PRESENTATION, XML_NAME, sBuffer.makeStringAndClear());
1723 
1724             AddAttribute( XML_NAMESPACE_PRESENTATION, XML_SOURCE, rDecl.mbFixed ? XML_FIXED : XML_CURRENT_DATE );
1725 
1726             if( !rDecl.mbFixed )
1727                 AddAttribute( XML_NAMESPACE_STYLE, XML_DATA_STYLE_NAME, getDataStyleName( rDecl.mnFormat ) );
1728 
1729             SvXMLElementExport aElem(*this, XML_NAMESPACE_PRESENTATION, XML_DATE_TIME_DECL, sal_False, sal_False);
1730             if( rDecl.mbFixed )
1731                 Characters(rDecl.maStrText);
1732         }
1733     }
1734 }
1735 
1736 void SdXMLExport::ImplExportHeaderFooterDeclAttributes( const HeaderFooterPageSettingsImpl& aSettings )
1737 {
1738     if( aSettings.maStrHeaderDeclName.getLength() )
1739         AddAttribute( XML_NAMESPACE_PRESENTATION, XML_USE_HEADER_NAME, aSettings.maStrHeaderDeclName );
1740 
1741     if( aSettings.maStrFooterDeclName.getLength() )
1742         AddAttribute( XML_NAMESPACE_PRESENTATION, XML_USE_FOOTER_NAME, aSettings.maStrFooterDeclName );
1743 
1744     if( aSettings.maStrDateTimeDeclName.getLength() )
1745         AddAttribute( XML_NAMESPACE_PRESENTATION, XML_USE_DATE_TIME_NAME, aSettings.maStrDateTimeDeclName );
1746 }
1747 
1748 //////////////////////////////////////////////////////////////////////////////
1749 
1750 OUString SdXMLExport::ImpCreatePresPageStyleName( Reference<XDrawPage> xDrawPage, bool bExportBackground /* = true */ )
1751 {
1752     // create name
1753     OUString sStyleName;
1754 
1755     // create style for this page and add to auto style pool
1756 
1757     Reference< beans::XPropertySet > xPropSet1(xDrawPage, UNO_QUERY);
1758     if(xPropSet1.is())
1759     {
1760         Reference< beans::XPropertySet > xPropSet;
1761 
1762         if( bExportBackground )
1763         {
1764             // since the background items are in a different propertyset
1765             // which itself is a property of the pages property set
1766             // we now merge these two propertysets if possible to simulate
1767             // a single propertyset with all draw page properties
1768             const OUString aBackground(RTL_CONSTASCII_USTRINGPARAM("Background"));
1769             Reference< beans::XPropertySet > xPropSet2;
1770             Reference< beans::XPropertySetInfo > xInfo( xPropSet1->getPropertySetInfo() );
1771             if( xInfo.is() && xInfo->hasPropertyByName( aBackground ) )
1772             {
1773                 Any aAny( xPropSet1->getPropertyValue( aBackground ) );
1774                 aAny >>= xPropSet2;
1775             }
1776 
1777             if( xPropSet2.is() )
1778                 xPropSet = PropertySetMerger_CreateInstance( xPropSet1, xPropSet2 );
1779             else
1780                 xPropSet = xPropSet1;
1781         }
1782         else
1783         {
1784             xPropSet = xPropSet1;
1785         }
1786 
1787         const UniReference< SvXMLExportPropertyMapper > aMapperRef( GetPresPagePropsMapper() );
1788 
1789         std::vector< XMLPropertyState > xPropStates( aMapperRef->Filter( xPropSet ) );
1790 
1791         if( !xPropStates.empty() )
1792         {
1793             // there are filtered properties -> hard attributes
1794             // try to find this style in AutoStylePool
1795             sStyleName = GetAutoStylePool()->Find(XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID, sStyleName, xPropStates);
1796 
1797             if(!sStyleName.getLength())
1798             {
1799                 // Style did not exist, add it to AutoStalePool
1800                 sStyleName = GetAutoStylePool()->Add(XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID, sStyleName, xPropStates);
1801             }
1802         }
1803     }
1804 
1805     return sStyleName;
1806 }
1807 
1808 //////////////////////////////////////////////////////////////////////////////
1809 
1810 void SdXMLExport::ImpPrepMasterPageInfos()
1811 {
1812     // create draw:style-name entries for master page export
1813     // containing only background attributes
1814     // fixed family for page-styles is "drawing-page" (XML_STYLE_FAMILY_SD_DRAWINGPAGE_NAME)
1815 
1816     sal_Int32 nCnt;
1817     for( nCnt = 0; nCnt < mnDocMasterPageCount; nCnt++)
1818     {
1819         Reference<XDrawPage> xDrawPage;
1820         mxDocMasterPages->getByIndex(nCnt) >>= xDrawPage;
1821         maMasterPagesStyleNames[nCnt] = ImpCreatePresPageStyleName( xDrawPage );
1822     }
1823 
1824     if( IsImpress() )
1825     {
1826         Reference< presentation::XHandoutMasterSupplier > xHandoutSupp( GetModel(), UNO_QUERY );
1827         if( xHandoutSupp.is() )
1828         {
1829             Reference< XDrawPage > xHandoutPage( xHandoutSupp->getHandoutMasterPage() );
1830             if( xHandoutPage.is() )
1831             {
1832                 maHandoutPageHeaderFooterSettings = ImpPrepDrawPageHeaderFooterDecls( xHandoutPage );
1833                 maHandoutMasterStyleName = ImpCreatePresPageStyleName( xHandoutPage, false );
1834             }
1835         }
1836     }
1837 }
1838 
1839 //////////////////////////////////////////////////////////////////////////////
1840 void SdXMLExport::ImpWritePresentationStyles()
1841 {
1842     if(IsImpress())
1843     {
1844         for (sal_Int32 nCnt = 0; nCnt < mnDocMasterPageCount; nCnt++)
1845         {
1846             Any aAny(mxDocMasterPages->getByIndex(nCnt));
1847             Reference<container::XNamed> xNamed;
1848 
1849             if(aAny >>= xNamed)
1850             {
1851                 // write presentation styles (ONLY if presentation)
1852                 if(IsImpress() && mxDocStyleFamilies.is() && xNamed.is())
1853                 {
1854                     XMLStyleExport aStEx(*this, OUString(), GetAutoStylePool().get());
1855                     const UniReference< SvXMLExportPropertyMapper > aMapperRef( GetPropertySetMapper() );
1856 
1857                     OUString aPrefix( xNamed->getName() );
1858 
1859                     aPrefix += OUString(RTL_CONSTASCII_USTRINGPARAM("-"));
1860                     aStEx.exportStyleFamily(xNamed->getName(),
1861                         OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_NAME)),
1862                         aMapperRef, sal_False,
1863                         XML_STYLE_FAMILY_SD_PRESENTATION_ID, &aPrefix);
1864                 }
1865             }
1866         }
1867     }
1868 }
1869 
1870 //////////////////////////////////////////////////////////////////////////////
1871 
1872 void SdXMLExport::SetProgress(sal_Int32 nProg)
1873 {
1874     // set progress view
1875     if(GetStatusIndicator().is())
1876         GetStatusIndicator()->setValue(nProg);
1877 }
1878 
1879 //////////////////////////////////////////////////////////////////////////////
1880 // #82003#
1881 
1882 void SdXMLExport::_ExportMeta()
1883 {
1884     uno::Sequence<beans::NamedValue> stats(1);
1885     stats[0] = beans::NamedValue(::rtl::OUString::createFromAscii("ObjectCount"),
1886                 uno::makeAny(mnObjectCount));
1887 
1888     // update document statistics at the model
1889     uno::Reference<document::XDocumentPropertiesSupplier> xPropSup(GetModel(),
1890         uno::UNO_QUERY_THROW);
1891     uno::Reference<document::XDocumentProperties> xDocProps(
1892         xPropSup->getDocumentProperties());
1893     if (xDocProps.is()) {
1894         xDocProps->setDocumentStatistics(stats);
1895     }
1896 
1897     // call parent
1898     SvXMLExport::_ExportMeta();
1899 }
1900 
1901 //////////////////////////////////////////////////////////////////////////////
1902 
1903 void SdXMLExport::_ExportContent()
1904 {
1905     // export <pres:header-decl>, <pres:footer-decl> and <pres:date-time-decl> elements
1906     ImpWriteHeaderFooterDecls();
1907 
1908     // page export
1909     for(sal_Int32 nPageInd(0); nPageInd < mnDocDrawPageCount; nPageInd++)
1910     {
1911         uno::Reference<drawing::XDrawPage> xDrawPage( mxDocDrawPages->getByIndex(nPageInd), uno::UNO_QUERY );
1912 
1913         SetProgress(((nPageInd + 1) * 100) / mnDocDrawPageCount);
1914 
1915         if(xDrawPage.is())
1916         {
1917             // prepare page attributes, name of page
1918             Reference < container::XNamed > xNamed(xDrawPage, UNO_QUERY);
1919             if(xNamed.is())
1920                 AddAttribute(XML_NAMESPACE_DRAW, XML_NAME, xNamed->getName());
1921 
1922             // draw:style-name (presentation page attributes AND background attributes)
1923             if( maDrawPagesStyleNames[nPageInd].getLength() )
1924                 AddAttribute(XML_NAMESPACE_DRAW, XML_STYLE_NAME,
1925                         maDrawPagesStyleNames[nPageInd]);
1926 
1927             // draw:master-page-name
1928             Reference < drawing::XMasterPageTarget > xMasterPageInt(xDrawPage, UNO_QUERY);
1929             if(xMasterPageInt.is())
1930             {
1931                 Reference<XDrawPage> xUsedMasterPage(xMasterPageInt->getMasterPage());
1932                 if(xUsedMasterPage.is())
1933                 {
1934                     Reference < container::XNamed > xMasterNamed(xUsedMasterPage, UNO_QUERY);
1935                     if(xMasterNamed.is())
1936                     {
1937                         AddAttribute(XML_NAMESPACE_DRAW, XML_MASTER_PAGE_NAME,
1938                             EncodeStyleName( xMasterNamed->getName()) );
1939                     }
1940                 }
1941             }
1942 
1943             // presentation:page-layout-name
1944             if( IsImpress() && maDrawPagesAutoLayoutNames[nPageInd+1].getLength())
1945             {
1946                 AddAttribute(XML_NAMESPACE_PRESENTATION, XML_PRESENTATION_PAGE_LAYOUT_NAME, maDrawPagesAutoLayoutNames[nPageInd+1] );
1947             }
1948 
1949             Reference< beans::XPropertySet > xProps( xDrawPage, UNO_QUERY );
1950             if( xProps.is() )
1951             {
1952                 try
1953                 {
1954                     OUString aBookmarkURL;
1955                     xProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "BookmarkURL" ) ) ) >>= aBookmarkURL;
1956 
1957                     if( aBookmarkURL.getLength() )
1958                     {
1959                         sal_Int32 nIndex = aBookmarkURL.lastIndexOf( (sal_Unicode)'#' );
1960                         if( nIndex != -1 )
1961                         {
1962                             OUString aFileName( aBookmarkURL.copy( 0, nIndex ) );
1963                             OUString aBookmarkName( aBookmarkURL.copy( nIndex+1 ) );
1964 
1965                             aBookmarkURL = GetRelativeReference( aFileName );
1966                             aBookmarkURL += String( '#' );
1967                             aBookmarkURL += aBookmarkName;
1968                         }
1969 
1970                         AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, aBookmarkURL);
1971                         AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1972                         AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_REPLACE );
1973                         AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONREQUEST );
1974                     }
1975                 }
1976                 catch( Exception& )
1977                 {
1978                     DBG_ERROR(" no \"BookmarkURL\" property at page?" );
1979                 }
1980             }
1981 
1982             if( IsImpress() )
1983                 ImplExportHeaderFooterDeclAttributes( maDrawPagesHeaderFooterSettings[nPageInd] );
1984 
1985 
1986             OUString sNavigationOrder( getNavigationOrder( xDrawPage ) );
1987             if( sNavigationOrder.getLength() != 0 )
1988                 AddAttribute ( XML_NAMESPACE_DRAW, XML_NAV_ORDER, sNavigationOrder );
1989 
1990             UniReference< xmloff::AnimationsExporter >  xAnimationsExporter;
1991             uno::Reference< ::com::sun::star::animations::XAnimationNodeSupplier > xAnimNodeSupplier;
1992 
1993             // prepare animation export
1994             if(IsImpress())
1995             {
1996                 if( getExportFlags() & EXPORT_OASIS )
1997                 {
1998                     // export new animations for oasis format
1999                     xAnimNodeSupplier.set( xDrawPage, UNO_QUERY );
2000 
2001                     // prepare animations exporter if impress
2002                     if(xAnimNodeSupplier.is())
2003                     {
2004                         xAnimationsExporter = new xmloff::AnimationsExporter( *this, xProps );
2005                         xAnimationsExporter->prepare( xAnimNodeSupplier->getAnimationNode() );
2006                     }
2007                 }
2008                 else
2009                 {
2010                     // export old animations for ooo format
2011                     UniReference< XMLAnimationsExporter > xAnimExport = new XMLAnimationsExporter( GetShapeExport().get() );
2012                     GetShapeExport()->setAnimationsExporter( xAnimExport );
2013                 }
2014             }
2015 
2016             // write draw:id
2017             const OUString aPageId = getInterfaceToIdentifierMapper().getIdentifier( xDrawPage );
2018             if( aPageId.getLength() != 0 )
2019             {
2020                 AddAttributeIdLegacy(XML_NAMESPACE_DRAW, aPageId);
2021             }
2022 
2023             // write page
2024             SvXMLElementExport aDPG(*this, XML_NAMESPACE_DRAW, XML_PAGE, sal_True, sal_True);
2025 
2026             // write optional office:forms
2027             exportFormsElement( xDrawPage );
2028 
2029             // write graphic objects on this page (if any)
2030             Reference< drawing::XShapes > xExportShapes(xDrawPage, UNO_QUERY);
2031             if(xExportShapes.is() && xExportShapes->getCount())
2032                 GetShapeExport()->exportShapes( xExportShapes );
2033 
2034             // write animations and presentation notes (ONLY if presentation)
2035             if(IsImpress())
2036             {
2037                 if(xAnimNodeSupplier.is())
2038                 {
2039                     xAnimationsExporter->exportAnimations( xAnimNodeSupplier->getAnimationNode() );
2040                 }
2041                 else
2042                 {
2043                     // animations
2044                     UniReference< XMLAnimationsExporter > xAnimExport( GetShapeExport()->getAnimationsExporter() );
2045                     if( xAnimExport.is() )
2046                         xAnimExport->exportAnimations( *this );
2047 
2048                     xAnimExport = NULL;
2049                     GetShapeExport()->setAnimationsExporter( xAnimExport );
2050                 }
2051 
2052                 // presentations
2053                 Reference< presentation::XPresentationPage > xPresPage(xDrawPage, UNO_QUERY);
2054                 if(xPresPage.is())
2055                 {
2056                     Reference< XDrawPage > xNotesPage(xPresPage->getNotesPage());
2057                     if(xNotesPage.is())
2058                     {
2059                         Reference< drawing::XShapes > xShapes(xNotesPage, UNO_QUERY);
2060                         if(xShapes.is())
2061                         {
2062                             if( maDrawNotesPagesStyleNames[nPageInd].getLength() )
2063                                 AddAttribute(XML_NAMESPACE_DRAW, XML_STYLE_NAME, maDrawNotesPagesStyleNames[nPageInd]);
2064 
2065                             ImplExportHeaderFooterDeclAttributes( maDrawNotesPagesHeaderFooterSettings[nPageInd] );
2066 
2067                             // write presentation notes
2068                             SvXMLElementExport aPSY(*this, XML_NAMESPACE_PRESENTATION, XML_NOTES, sal_True, sal_True);
2069 
2070                             // write optional office:forms
2071                             exportFormsElement( xNotesPage );
2072 
2073                             // write shapes per se
2074                             GetShapeExport()->exportShapes( xShapes );
2075                         }
2076                     }
2077                 }
2078             }
2079 
2080             exportAnnotations( xDrawPage );
2081         }
2082     }
2083 
2084     if( IsImpress() )
2085         exportPresentationSettings();
2086 }
2087 
2088 //////////////////////////////////////////////////////////////////////////////
2089 
2090 void SdXMLExport::exportPresentationSettings()
2091 {
2092     try
2093     {
2094         Reference< XPresentationSupplier > xPresSupplier( GetModel(), UNO_QUERY );
2095         if( !xPresSupplier.is() )
2096             return;
2097 
2098         Reference< XPropertySet > xPresProps( xPresSupplier->getPresentation(), UNO_QUERY );
2099         if( !xPresProps.is() )
2100             return;
2101 
2102         sal_Bool bHasAttr = sal_False;
2103 
2104         sal_Bool bTemp = false;
2105 
2106         // export range
2107         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "IsShowAll" ) ) ) >>= bTemp;
2108         if( !bTemp )
2109         {
2110             OUString aFirstPage;
2111             xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FirstPage" ) ) ) >>= aFirstPage;
2112             if( aFirstPage.getLength() )
2113             {
2114                 AddAttribute(XML_NAMESPACE_PRESENTATION, XML_START_PAGE, aFirstPage );
2115                 bHasAttr = sal_True;
2116             }
2117             else
2118             {
2119                 OUString aCustomShow;
2120                 xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "CustomShow" ) ) ) >>= aCustomShow;
2121                 if( aCustomShow.getLength() )
2122                 {
2123                     AddAttribute(XML_NAMESPACE_PRESENTATION, XML_SHOW, aCustomShow );
2124                     bHasAttr = sal_True;
2125                 }
2126             }
2127         }
2128 
2129         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "IsEndless" ) ) ) >>= bTemp;
2130         if( bTemp )
2131         {
2132             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_ENDLESS, XML_TRUE );
2133             bHasAttr = sal_True;
2134 
2135             sal_Int32 nPause = 0;
2136             xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Pause" ) ) ) >>= nPause;
2137 
2138             util::DateTime aTime( 0, (sal_uInt16)nPause, 0, 0, 0, 0, 0 );
2139 
2140             OUStringBuffer aOut;
2141             SvXMLUnitConverter::convertTime( aOut, aTime );
2142             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_PAUSE, aOut.makeStringAndClear() );
2143         }
2144 
2145         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AllowAnimations" ) ) ) >>= bTemp;
2146         if( !bTemp )
2147         {
2148             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_ANIMATIONS, XML_DISABLED );
2149             bHasAttr = sal_True;
2150         }
2151 
2152         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "IsAlwaysOnTop" ) ) ) >>= bTemp;
2153         if( bTemp )
2154         {
2155             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_STAY_ON_TOP, XML_TRUE );
2156             bHasAttr = sal_True;
2157         }
2158 
2159         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "IsAutomatic" ) ) ) >>= bTemp;
2160         if( bTemp )
2161         {
2162             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_FORCE_MANUAL, XML_TRUE );
2163             bHasAttr = sal_True;
2164         }
2165 
2166         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFullScreen" ) ) ) >>= bTemp;
2167         if( !bTemp )
2168         {
2169             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_FULL_SCREEN, XML_FALSE );
2170             bHasAttr = sal_True;
2171         }
2172 
2173         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "IsMouseVisible" ) ) ) >>= bTemp;
2174         if( !bTemp )
2175         {
2176             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_MOUSE_VISIBLE, XML_FALSE );
2177             bHasAttr = sal_True;
2178         }
2179 
2180         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "StartWithNavigator" ) ) ) >>= bTemp;
2181         if( bTemp )
2182         {
2183             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_START_WITH_NAVIGATOR, XML_TRUE );
2184             bHasAttr = sal_True;
2185         }
2186 
2187         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "UsePen" ) ) ) >>= bTemp;
2188         if( bTemp )
2189         {
2190             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_MOUSE_AS_PEN, XML_TRUE );
2191             bHasAttr = sal_True;
2192         }
2193 
2194         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "IsTransitionOnClick" ) ) ) >>= bTemp;
2195         if( !bTemp )
2196         {
2197             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_TRANSITION_ON_CLICK, XML_DISABLED );
2198             bHasAttr = sal_True;
2199         }
2200 
2201         xPresProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "IsShowLogo" ) ) ) >>= bTemp;
2202         if( bTemp )
2203         {
2204             AddAttribute(XML_NAMESPACE_PRESENTATION, XML_SHOW_LOGO, XML_TRUE );
2205             bHasAttr = sal_True;
2206         }
2207 
2208         Reference< container::XNameContainer > xShows;
2209         Sequence< OUString > aShowNames;
2210         const OUString* pShowNames = NULL;
2211         sal_Int32 nShowCount = 0;
2212 
2213         Reference< XCustomPresentationSupplier > xSup( GetModel(), UNO_QUERY );
2214         if( xSup.is() )
2215         {
2216             xShows = xSup->getCustomPresentations();
2217             if( xShows.is() )
2218             {
2219                 aShowNames = xShows->getElementNames();
2220                 pShowNames = aShowNames.getArray();
2221                 nShowCount = aShowNames.getLength();
2222             }
2223         }
2224 
2225         if( bHasAttr || nShowCount != 0 )
2226         {
2227             SvXMLElementExport aSettings(*this, XML_NAMESPACE_PRESENTATION, XML_SETTINGS, sal_True, sal_True);
2228 
2229             if( nShowCount == 0 )
2230                 return;
2231 
2232             Reference< XIndexContainer > xShow;
2233             Reference< XNamed > xPageName;
2234 
2235             OUStringBuffer sTmp;
2236 
2237             for( sal_Int32 nIndex = 0; nIndex < nShowCount; nIndex++, pShowNames++ )
2238             {
2239                 AddAttribute(XML_NAMESPACE_PRESENTATION, XML_NAME, *pShowNames );
2240 
2241                 xShows->getByName( *pShowNames ) >>= xShow;
2242                 DBG_ASSERT( xShow.is(), "invalid custom show!" );
2243                 if( !xShow.is() )
2244                     continue;
2245 
2246                 const sal_Int32 nPageCount = xShow->getCount();
2247                 for( sal_Int32 nPage = 0; nPage < nPageCount; nPage++ )
2248                 {
2249                     xShow->getByIndex( nPage ) >>= xPageName;
2250 
2251                     if( !xPageName.is() )
2252                         continue;
2253 
2254                     if( sTmp.getLength() != 0 )
2255                         sTmp.append( sal_Unicode( ',' ) );
2256                     sTmp.append( xPageName->getName() );
2257 
2258                 }
2259 
2260                 if( sTmp.getLength() )
2261                     AddAttribute(XML_NAMESPACE_PRESENTATION, XML_PAGES, sTmp.makeStringAndClear() );
2262 
2263                 SvXMLElementExport aShows(*this, XML_NAMESPACE_PRESENTATION, XML_SHOW, sal_True, sal_True);
2264             }
2265         }
2266     }
2267     catch( uno::Exception )
2268     {
2269         DBG_ERROR( "uno::Exception while exporting <presentation:settings>" );
2270     }
2271 }
2272 
2273 //////////////////////////////////////////////////////////////////////////////
2274 
2275 void SdXMLExport::_ExportStyles(sal_Bool bUsed)
2276 {
2277     GetPropertySetMapper()->SetAutoStyles( sal_False );
2278 
2279     // export fill styles
2280     SvXMLExport::_ExportStyles( bUsed );
2281 
2282     // write draw:style-name for object graphic-styles
2283     GetShapeExport()->ExportGraphicDefaults();
2284 
2285     // do not export in ODF 1.1 or older
2286     if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 )
2287         GetShapeExport()->GetShapeTableExport()->exportTableStyles();
2288 
2289     // write presentation styles
2290     ImpWritePresentationStyles();
2291 
2292     // prepare draw:auto-layout-name for page export
2293     ImpPrepAutoLayoutInfos();
2294 
2295     // write draw:auto-layout-name for page export
2296     ImpWriteAutoLayoutInfos();
2297 
2298     Reference< beans::XPropertySet > xInfoSet( getExportInfo() );
2299     if( xInfoSet.is() )
2300     {
2301         Reference< beans::XPropertySetInfo > xInfoSetInfo( xInfoSet->getPropertySetInfo() );
2302 
2303         Any aAny;
2304 
2305         if( xInfoSetInfo->hasPropertyByName( msPageLayoutNames ) )
2306         {
2307             aAny <<= maDrawPagesAutoLayoutNames;
2308             xInfoSet->setPropertyValue( msPageLayoutNames, aAny );
2309         }
2310     }
2311 }
2312 
2313 //////////////////////////////////////////////////////////////////////////////
2314 
2315 void SdXMLExport::_ExportAutoStyles()
2316 {
2317     Reference< beans::XPropertySet > xInfoSet( getExportInfo() );
2318     if( xInfoSet.is() )
2319     {
2320         Reference< beans::XPropertySetInfo > xInfoSetInfo( xInfoSet->getPropertySetInfo() );
2321 
2322         if( xInfoSetInfo->hasPropertyByName( msPageLayoutNames ) )
2323         {
2324             xInfoSet->getPropertyValue( msPageLayoutNames ) >>= maDrawPagesAutoLayoutNames;
2325         }
2326     }
2327 
2328     GetPropertySetMapper()->SetAutoStyles( sal_True );
2329 
2330     if( getExportFlags() & EXPORT_STYLES )
2331     {
2332         // #80012# PageMaster export moved from _ExportStyles
2333         // prepare page-master infos
2334         ImpPrepPageMasterInfos();
2335 
2336         // write page-master infos
2337         ImpWritePageMasterInfos();
2338 
2339         // prepare draw:style-name for master page export
2340         ImpPrepMasterPageInfos();
2341     }
2342 
2343     if( getExportFlags() & EXPORT_CONTENT )
2344     {
2345         // prepare draw:style-name for page export
2346         ImpPrepDrawPageInfos();
2347     }
2348 
2349     // export draw-page styles
2350     GetAutoStylePool()->exportXML(
2351         XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID
2352         , GetDocHandler(),
2353         GetMM100UnitConverter(),
2354         GetNamespaceMap()
2355         );
2356 
2357     if( getExportFlags() & EXPORT_STYLES )
2358     {
2359         // create auto style infos for shapes on master handout page
2360         if( IsImpress() )
2361         {
2362             Reference< presentation::XHandoutMasterSupplier > xHandoutSupp( GetModel(), UNO_QUERY );
2363             if( xHandoutSupp.is() )
2364             {
2365                 Reference< XDrawPage > xHandoutPage( xHandoutSupp->getHandoutMasterPage() );
2366                 if( xHandoutPage.is() )
2367                 {
2368                     Reference< drawing::XShapes > xShapes(xHandoutPage, UNO_QUERY);
2369                     if(xShapes.is() && xShapes->getCount())
2370                         GetShapeExport()->collectShapesAutoStyles( xShapes );
2371                 }
2372             }
2373         }
2374 
2375         // create auto style infos for objects on master pages
2376         for(sal_Int32 nMPageId(0L); nMPageId < mnDocMasterPageCount; nMPageId++)
2377         {
2378             Reference< XDrawPage > xMasterPage(mxDocMasterPages->getByIndex(nMPageId), UNO_QUERY );
2379 
2380             if( xMasterPage.is() )
2381             {
2382                 // collect layer information
2383                 GetFormExport()->examineForms( xMasterPage );
2384 
2385                 // get MasterPage Name
2386                 OUString aMasterPageNamePrefix;
2387                 Reference < container::XNamed > xNamed(xMasterPage, UNO_QUERY);
2388                 if(xNamed.is())
2389                 {
2390                     aMasterPageNamePrefix = xNamed->getName();
2391                 }
2392                 if(aMasterPageNamePrefix.getLength())
2393                 {
2394                     aMasterPageNamePrefix += OUString(RTL_CONSTASCII_USTRINGPARAM("-"));
2395                 }
2396                 GetShapeExport()->setPresentationStylePrefix( aMasterPageNamePrefix );
2397 
2398                 Reference< drawing::XShapes > xMasterShapes(xMasterPage, UNO_QUERY);
2399                 if(xMasterShapes.is() && xMasterShapes->getCount())
2400                     GetShapeExport()->collectShapesAutoStyles( xMasterShapes );
2401 
2402                 if(IsImpress())
2403                 {
2404                     Reference< presentation::XPresentationPage > xPresPage(xMasterPage, UNO_QUERY);
2405                     if(xPresPage.is())
2406                     {
2407                         Reference< XDrawPage > xNotesPage(xPresPage->getNotesPage());
2408                         if(xNotesPage.is())
2409                         {
2410                             // collect layer information
2411                             GetFormExport()->examineForms( xNotesPage );
2412 
2413                             Reference< drawing::XShapes > xShapes(xNotesPage, UNO_QUERY);
2414                             if(xShapes.is() && xShapes->getCount())
2415                                 GetShapeExport()->collectShapesAutoStyles( xShapes );
2416                         }
2417                     }
2418                 }
2419                 collectAnnotationAutoStyles(xMasterPage);
2420             }
2421         }
2422     }
2423 
2424     if( getExportFlags() & EXPORT_CONTENT )
2425     {
2426         // prepare animations exporter if impress
2427         if(IsImpress() && ((getExportFlags() & EXPORT_OASIS) == 0) )
2428         {
2429             UniReference< XMLAnimationsExporter > xAnimExport = new XMLAnimationsExporter( GetShapeExport().get() );
2430             GetShapeExport()->setAnimationsExporter( xAnimExport );
2431         }
2432 
2433         // create auto style infos for objects on pages
2434         for(sal_Int32 nPageInd(0); nPageInd < mnDocDrawPageCount; nPageInd++)
2435         {
2436             Reference<XDrawPage> xDrawPage( mxDocDrawPages->getByIndex(nPageInd), UNO_QUERY );
2437             if( xDrawPage.is() )
2438             {
2439                 // collect layer information
2440                 GetFormExport()->examineForms( xDrawPage );
2441 
2442                 // get MasterPage Name
2443                 OUString aMasterPageNamePrefix;
2444                 Reference < drawing::XMasterPageTarget > xMasterPageInt(xDrawPage, UNO_QUERY);
2445                 if(xMasterPageInt.is())
2446                 {
2447                     Reference<XDrawPage> xUsedMasterPage(xMasterPageInt->getMasterPage());
2448                     if(xUsedMasterPage.is())
2449                     {
2450                         Reference < container::XNamed > xMasterNamed(xUsedMasterPage, UNO_QUERY);
2451                         if(xMasterNamed.is())
2452                         {
2453                             aMasterPageNamePrefix = xMasterNamed->getName();
2454                         }
2455                     }
2456                 }
2457                 if(aMasterPageNamePrefix.getLength())
2458                 {
2459                     aMasterPageNamePrefix += OUString(RTL_CONSTASCII_USTRINGPARAM("-"));
2460                 }
2461 
2462                 GetShapeExport()->setPresentationStylePrefix( aMasterPageNamePrefix );
2463 
2464                 // prepare object infos
2465                 Reference< drawing::XShapes > xDrawShapes(xDrawPage, UNO_QUERY);
2466                 if(xDrawShapes.is() && xDrawShapes->getCount())
2467                     GetShapeExport()->collectShapesAutoStyles( xDrawShapes );
2468 
2469                 // prepare presentation notes page object infos (ONLY if presentation)
2470                 if(IsImpress())
2471                 {
2472                     Reference< presentation::XPresentationPage > xPresPage(xDrawPage, UNO_QUERY);
2473                     if(xPresPage.is())
2474                     {
2475                         Reference< XDrawPage > xNotesPage(xPresPage->getNotesPage());
2476                         if(xNotesPage.is())
2477                         {
2478                             // collect layer information
2479                             GetFormExport()->examineForms( xNotesPage );
2480 
2481                             Reference< drawing::XShapes > xShapes(xNotesPage, UNO_QUERY);
2482                             if(xShapes.is() && xShapes->getCount())
2483                                 GetShapeExport()->collectShapesAutoStyles( xShapes );
2484                         }
2485                     }
2486                 }
2487 
2488                 collectAnnotationAutoStyles( xDrawPage );
2489             }
2490         }
2491         if(IsImpress())
2492         {
2493             UniReference< XMLAnimationsExporter > xAnimExport;
2494             GetShapeExport()->setAnimationsExporter( xAnimExport );
2495         }
2496     }
2497 
2498     exportAutoDataStyles();
2499 
2500     GetShapeExport()->exportAutoStyles();
2501 
2502     sal_uInt16 nContentAutostyles = EXPORT_CONTENT | EXPORT_AUTOSTYLES;
2503     if ( ( getExportFlags() & nContentAutostyles ) == nContentAutostyles )
2504         GetFormExport()->exportAutoStyles( );
2505 
2506     // ...for text
2507     GetTextParagraphExport()->exportTextAutoStyles();
2508 }
2509 
2510 //////////////////////////////////////////////////////////////////////////////
2511 
2512 void SdXMLExport::_ExportMasterStyles()
2513 {
2514     // export layer
2515     SdXMLayerExporter::exportLayer( *this );
2516 
2517     // export handout master page if impress
2518     if( IsImpress() )
2519     {
2520         Reference< presentation::XHandoutMasterSupplier > xHandoutSupp( GetModel(), UNO_QUERY );
2521         if( xHandoutSupp.is() )
2522         {
2523             Reference< XDrawPage > xHandoutPage( xHandoutSupp->getHandoutMasterPage() );
2524             if( xHandoutPage.is() )
2525             {
2526                 // presentation:page-layout-name
2527                 if( IsImpress() && maDrawPagesAutoLayoutNames[0].getLength())
2528                 {
2529                     AddAttribute(XML_NAMESPACE_PRESENTATION, XML_PRESENTATION_PAGE_LAYOUT_NAME, EncodeStyleName( maDrawPagesAutoLayoutNames[0] ));
2530                 }
2531 
2532                 ImpXMLEXPPageMasterInfo* pInfo = mpHandoutPageMaster;
2533                 if(pInfo)
2534                 {
2535                     OUString sString = pInfo->GetName();
2536                     AddAttribute(XML_NAMESPACE_STYLE, XML_PAGE_LAYOUT_NAME, sString );
2537                 }
2538 
2539                 // draw:style-name
2540                 if( maHandoutMasterStyleName.getLength() )
2541                     AddAttribute(XML_NAMESPACE_DRAW, XML_STYLE_NAME, maHandoutMasterStyleName);
2542 
2543                 ImplExportHeaderFooterDeclAttributes( maHandoutPageHeaderFooterSettings );
2544 
2545                 // write masterpage
2546                 SvXMLElementExport aMPG(*this, XML_NAMESPACE_STYLE, XML_HANDOUT_MASTER, sal_True, sal_True);
2547 
2548                 // write graphic objects on this master page (if any)
2549                 Reference< drawing::XShapes > xShapes(xHandoutPage, UNO_QUERY);
2550                 if(xShapes.is() && xShapes->getCount())
2551                     GetShapeExport()->exportShapes( xShapes );
2552             }
2553         }
2554     }
2555 
2556     // export MasterPages in master-styles section
2557     for (sal_Int32 nMPageId = 0; nMPageId < mnDocMasterPageCount; nMPageId++)
2558     {
2559         Reference< XDrawPage > xMasterPage( mxDocMasterPages->getByIndex(nMPageId), UNO_QUERY );
2560         if(xMasterPage.is())
2561         {
2562             // prepare masterpage attributes
2563             OUString sMasterPageName;
2564             Reference < container::XNamed > xNamed(xMasterPage, UNO_QUERY);
2565             if(xNamed.is())
2566             {
2567                 sal_Bool bEncoded = sal_False;
2568                 sMasterPageName = xNamed->getName();
2569                 AddAttribute(XML_NAMESPACE_STYLE, XML_NAME,
2570                     EncodeStyleName( sMasterPageName, &bEncoded ));
2571                 if( bEncoded )
2572                     AddAttribute(
2573                         XML_NAMESPACE_STYLE, XML_DISPLAY_NAME,
2574                         sMasterPageName );
2575             }
2576 
2577             ImpXMLEXPPageMasterInfo* pInfo = mpPageMasterUsageList->GetObject(nMPageId);
2578             if(pInfo)
2579             {
2580                 OUString sString = pInfo->GetName();
2581                 AddAttribute(XML_NAMESPACE_STYLE, XML_PAGE_LAYOUT_NAME, sString );
2582             }
2583 
2584             // draw:style-name (background attributes)
2585             if( maMasterPagesStyleNames[nMPageId].getLength() )
2586                 AddAttribute(XML_NAMESPACE_DRAW, XML_STYLE_NAME,
2587                         maMasterPagesStyleNames[nMPageId]);
2588 
2589             // write masterpage
2590             SvXMLElementExport aMPG(*this, XML_NAMESPACE_STYLE, XML_MASTER_PAGE, sal_True, sal_True);
2591 
2592             // write optional office:forms
2593             exportFormsElement( xMasterPage );
2594 
2595             // write graphic objects on this master page (if any)
2596             Reference< drawing::XShapes > xMasterShapes(xMasterPage, UNO_QUERY);
2597             if(xMasterShapes.is() && xMasterShapes->getCount())
2598                 GetShapeExport()->exportShapes( xMasterShapes );
2599 
2600             // write presentation notes (ONLY if presentation)
2601             if(IsImpress())
2602             {
2603                 Reference< presentation::XPresentationPage > xPresPage(xMasterPage, UNO_QUERY);
2604                 if(xPresPage.is())
2605                 {
2606                     Reference< XDrawPage > xNotesPage(xPresPage->getNotesPage());
2607                     if(xNotesPage.is())
2608                     {
2609                         Reference< drawing::XShapes > xShapes(xNotesPage, UNO_QUERY);
2610                         if(xShapes.is())
2611                         {
2612                             ImpXMLEXPPageMasterInfo* pMasterInfo = mpNotesPageMasterUsageList->GetObject(nMPageId);
2613                             if(pMasterInfo)
2614                             {
2615                                 OUString sString = pMasterInfo->GetName();
2616                                 AddAttribute(XML_NAMESPACE_STYLE, XML_PAGE_LAYOUT_NAME, sString);
2617                             }
2618 
2619                             // write presentation notes
2620                             SvXMLElementExport aPSY(*this, XML_NAMESPACE_PRESENTATION, XML_NOTES, sal_True, sal_True);
2621 
2622                             // write optional office:forms
2623                             exportFormsElement( xNotesPage );
2624 
2625                             // write shapes per se
2626                             GetShapeExport()->exportShapes( xShapes );
2627                         }
2628                     }
2629                 }
2630             }
2631             exportAnnotations( xMasterPage );
2632         }
2633     }
2634 }
2635 
2636 void SdXMLExport::exportFormsElement( Reference< XDrawPage > xDrawPage )
2637 {
2638     if( xDrawPage.is() )
2639     {
2640         Reference< form::XFormsSupplier2 > xFormsSupplier( xDrawPage, UNO_QUERY );
2641         if ( xFormsSupplier.is() && xFormsSupplier->hasForms() )
2642         {
2643             // write masterpage
2644             ::xmloff::OOfficeFormsExport aForms(*this);
2645             GetFormExport()->exportForms( xDrawPage );
2646         }
2647 
2648         if(! GetFormExport()->seekPage( xDrawPage ) )
2649         {
2650             DBG_ERROR( "OFormLayerXMLExport::seekPage failed!" );
2651         }
2652     }
2653 }
2654 
2655 void SdXMLExport::GetViewSettings(uno::Sequence<beans::PropertyValue>& rProps)
2656 {
2657     rProps.realloc(4);
2658     beans::PropertyValue* pProps = rProps.getArray();
2659     if(pProps)
2660     {
2661 //      SvXMLElementExport aViewSettingsElem(*this, XML_NAMESPACE_DRAW, XML_VIEW_SETTINGS, sal_True, sal_True);
2662 
2663         Reference< beans::XPropertySet > xPropSet( GetModel(), UNO_QUERY );
2664         if( !xPropSet.is() )
2665             return;
2666 
2667         awt::Rectangle aVisArea;
2668         xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ) ) >>= aVisArea;
2669 /*
2670         sal_Int16 nMapUnit;
2671         xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MapUnit" ) ) ) >>= nMapUnit;
2672 */
2673 
2674         sal_uInt16 i = 0;
2675         pProps[i].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleAreaTop"));
2676         pProps[i++].Value <<= aVisArea.Y;
2677         pProps[i].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleAreaLeft"));
2678         pProps[i++].Value <<= aVisArea.X;
2679         pProps[i].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleAreaWidth"));
2680         pProps[i++].Value <<= aVisArea.Width;
2681         pProps[i].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleAreaHeight"));
2682         pProps[i++].Value <<= aVisArea.Height;
2683     }
2684 }
2685 
2686 void SdXMLExport::GetConfigurationSettings(uno::Sequence<beans::PropertyValue>& rProps)
2687 {
2688     Reference< lang::XMultiServiceFactory > xFac( GetModel(), UNO_QUERY );
2689     if( xFac.is() )
2690     {
2691         Reference< beans::XPropertySet > xProps( xFac->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.Settings" ) ) ), UNO_QUERY );
2692         if( xProps.is() )
2693             SvXMLUnitConverter::convertPropertySet( rProps, xProps );
2694     }
2695 }
2696 
2697 //////////////////////////////////////////////////////////////////////////////
2698 
2699 void SdXMLExport::addDataStyle(const sal_Int32 nNumberFormat, sal_Bool bTimeFormat )
2700 {
2701     sal_Int32 nFormat = nNumberFormat;
2702     if( (nNumberFormat > 1) && (nNumberFormat <= 0x0f) )
2703         nFormat -= 2;
2704 
2705     if( bTimeFormat )
2706     {
2707         if( maUsedTimeStyles.count( nFormat ) == 0 )
2708             maUsedTimeStyles.insert( nFormat );
2709     }
2710     else
2711     {
2712         if( maUsedDateStyles.count( nFormat ) == 0 )
2713             maUsedDateStyles.insert( nFormat );
2714     }
2715 }
2716 
2717 //////////////////////////////////////////////////////////////////////////////
2718 
2719 void SdXMLExport::exportDataStyles()
2720 {
2721     // there are no data styles to export in draw/impress yet
2722 }
2723 
2724 //////////////////////////////////////////////////////////////////////////////
2725 
2726 void SdXMLExport::exportAutoDataStyles()
2727 {
2728     SdXMLFormatMap::iterator aIter( maUsedDateStyles.begin() );
2729     SdXMLFormatMap::iterator aEnd( maUsedDateStyles.end() );
2730 
2731     while( aIter != aEnd )
2732         SdXMLNumberStylesExporter::exportDateStyle( *this, (*aIter++) );
2733 
2734     aIter = maUsedTimeStyles.begin();
2735     aEnd = maUsedTimeStyles.end();
2736     while( aIter != aEnd )
2737         SdXMLNumberStylesExporter::exportTimeStyle( *this, (*aIter++) );
2738 
2739     if(HasFormExport())
2740         GetFormExport()->exportAutoControlNumberStyles();
2741 }
2742 
2743 //////////////////////////////////////////////////////////////////////////////
2744 
2745 OUString SdXMLExport::getDataStyleName(const sal_Int32 nNumberFormat, sal_Bool bTimeFormat ) const
2746 {
2747     if( bTimeFormat )
2748     {
2749         return SdXMLNumberStylesExporter::getTimeStyleName( nNumberFormat );
2750     }
2751     else
2752     {
2753         return SdXMLNumberStylesExporter::getDateStyleName( nNumberFormat );
2754     }
2755 }
2756 
2757 OUString SdXMLExport::getNavigationOrder( const Reference< XDrawPage >& xDrawPage )
2758 {
2759     OUStringBuffer sNavOrder;
2760     try
2761     {
2762         Reference< XPropertySet > xSet( xDrawPage, UNO_QUERY_THROW );
2763         Reference< XIndexAccess > xNavOrder( xSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "NavigationOrder" ) ) ), UNO_QUERY_THROW );
2764 
2765         Reference< XIndexAccess > xZOrderAccess( xDrawPage, UNO_QUERY );
2766 
2767         // only export navigation order if it is different from the z-order
2768         if( (xNavOrder.get() != xZOrderAccess.get()) && (xNavOrder->getCount() == xDrawPage->getCount())  )
2769         {
2770             sal_Int32 nIndex;
2771             const sal_Int32 nCount = xNavOrder->getCount();
2772             for( nIndex = 0; nIndex < nCount; ++nIndex )
2773             {
2774                 OUString sId( getInterfaceToIdentifierMapper().registerReference( Reference< XInterface >( xNavOrder->getByIndex( nIndex ), UNO_QUERY ) ) );
2775                 if( sId.getLength() != 0 )
2776                 {
2777                     if( sNavOrder.getLength() != 0 )
2778                         sNavOrder.append( (sal_Unicode)' ' );
2779                     sNavOrder.append( sId );
2780                 }
2781             }
2782         }
2783     }
2784     catch( Exception& )
2785     {
2786     }
2787     return sNavOrder.makeStringAndClear();
2788 }
2789 
2790 //////////////////////////////////////////////////////////////////////////////
2791 
2792 void SdXMLExport::collectAnnotationAutoStyles( const Reference<XDrawPage>& xDrawPage )
2793 {
2794     Reference< XAnnotationAccess > xAnnotationAccess( xDrawPage, UNO_QUERY );
2795     if( xAnnotationAccess.is() ) try
2796     {
2797         Reference< XAnnotationEnumeration > xAnnotationEnumeration( xAnnotationAccess->createAnnotationEnumeration() );
2798         if( xAnnotationEnumeration.is() )
2799         {
2800             while( xAnnotationEnumeration->hasMoreElements() )
2801             {
2802                 Reference< XAnnotation > xAnnotation( xAnnotationEnumeration->nextElement(), UNO_QUERY_THROW );
2803                 Reference< XText > xText( xAnnotation->getTextRange() );
2804                 if(xText.is() && xText->getString().getLength())
2805                     GetTextParagraphExport()->collectTextAutoStyles( xText );
2806             }
2807         }
2808     }
2809     catch( Exception& )
2810     {
2811         DBG_ERROR("SdXMLExport::collectAnnotationAutoStyles(), exception caught during export of annotation auto styles");
2812     }
2813 }
2814 
2815 void SdXMLExport::exportAnnotations( const Reference<XDrawPage>& xDrawPage )
2816 {
2817     // do not export in ODF 1.2 or older
2818     if( getDefaultVersion() <= SvtSaveOptions::ODFVER_012 )
2819         return;
2820 
2821     Reference< XAnnotationAccess > xAnnotationAccess( xDrawPage, UNO_QUERY );
2822     if( xAnnotationAccess.is() ) try
2823     {
2824         Reference< XAnnotationEnumeration > xAnnotationEnumeration( xAnnotationAccess->createAnnotationEnumeration() );
2825         if( xAnnotationEnumeration.is() && xAnnotationEnumeration->hasMoreElements() )
2826         {
2827             OUStringBuffer sStringBuffer;
2828             do
2829             {
2830                 Reference< XAnnotation > xAnnotation( xAnnotationEnumeration->nextElement(), UNO_QUERY_THROW );
2831 
2832                 RealPoint2D aPosition( xAnnotation->getPosition() );
2833 
2834                 GetMM100UnitConverter().convertMeasure(sStringBuffer, static_cast<sal_Int32>( aPosition.X * 100 ) );
2835                 AddAttribute(XML_NAMESPACE_SVG, XML_X, sStringBuffer.makeStringAndClear());
2836 
2837                 GetMM100UnitConverter().convertMeasure(sStringBuffer, static_cast<sal_Int32>( aPosition.Y * 100 ) );
2838                 AddAttribute(XML_NAMESPACE_SVG, XML_Y, sStringBuffer.makeStringAndClear());
2839 
2840                 RealSize2D aSize( xAnnotation->getSize() );
2841 
2842                 if( aSize.Width || aSize.Height )
2843                 {
2844                     GetMM100UnitConverter().convertMeasure(sStringBuffer, static_cast<sal_Int32>( aSize.Width * 100 ) );
2845                     AddAttribute(XML_NAMESPACE_SVG, XML_WIDTH, sStringBuffer.makeStringAndClear());
2846                     GetMM100UnitConverter().convertMeasure(sStringBuffer, static_cast<sal_Int32>( aSize.Height * 100 ) );
2847                     AddAttribute(XML_NAMESPACE_SVG, XML_HEIGHT, sStringBuffer.makeStringAndClear());
2848                 }
2849 
2850                 // annotation element + content
2851                 SvXMLElementExport aElem(*this, XML_NAMESPACE_OFFICE_EXT, XML_ANNOTATION, sal_False, sal_True);
2852 
2853                 // author
2854                 OUString aAuthor( xAnnotation->getAuthor() );
2855                 if( aAuthor.getLength() )
2856                 {
2857                     SvXMLElementExport aCreatorElem( *this, XML_NAMESPACE_DC, XML_CREATOR, sal_True, sal_False );
2858                     this->Characters(aAuthor);
2859                 }
2860 
2861                 {
2862                     // date time
2863                     DateTime aDate( xAnnotation->getDateTime() );
2864                     GetMM100UnitConverter().convertDateTime(sStringBuffer, aDate, sal_True);
2865                     SvXMLElementExport aDateElem( *this, XML_NAMESPACE_DC, XML_DATE, sal_True, sal_False );
2866                     Characters(sStringBuffer.makeStringAndClear());
2867                 }
2868 
2869                 com::sun::star::uno::Reference < com::sun::star::text::XText > xText( xAnnotation->getTextRange() );
2870                 if( xText.is() )
2871                     this->GetTextParagraphExport()->exportText( xText );
2872             }
2873             while( xAnnotationEnumeration->hasMoreElements() );
2874         }
2875     }
2876     catch( Exception& )
2877     {
2878         DBG_ERROR("SdXMLExport::exportAnnotations(), exception caught during export of annotations");
2879     }
2880 }
2881 
2882 //////////////////////////////////////////////////////////////////////////////
2883 
2884 #define SERVICE( classname, servicename, implementationname, draw, flags )\
2885 uno::Sequence< OUString > SAL_CALL classname##_getSupportedServiceNames() throw()\
2886 {\
2887     const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( servicename ) );\
2888     const uno::Sequence< OUString > aSeq( &aServiceName, 1 );\
2889     return aSeq;\
2890 }\
2891 OUString SAL_CALL classname##_getImplementationName() throw()\
2892 {\
2893     return OUString( RTL_CONSTASCII_USTRINGPARAM( implementationname ) );\
2894 }\
2895 uno::Reference< uno::XInterface > SAL_CALL classname##_createInstance(const uno::Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )\
2896 {\
2897     return (cppu::OWeakObject*)new SdXMLExport( rSMgr, draw, flags );\
2898 }
2899 
2900 SERVICE( XMLImpressExportOasis, "com.sun.star.comp.Impress.XMLOasisExporter", "XMLImpressExportOasis", sal_False, EXPORT_OASIS|EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS|EXPORT_FONTDECLS|EXPORT_EMBEDDED );
2901 SERVICE( XMLImpressStylesExportOasis, "com.sun.star.comp.Impress.XMLOasisStylesExporter", "XMLImpressStylesExportOasis", sal_False, EXPORT_OASIS|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES );
2902 SERVICE( XMLImpressContentExportOasis, "com.sun.star.comp.Impress.XMLOasisContentExporter", "XMLImpressContentExportOasis", sal_False, EXPORT_OASIS|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS );
2903 SERVICE( XMLImpressMetaExportOasis, "com.sun.star.comp.Impress.XMLOasisMetaExporter", "XMLImpressMetaExportOasis", sal_False, EXPORT_OASIS|EXPORT_META );
2904 SERVICE( XMLImpressSettingsExportOasis, "com.sun.star.comp.Impress.XMLOasisSettingsExporter", "XMLImpressSettingsExportOasis", sal_False, EXPORT_OASIS|EXPORT_SETTINGS );
2905 
2906 SERVICE( XMLImpressExportOOO, "com.sun.star.comp.Impress.XMLExporter", "XMLImpressExportOOO", sal_False, EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS|EXPORT_FONTDECLS|EXPORT_EMBEDDED );
2907 SERVICE( XMLImpressStylesExportOOO, "com.sun.star.comp.Impress.XMLStylesExporter", "XMLImpressStylesExportOOO", sal_False, EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES );
2908 SERVICE( XMLImpressContentExportOOO, "com.sun.star.comp.Impress.XMLContentExporter", "XMLImpressContentExportOOO", sal_False, EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS );
2909 SERVICE( XMLImpressMetaExportOOO, "com.sun.star.comp.Impress.XMLMetaExporter", "XMLImpressMetaExportOOO", sal_False, EXPORT_META );
2910 SERVICE( XMLImpressSettingsExportOOO, "com.sun.star.comp.Impress.XMLSettingsExporter", "XMLImpressSettingsExportOOO", sal_False, EXPORT_SETTINGS );
2911 
2912 SERVICE( XMLDrawExportOasis, "com.sun.star.comp.Draw.XMLOasisExporter", "XMLDrawExportOasis", sal_True, EXPORT_OASIS|EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS|EXPORT_FONTDECLS|EXPORT_EMBEDDED );
2913 SERVICE( XMLDrawStylesExportOasis, "com.sun.star.comp.Draw.XMLOasisStylesExporter", "XMLDrawStylesExportOasis", sal_True, EXPORT_OASIS|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES );
2914 SERVICE( XMLDrawContentExportOasis, "com.sun.star.comp.Draw.XMLOasisContentExporter", "XMLDrawContentExportOasis", sal_True, EXPORT_OASIS|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS );
2915 SERVICE( XMLDrawMetaExportOasis, "com.sun.star.comp.Draw.XMLOasisMetaExporter", "XMLDrawMetaExportOasis", sal_True, EXPORT_OASIS|EXPORT_META );
2916 SERVICE( XMLDrawSettingsExportOasis, "com.sun.star.comp.Draw.XMLOasisSettingsExporter", "XMLDrawSettingsExportOasis", sal_True, EXPORT_OASIS|EXPORT_SETTINGS );
2917 
2918 SERVICE( XMLDrawExportOOO, "com.sun.star.comp.Draw.XMLExporter", "XMLDrawExportOOO", sal_True, EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS|EXPORT_FONTDECLS|EXPORT_EMBEDDED );
2919 SERVICE( XMLDrawStylesExportOOO, "com.sun.star.comp.Draw.XMLStylesExporter", "XMLDrawStylesExportOOO", sal_True, EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES );
2920 SERVICE( XMLDrawContentExportOOO, "com.sun.star.comp.Draw.XMLContentExporter", "XMLDrawContentExportOOO", sal_True, EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS );
2921 SERVICE( XMLDrawMetaExportOOO, "com.sun.star.comp.Draw.XMLMetaExporter", "XMLDrawMetaExportOOO", sal_True, EXPORT_META );
2922 SERVICE( XMLDrawSettingsExportOOO, "com.sun.star.comp.Draw.XMLSettingsExporter", "XMLDrawSettingsExportOOO", sal_True, EXPORT_SETTINGS );
2923 
2924 SERVICE( XMLDrawingLayerExport, "com.sun.star.comp.DrawingLayer.XMLExporter", "XMLDrawingLayerExport", sal_True, EXPORT_OASIS|EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_FONTDECLS|EXPORT_EMBEDDED );
2925 SERVICE( XMLImpressClipboardExport, "com.sun.star.comp.Impress.XMLClipboardExporter", "XMLImpressClipboardExport", sal_False, EXPORT_OASIS|EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_FONTDECLS|EXPORT_EMBEDDED );
2926 
2927 // XServiceInfo
2928 OUString SAL_CALL SdXMLExport::getImplementationName() throw( uno::RuntimeException )
2929 {
2930     if( IsDraw())
2931     {
2932         // Draw
2933 
2934         switch( getExportFlags())
2935         {
2936             case EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS|EXPORT_FONTDECLS|EXPORT_EMBEDDED:
2937                 return XMLDrawExportOOO_getImplementationName();
2938             case EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES:
2939                 return XMLDrawStylesExportOOO_getImplementationName();
2940             case EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS:
2941                 return XMLDrawContentExportOOO_getImplementationName();
2942             case EXPORT_META:
2943                 return XMLDrawMetaExportOOO_getImplementationName();
2944             case EXPORT_SETTINGS:
2945                 return XMLDrawSettingsExportOOO_getImplementationName();
2946 
2947             case EXPORT_OASIS|EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS|EXPORT_FONTDECLS|EXPORT_EMBEDDED:
2948                 return XMLDrawExportOasis_getImplementationName();
2949             case EXPORT_OASIS|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES:
2950                 return XMLDrawStylesExportOasis_getImplementationName();
2951             case EXPORT_OASIS|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS:
2952                 return XMLDrawContentExportOasis_getImplementationName();
2953             case EXPORT_OASIS|EXPORT_META:
2954                 return XMLDrawMetaExportOasis_getImplementationName();
2955             case EXPORT_OASIS|EXPORT_SETTINGS:
2956                 return XMLDrawSettingsExportOasis_getImplementationName();
2957 
2958             default:
2959                 return XMLDrawExportOOO_getImplementationName();
2960         }
2961     }
2962     else
2963     {
2964         // Impress
2965 
2966         switch( getExportFlags())
2967         {
2968             case EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS|EXPORT_FONTDECLS|EXPORT_EMBEDDED:
2969                 return XMLImpressExportOOO_getImplementationName();
2970             case EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES:
2971                 return XMLImpressStylesExportOOO_getImplementationName();
2972             case EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS:
2973                 return XMLImpressContentExportOOO_getImplementationName();
2974             case EXPORT_META:
2975                 return XMLImpressMetaExportOOO_getImplementationName();
2976             case EXPORT_SETTINGS:
2977                 return XMLImpressSettingsExportOOO_getImplementationName();
2978             case EXPORT_OASIS|EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS|EXPORT_FONTDECLS|EXPORT_EMBEDDED:
2979                 return XMLImpressExportOasis_getImplementationName();
2980             case EXPORT_OASIS|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES:
2981                 return XMLImpressStylesExportOasis_getImplementationName();
2982             case EXPORT_OASIS|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS:
2983                 return XMLImpressContentExportOasis_getImplementationName();
2984             case EXPORT_OASIS|EXPORT_META:
2985                 return XMLImpressMetaExportOasis_getImplementationName();
2986             case EXPORT_OASIS|EXPORT_SETTINGS:
2987                 return XMLImpressSettingsExportOasis_getImplementationName();
2988 
2989             default:
2990                 return XMLImpressExportOOO_getImplementationName();
2991         }
2992     }
2993 }
2994