xref: /trunk/main/xmloff/source/draw/ximpstyl.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 
31 
32 #include "ximpstyl.hxx"
33 #include <xmloff/XMLShapeStyleContext.hxx>
34 #include "xmloff/xmlnmspe.hxx"
35 #include <xmloff/xmltoken.hxx>
36 #include <xmloff/xmluconv.hxx>
37 #include "ximpnote.hxx"
38 #include <tools/debug.hxx>
39 
40 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
41 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
42 #include <com/sun/star/presentation/XPresentationPage.hpp>
43 #include <com/sun/star/drawing/XDrawPages.hpp>
44 #include <com/sun/star/container/XNamed.hpp>
45 #include <com/sun/star/beans/XPropertySet.hpp>
46 #include <com/sun/star/beans/XPropertyState.hpp>
47 #include <com/sun/star/presentation/XHandoutMasterSupplier.hpp>
48 #include <comphelper/namecontainer.hxx>
49 #include <xmloff/xmlprcon.hxx>
50 #include <xmloff/families.hxx>
51 #include <com/sun/star/container/XNameContainer.hpp>
52 #include <svl/zforlist.hxx>
53 #include "PropertySetMerger.hxx"
54 #include "sdpropls.hxx"
55 #include "layerimp.hxx"
56 #include <xmloff/XMLGraphicsDefaultStyle.hxx>
57 #include "XMLNumberStylesImport.hxx"
58 #include "xmloff/xmlerror.hxx"
59 
60 using ::rtl::OUString;
61 using ::rtl::OUStringBuffer;
62 
63 using namespace ::com::sun::star;
64 using namespace ::com::sun::star::uno;
65 using namespace ::com::sun::star::xml::sax;
66 using namespace ::xmloff::token;
67 
68 //////////////////////////////////////////////////////////////////////////////
69 
70 class SdXMLDrawingPagePropertySetContext : public SvXMLPropertySetContext
71 {
72 public:
73 
74     TYPEINFO();
75 
76     SdXMLDrawingPagePropertySetContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
77                 const ::rtl::OUString& rLName,
78                  const ::com::sun::star::uno::Reference<
79                         ::com::sun::star::xml::sax::XAttributeList >& xAttrList,
80                  ::std::vector< XMLPropertyState > &rProps,
81                  const UniReference < SvXMLImportPropertyMapper > &rMap );
82 
83     virtual ~SdXMLDrawingPagePropertySetContext();
84 
85     using SvXMLPropertySetContext::CreateChildContext;
86     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
87                                    const ::rtl::OUString& rLocalName,
88                                    const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList,
89                                    ::std::vector< XMLPropertyState > &rProperties,
90                                    const XMLPropertyState& rProp);
91 };
92 
93 TYPEINIT1( SdXMLDrawingPagePropertySetContext, SvXMLPropertySetContext );
94 
95 SdXMLDrawingPagePropertySetContext::SdXMLDrawingPagePropertySetContext(
96                  SvXMLImport& rImport, sal_uInt16 nPrfx,
97                  const OUString& rLName,
98                  const uno::Reference< xml::sax::XAttributeList > & xAttrList,
99                  ::std::vector< XMLPropertyState > &rProps,
100                  const UniReference < SvXMLImportPropertyMapper > &rMap ) :
101     SvXMLPropertySetContext( rImport, nPrfx, rLName, xAttrList,
102                              XML_TYPE_PROP_DRAWING_PAGE, rProps, rMap )
103 {
104 }
105 
106 SdXMLDrawingPagePropertySetContext::~SdXMLDrawingPagePropertySetContext()
107 {
108 }
109 
110 SvXMLImportContext *SdXMLDrawingPagePropertySetContext::CreateChildContext(
111                    sal_uInt16 p_nPrefix,
112                    const OUString& rLocalName,
113                    const uno::Reference< xml::sax::XAttributeList > & xAttrList,
114                    ::std::vector< XMLPropertyState > &rProperties,
115                    const XMLPropertyState& rProp )
116 {
117     SvXMLImportContext *pContext = 0;
118 
119     switch( mxMapper->getPropertySetMapper()->GetEntryContextId( rProp.mnIndex ) )
120     {
121     case CTF_PAGE_SOUND_URL:
122     {
123         const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
124         for(sal_Int16 i=0; i < nAttrCount; i++)
125         {
126             OUString aLocalName;
127             sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(xAttrList->getNameByIndex(i), &aLocalName);
128 
129             if( (nPrefix == XML_NAMESPACE_XLINK) && IsXMLToken( aLocalName, XML_HREF ) )
130             {
131                 uno::Any aAny( GetImport().GetAbsoluteReference( xAttrList->getValueByIndex(i) ) );
132                 XMLPropertyState aPropState( rProp.mnIndex, aAny );
133                 rProperties.push_back( aPropState );
134             }
135         }
136         break;
137     }
138     }
139 
140     if( !pContext )
141         pContext = SvXMLPropertySetContext::CreateChildContext( p_nPrefix, rLocalName,
142                                                             xAttrList,
143                                                             rProperties, rProp );
144 
145     return pContext;
146 }
147 
148 //////////////////////////////////////////////////////////////////////////////
149 
150 class SdXMLDrawingPageStyleContext : public XMLPropStyleContext
151 {
152 public:
153     TYPEINFO();
154 
155     SdXMLDrawingPageStyleContext(
156         SvXMLImport& rImport,
157         sal_uInt16 nPrfx,
158         const rtl::OUString& rLName,
159         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList,
160         SvXMLStylesContext& rStyles,
161         sal_uInt16 nFamily = XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID);
162     virtual ~SdXMLDrawingPageStyleContext();
163 
164     SvXMLImportContext * CreateChildContext(
165         sal_uInt16 nPrefix,
166         const ::rtl::OUString& rLocalName,
167         const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > & xAttrList );
168 
169     virtual void Finish( sal_Bool bOverwrite );
170 
171     // #i35918#
172     virtual void FillPropertySet(
173             const ::com::sun::star::uno::Reference<
174                 ::com::sun::star::beans::XPropertySet > & rPropSet );
175 };
176 
177 TYPEINIT1( SdXMLDrawingPageStyleContext, XMLPropStyleContext );
178 
179 SdXMLDrawingPageStyleContext::SdXMLDrawingPageStyleContext(
180     SvXMLImport& rImport,
181     sal_uInt16 nPrfx,
182     const OUString& rLName,
183     const uno::Reference< xml::sax::XAttributeList >& xAttrList,
184     SvXMLStylesContext& rStyles,
185     sal_uInt16 nFamily)
186 :   XMLPropStyleContext(rImport, nPrfx, rLName, xAttrList, rStyles, nFamily )
187 {
188 }
189 
190 SdXMLDrawingPageStyleContext::~SdXMLDrawingPageStyleContext()
191 {
192 }
193 
194 SvXMLImportContext *SdXMLDrawingPageStyleContext::CreateChildContext(
195         sal_uInt16 nPrefix,
196         const OUString& rLocalName,
197         const uno::Reference< xml::sax::XAttributeList > & xAttrList )
198 {
199     SvXMLImportContext *pContext = 0;
200 
201     if( XML_NAMESPACE_STYLE == nPrefix &&
202         IsXMLToken( rLocalName, XML_DRAWING_PAGE_PROPERTIES ) )
203     {
204         UniReference < SvXMLImportPropertyMapper > xImpPrMap =
205             GetStyles()->GetImportPropertyMapper( GetFamily() );
206         if( xImpPrMap.is() )
207             pContext = new SdXMLDrawingPagePropertySetContext( GetImport(), nPrefix,
208                                                     rLocalName, xAttrList,
209                                                     GetProperties(),
210                                                     xImpPrMap );
211     }
212 
213     if( !pContext )
214         pContext = XMLPropStyleContext::CreateChildContext( nPrefix, rLocalName,
215                                                           xAttrList );
216 
217     return pContext;
218 }
219 
220 void SdXMLDrawingPageStyleContext::Finish( sal_Bool bOverwrite )
221 {
222     XMLPropStyleContext::Finish( bOverwrite );
223 
224     ::std::vector< XMLPropertyState > &rProperties = GetProperties();
225 
226     const UniReference< XMLPropertySetMapper >& rImpPrMap = GetStyles()->GetImportPropertyMapper( GetFamily() )->getPropertySetMapper();
227 
228     ::std::vector< XMLPropertyState >::iterator property = rProperties.begin();
229     for(; property != rProperties.end(); property++)
230     {
231         if( property->mnIndex == -1 )
232             continue;
233 
234         sal_Int16 nContextID = rImpPrMap->GetEntryContextId(property->mnIndex);
235         switch( nContextID )
236         {
237             case CTF_DATE_TIME_FORMAT:
238             {
239                 OUString sStyleName;
240                 (*property).maValue >>= sStyleName;
241 
242                 sal_Int32 nStyle = 0;
243 
244                 SdXMLNumberFormatImportContext* pSdNumStyle =
245                     PTR_CAST( SdXMLNumberFormatImportContext,
246                         GetStyles()->FindStyleChildContext( XML_STYLE_FAMILY_DATA_STYLE, sStyleName, sal_True ) );
247 
248                 if( pSdNumStyle )
249                     nStyle = pSdNumStyle->GetDrawKey();
250 
251                 (*property).maValue <<= nStyle;
252             }
253             break;
254         }
255     }
256 
257 }
258 
259 // #i35918#
260 void SdXMLDrawingPageStyleContext::FillPropertySet(
261     const Reference< beans::XPropertySet > & rPropSet )
262 {
263     const sal_uInt16 MAX_SPECIAL_DRAW_STYLES = 7;
264     struct _ContextID_Index_Pair aContextIDs[MAX_SPECIAL_DRAW_STYLES+1] =
265     {
266         { CTF_DASHNAME , -1 },
267         { CTF_LINESTARTNAME , -1 },
268         { CTF_LINEENDNAME , -1 },
269         { CTF_FILLGRADIENTNAME, -1 },
270         { CTF_FILLTRANSNAME , -1 },
271         { CTF_FILLHATCHNAME , -1 },
272         { CTF_FILLBITMAPNAME , -1 },
273         { -1, -1 }
274     };
275     static sal_uInt16 aFamilies[MAX_SPECIAL_DRAW_STYLES] =
276     {
277         XML_STYLE_FAMILY_SD_STROKE_DASH_ID,
278         XML_STYLE_FAMILY_SD_MARKER_ID,
279         XML_STYLE_FAMILY_SD_MARKER_ID,
280         XML_STYLE_FAMILY_SD_GRADIENT_ID,
281         XML_STYLE_FAMILY_SD_GRADIENT_ID,
282         XML_STYLE_FAMILY_SD_HATCH_ID,
283         XML_STYLE_FAMILY_SD_FILL_IMAGE_ID
284     };
285 
286     UniReference < SvXMLImportPropertyMapper > xImpPrMap =
287         GetStyles()->GetImportPropertyMapper( GetFamily() );
288     DBG_ASSERT( xImpPrMap.is(), "There is the import prop mapper" );
289     if( xImpPrMap.is() )
290         xImpPrMap->FillPropertySet( GetProperties(), rPropSet, aContextIDs );
291 
292     Reference< beans::XPropertySetInfo > xInfo;
293     for( sal_uInt16 i=0; i<MAX_SPECIAL_DRAW_STYLES; i++ )
294     {
295         sal_Int32 nIndex = aContextIDs[i].nIndex;
296         if( nIndex != -1 )
297         {
298             struct XMLPropertyState& rState = GetProperties()[nIndex];
299             OUString sStyleName;
300             rState.maValue >>= sStyleName;
301             sStyleName = GetImport().GetStyleDisplayName( aFamilies[i],
302                                                           sStyleName );
303             // get property set mapper
304             UniReference<XMLPropertySetMapper> rPropMapper =
305                                         xImpPrMap->getPropertySetMapper();
306 
307             // set property
308             const OUString& rPropertyName =
309                     rPropMapper->GetEntryAPIName(rState.mnIndex);
310             if( !xInfo.is() )
311                 xInfo = rPropSet->getPropertySetInfo();
312             if ( xInfo->hasPropertyByName( rPropertyName ) )
313             {
314                 rPropSet->setPropertyValue( rPropertyName, Any( sStyleName ) );
315             }
316         }
317     }
318 }
319 
320 //////////////////////////////////////////////////////////////////////////////
321 
322 TYPEINIT1( SdXMLPageMasterStyleContext, SvXMLStyleContext );
323 
324 SdXMLPageMasterStyleContext::SdXMLPageMasterStyleContext(
325     SdXMLImport& rImport,
326     sal_uInt16 nPrfx,
327     const OUString& rLName,
328     const uno::Reference< xml::sax::XAttributeList>& xAttrList)
329 :   SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_SD_PAGEMASTERSTYLECONEXT_ID),
330     mnBorderBottom( 0L ),
331     mnBorderLeft( 0L ),
332     mnBorderRight( 0L ),
333     mnBorderTop( 0L ),
334     mnWidth( 0L ),
335     mnHeight( 0L ),
336     meOrientation(GetSdImport().IsDraw() ? view::PaperOrientation_PORTRAIT : view::PaperOrientation_LANDSCAPE)
337 {
338     // set family to something special at SvXMLStyleContext
339     // for differences in search-methods
340 
341     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
342     for(sal_Int16 i=0; i < nAttrCount; i++)
343     {
344         OUString sAttrName = xAttrList->getNameByIndex(i);
345         OUString aLocalName;
346         sal_uInt16 nPrefix = GetSdImport().GetNamespaceMap().GetKeyByAttrName(sAttrName, &aLocalName);
347         OUString sValue = xAttrList->getValueByIndex(i);
348         const SvXMLTokenMap& rAttrTokenMap = GetSdImport().GetPageMasterStyleAttrTokenMap();
349 
350         switch(rAttrTokenMap.Get(nPrefix, aLocalName))
351         {
352             case XML_TOK_PAGEMASTERSTYLE_MARGIN_TOP:
353             {
354                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnBorderTop, sValue);
355                 break;
356             }
357             case XML_TOK_PAGEMASTERSTYLE_MARGIN_BOTTOM:
358             {
359                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnBorderBottom, sValue);
360                 break;
361             }
362             case XML_TOK_PAGEMASTERSTYLE_MARGIN_LEFT:
363             {
364                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnBorderLeft, sValue);
365                 break;
366             }
367             case XML_TOK_PAGEMASTERSTYLE_MARGIN_RIGHT:
368             {
369                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnBorderRight, sValue);
370                 break;
371             }
372             case XML_TOK_PAGEMASTERSTYLE_PAGE_WIDTH:
373             {
374                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnWidth, sValue);
375                 break;
376             }
377             case XML_TOK_PAGEMASTERSTYLE_PAGE_HEIGHT:
378             {
379                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnHeight, sValue);
380                 break;
381             }
382             case XML_TOK_PAGEMASTERSTYLE_PAGE_ORIENTATION:
383             {
384                 if( IsXMLToken( sValue, XML_PORTRAIT ) )
385                     meOrientation = view::PaperOrientation_PORTRAIT;
386                 else
387                     meOrientation = view::PaperOrientation_LANDSCAPE;
388                 break;
389             }
390         }
391     }
392 }
393 
394 //////////////////////////////////////////////////////////////////////////////
395 
396 SdXMLPageMasterStyleContext::~SdXMLPageMasterStyleContext()
397 {
398 }
399 
400 //////////////////////////////////////////////////////////////////////////////
401 //////////////////////////////////////////////////////////////////////////////
402 
403 TYPEINIT1( SdXMLPageMasterContext, SvXMLStyleContext );
404 
405 SdXMLPageMasterContext::SdXMLPageMasterContext(
406     SdXMLImport& rImport,
407     sal_uInt16 nPrfx,
408     const OUString& rLName,
409     const uno::Reference< xml::sax::XAttributeList>& xAttrList)
410 :   SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_SD_PAGEMASTERCONEXT_ID),
411     mpPageMasterStyle( 0L )
412 {
413     // set family to something special at SvXMLStyleContext
414     // for differences in search-methods
415 
416     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
417     for(sal_Int16 i=0; i < nAttrCount; i++)
418     {
419         OUString sAttrName = xAttrList->getNameByIndex(i);
420         OUString aLocalName;
421         sal_uInt16 nPrefix = GetSdImport().GetNamespaceMap().GetKeyByAttrName(sAttrName, &aLocalName);
422         OUString sValue = xAttrList->getValueByIndex(i);
423         const SvXMLTokenMap& rAttrTokenMap = GetSdImport().GetPageMasterAttrTokenMap();
424 
425         switch(rAttrTokenMap.Get(nPrefix, aLocalName))
426         {
427             case XML_TOK_PAGEMASTER_NAME:
428             {
429                 msName = sValue;
430                 break;
431             }
432         }
433     }
434 }
435 
436 //////////////////////////////////////////////////////////////////////////////
437 
438 SdXMLPageMasterContext::~SdXMLPageMasterContext()
439 {
440     // release remembered contexts, they are no longer needed
441     if(mpPageMasterStyle)
442     {
443         mpPageMasterStyle->ReleaseRef();
444         mpPageMasterStyle = 0L;
445     }
446 }
447 
448 //////////////////////////////////////////////////////////////////////////////
449 
450 SvXMLImportContext *SdXMLPageMasterContext::CreateChildContext(
451     sal_uInt16 nPrefix,
452     const OUString& rLocalName,
453     const uno::Reference< xml::sax::XAttributeList >& xAttrList )
454 {
455     SvXMLImportContext* pContext = 0;
456 
457     if(nPrefix == XML_NAMESPACE_STYLE && IsXMLToken( rLocalName, XML_PAGE_LAYOUT_PROPERTIES) )
458     {
459         pContext = new SdXMLPageMasterStyleContext(GetSdImport(), nPrefix, rLocalName, xAttrList);
460 
461         // remember SdXMLPresentationPlaceholderContext for later evaluation
462         if(pContext)
463         {
464             pContext->AddRef();
465             DBG_ASSERT(!mpPageMasterStyle, "PageMasterStyle is set, there seem to be two of them (!)");
466             mpPageMasterStyle = (SdXMLPageMasterStyleContext*)pContext;
467         }
468     }
469 
470     // call base class
471     if(!pContext)
472         pContext = SvXMLStyleContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
473 
474     return pContext;
475 }
476 
477 //////////////////////////////////////////////////////////////////////////////
478 //////////////////////////////////////////////////////////////////////////////
479 
480 TYPEINIT1( SdXMLPresentationPageLayoutContext, SvXMLStyleContext );
481 
482 SdXMLPresentationPageLayoutContext::SdXMLPresentationPageLayoutContext(
483     SdXMLImport& rImport,
484     sal_uInt16 nPrfx,
485     const OUString& rLName,
486     const uno::Reference< xml::sax::XAttributeList >& xAttrList)
487 :   SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_SD_PRESENTATIONPAGELAYOUT_ID),
488     mnTypeId( 20 ) // AUTOLAYOUT_NONE
489 {
490     // set family to somethiong special at SvXMLStyleContext
491     // for differences in search-methods
492 
493     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
494     for( sal_Int16 i=0; i < nAttrCount; i++ )
495     {
496         const OUString& rAttrName = xAttrList->getNameByIndex( i );
497         OUString aLocalName;
498         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
499 
500         if(nPrefix == XML_NAMESPACE_STYLE && IsXMLToken( aLocalName, XML_NAME ) )
501         {
502             msName = xAttrList->getValueByIndex( i );
503         }
504     }
505 }
506 
507 SdXMLPresentationPageLayoutContext::~SdXMLPresentationPageLayoutContext()
508 {
509 }
510 
511 SvXMLImportContext *SdXMLPresentationPageLayoutContext::CreateChildContext(
512     sal_uInt16 nPrefix,
513     const OUString& rLocalName,
514     const uno::Reference< xml::sax::XAttributeList >& xAttrList )
515 {
516     SvXMLImportContext* pContext = 0;
517 
518     if(nPrefix == XML_NAMESPACE_PRESENTATION && IsXMLToken( rLocalName, XML_PLACEHOLDER ) )
519     {
520         // presentation:placeholder inside style:presentation-page-layout context
521         pContext = new SdXMLPresentationPlaceholderContext(
522             GetSdImport(), nPrefix, rLocalName, xAttrList);
523 
524         // remember SdXMLPresentationPlaceholderContext for later evaluation
525         if(pContext)
526         {
527             pContext->AddRef();
528             maList.Insert((SdXMLPresentationPlaceholderContext*)pContext, LIST_APPEND);
529         }
530     }
531 
532     // call base class
533     if(!pContext)
534         pContext = SvXMLStyleContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
535 
536     return pContext;
537 }
538 
539 void SdXMLPresentationPageLayoutContext::EndElement()
540 {
541     // build presentation page layout type here
542     // calc mnTpeId due to content of maList
543     // at the moment only use number of types used there
544     if(maList.Count())
545     {
546         SdXMLPresentationPlaceholderContext* pObj0 = maList.GetObject(0);
547         if(pObj0->GetName().equals(OUString(RTL_CONSTASCII_USTRINGPARAM("handout"))))
548         {
549             switch( maList.Count() )
550             {
551             case 1:
552                 mnTypeId = 22; // AUTOLAYOUT_HANDOUT1
553                 break;
554             case 2:
555                 mnTypeId = 23; // AUTOLAYOUT_HANDOUT2
556                 break;
557             case 3:
558                 mnTypeId = 24; // AUTOLAYOUT_HANDOUT3
559                 break;
560             case 4:
561                 mnTypeId = 25; // AUTOLAYOUT_HANDOUT4
562                 break;
563             case 9:
564                 mnTypeId = 31; // AUTOLAYOUT_HANDOUT9
565                 break;
566             default:
567                 mnTypeId = 26; // AUTOLAYOUT_HANDOUT6
568             }
569         }
570         else
571         {
572             switch(maList.Count())
573             {
574                 case 1:
575                 {
576                     if(pObj0->GetName().equals(OUString(RTL_CONSTASCII_USTRINGPARAM("title"))))
577                     {
578                         mnTypeId = 19; // AUTOLAYOUT_ONLY_TITLE
579                     }
580                     else
581                     {
582                         mnTypeId = 32; // AUTOLAYOUT_ONLY_TEXT
583                     }
584                     break;
585                 }
586                 case 2:
587                 {
588                     SdXMLPresentationPlaceholderContext* pObj1 = maList.GetObject(1);
589 
590                     if(pObj1->GetName().equals(
591                         OUString(RTL_CONSTASCII_USTRINGPARAM("subtitle"))))
592                     {
593                         mnTypeId = 0; // AUTOLAYOUT_TITLE
594                     }
595                     else if(pObj1->GetName().equals(
596                         OUString(RTL_CONSTASCII_USTRINGPARAM("outline"))))
597                     {
598                         mnTypeId = 1; // AUTOLAYOUT_ENUM
599                     }
600                     else if(pObj1->GetName().equals(
601                         OUString(RTL_CONSTASCII_USTRINGPARAM("chart"))))
602                     {
603                         mnTypeId = 2; // AUTOLAYOUT_CHART
604                     }
605                     else if(pObj1->GetName().equals(
606                         OUString(RTL_CONSTASCII_USTRINGPARAM("table"))))
607                     {
608                         mnTypeId = 8; // AUTOLAYOUT_TAB
609                     }
610                     else if(pObj1->GetName().equals(
611                         OUString(RTL_CONSTASCII_USTRINGPARAM("object"))))
612                     {
613                         mnTypeId = 11; // AUTOLAYOUT_OBJ
614                     }
615                     else if(pObj1->GetName().equals(
616                         OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_outline"))))
617                     {
618                         if(pObj0->GetName().equals(OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_title"))))
619                         {
620                             // AUTOLAYOUT_VERTICAL_TITLE_VERTICAL_OUTLINE
621                             mnTypeId = 28;
622                         }
623                         else
624                         {
625                             // AUTOLAYOUT_TITLE_VERTICAL_OUTLINE
626                             mnTypeId = 29;
627                         }
628                     }
629                     else
630                     {
631                         mnTypeId = 21; // AUTOLAYOUT_NOTES
632                     }
633                     break;
634                 }
635                 case 3:
636                 {
637                     SdXMLPresentationPlaceholderContext* pObj1 = maList.GetObject(1);
638                     SdXMLPresentationPlaceholderContext* pObj2 = maList.GetObject(2);
639 
640                     if(pObj1->GetName().equals(
641                         OUString(RTL_CONSTASCII_USTRINGPARAM("outline"))))
642                     {
643                         if(pObj2->GetName().equals(
644                             OUString(RTL_CONSTASCII_USTRINGPARAM("outline"))))
645                         {
646                             mnTypeId = 3; // AUTOLAYOUT_2TEXT
647                         }
648                         else if(pObj2->GetName().equals(
649                             OUString(RTL_CONSTASCII_USTRINGPARAM("chart"))))
650                         {
651                             mnTypeId = 4; // AUTOLAYOUT_TEXTCHART
652                         }
653                         else if(pObj2->GetName().equals(
654                             OUString(RTL_CONSTASCII_USTRINGPARAM("graphic"))))
655                         {
656                             mnTypeId = 6; // AUTOLAYOUT_TEXTCLIP
657                         }
658                         else
659                         {
660                             if(pObj1->GetX() < pObj2->GetX())
661                             {
662                                 mnTypeId = 10; // AUTOLAYOUT_TEXTOBJ -> outline left, object right
663                             }
664                             else
665                             {
666                                 mnTypeId = 17; // AUTOLAYOUT_TEXTOVEROBJ -> outline top, object right
667                             }
668                         }
669                     }
670                     else if(pObj1->GetName().equals(
671                         OUString(RTL_CONSTASCII_USTRINGPARAM("chart"))))
672                     {
673                         mnTypeId = 7; // AUTOLAYOUT_CHARTTEXT
674                     }
675                     else if(pObj1->GetName().equals(
676                         OUString(RTL_CONSTASCII_USTRINGPARAM("graphic"))))
677                     {
678                         if(pObj2->GetName().equals(OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_outline"))))
679                         {
680                             // AUTOLAYOUT_TITLE_VERTICAL_OUTLINE_CLIPART
681                             mnTypeId = 30;
682                         }
683                         else
684                         {
685                             mnTypeId = 9; // AUTOLAYOUT_CLIPTEXT
686                         }
687                     }
688                     else if(pObj1->GetName().equals(
689                         OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_outline"))))
690                     {
691                         // AUTOLAYOUT_VERTICAL_TITLE_TEXT_CHART
692                         mnTypeId = 27;
693                     }
694                     else
695                     {
696                         if(pObj1->GetX() < pObj2->GetX())
697                         {
698                             mnTypeId = 13; // AUTOLAYOUT_OBJTEXT -> left, right
699                         }
700                         else
701                         {
702                             mnTypeId = 14; // AUTOLAYOUT_OBJOVERTEXT -> top, bottom
703                         }
704                     }
705                     break;
706                 }
707                 case 4:
708                 {
709                     SdXMLPresentationPlaceholderContext* pObj1 = maList.GetObject(1);
710                     SdXMLPresentationPlaceholderContext* pObj2 = maList.GetObject(2);
711 
712                     if(pObj1->GetName().equals(
713                         OUString(RTL_CONSTASCII_USTRINGPARAM("object"))))
714                     {
715                         if(pObj1->GetX() < pObj2->GetX())
716                         {
717                             mnTypeId = 16; // AUTOLAYOUT_2OBJOVERTEXT
718                         }
719                         else
720                         {
721                             mnTypeId = 15; // AUTOLAYOUT_2OBJTEXT
722                         }
723                     }
724                     else
725                     {
726                         mnTypeId = 12; // AUTOLAYOUT_TEXT2OBJ
727                     }
728                     break;
729                 }
730                 case 5:
731                 {
732                     SdXMLPresentationPlaceholderContext* pObj1 = maList.GetObject(1);
733 
734                     if(pObj1->GetName().equals(
735                         OUString(RTL_CONSTASCII_USTRINGPARAM("object"))))
736                     {
737                         mnTypeId = 18; // AUTOLAYOUT_4OBJ
738                     }
739                     else
740                     {
741                         mnTypeId = 33; // AUTOLAYOUT_4CLIPART
742                     }
743                     break;
744 
745                 }
746                 case 7:
747                 {
748                     mnTypeId = 33; // AUTOLAYOUT_6CLIPART
749                     break;
750                 }
751                 default:
752                 {
753                     mnTypeId = 20; // AUTOLAYOUT_NONE
754                     break;
755                 }
756             }
757         }
758 
759         // release remembered contexts, they are no longer needed
760         while(maList.Count())
761             maList.Remove(maList.Count() - 1)->ReleaseRef();
762     }
763 }
764 
765 //////////////////////////////////////////////////////////////////////////////
766 //////////////////////////////////////////////////////////////////////////////
767 
768 SdXMLPresentationPlaceholderContext::SdXMLPresentationPlaceholderContext(
769     SdXMLImport& rImport,
770     sal_uInt16 nPrfx, const
771     OUString& rLName,
772     const uno::Reference< xml::sax::XAttributeList>& xAttrList)
773 :   SvXMLImportContext( rImport, nPrfx, rLName),
774     mnX(0L),
775     mnY(0L),
776     mnWidth(1L),
777     mnHeight(1L)
778 {
779     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
780     for(sal_Int16 i=0; i < nAttrCount; i++)
781     {
782         OUString sAttrName = xAttrList->getNameByIndex(i);
783         OUString aLocalName;
784         sal_uInt16 nPrefix = GetSdImport().GetNamespaceMap().GetKeyByAttrName(sAttrName, &aLocalName);
785         OUString sValue = xAttrList->getValueByIndex(i);
786         const SvXMLTokenMap& rAttrTokenMap = GetSdImport().GetPresentationPlaceholderAttrTokenMap();
787 
788         switch(rAttrTokenMap.Get(nPrefix, aLocalName))
789         {
790             case XML_TOK_PRESENTATIONPLACEHOLDER_OBJECTNAME:
791             {
792                 msName = sValue;
793                 break;
794             }
795             case XML_TOK_PRESENTATIONPLACEHOLDER_X:
796             {
797                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnX, sValue);
798                 break;
799             }
800             case XML_TOK_PRESENTATIONPLACEHOLDER_Y:
801             {
802                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnY, sValue);
803                 break;
804             }
805             case XML_TOK_PRESENTATIONPLACEHOLDER_WIDTH:
806             {
807                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnWidth, sValue);
808                 break;
809             }
810             case XML_TOK_PRESENTATIONPLACEHOLDER_HEIGHT:
811             {
812                 GetSdImport().GetMM100UnitConverter().convertMeasure(mnHeight, sValue);
813                 break;
814             }
815         }
816     }
817 }
818 
819 //////////////////////////////////////////////////////////////////////////////
820 
821 SdXMLPresentationPlaceholderContext::~SdXMLPresentationPlaceholderContext()
822 {
823 }
824 
825 //////////////////////////////////////////////////////////////////////////////
826 //////////////////////////////////////////////////////////////////////////////
827 
828 TYPEINIT1( SdXMLMasterPageContext, SdXMLGenericPageContext );
829 
830 SdXMLMasterPageContext::SdXMLMasterPageContext(
831     SdXMLImport& rImport,
832     sal_uInt16 nPrfx,
833     const OUString& rLName,
834     const uno::Reference< xml::sax::XAttributeList>& xAttrList,
835     uno::Reference< drawing::XShapes >& rShapes)
836 :   SdXMLGenericPageContext( rImport, nPrfx, rLName, xAttrList, rShapes )
837 {
838     const sal_Bool bHandoutMaster = IsXMLToken( rLName, XML_HANDOUT_MASTER );
839 
840     const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
841     for(sal_Int16 i=0; i < nAttrCount; i++)
842     {
843         OUString sAttrName = xAttrList->getNameByIndex( i );
844         OUString aLocalName;
845         sal_uInt16 nPrefix = GetSdImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
846         OUString sValue = xAttrList->getValueByIndex( i );
847         const SvXMLTokenMap& rAttrTokenMap = GetSdImport().GetMasterPageAttrTokenMap();
848 
849         switch(rAttrTokenMap.Get(nPrefix, aLocalName))
850         {
851             case XML_TOK_MASTERPAGE_NAME:
852             {
853                 msName = sValue;
854                 break;
855             }
856             case XML_TOK_MASTERPAGE_DISPLAY_NAME:
857             {
858                 msDisplayName = sValue;
859                 break;
860             }
861             case XML_TOK_MASTERPAGE_PAGE_MASTER_NAME:
862             {
863                 msPageMasterName = sValue;
864                 break;
865             }
866             case XML_TOK_MASTERPAGE_STYLE_NAME:
867             {
868                 msStyleName = sValue;
869                 break;
870             }
871             case XML_TOK_MASTERPAGE_PAGE_LAYOUT_NAME:
872             {
873                 maPageLayoutName = sValue;
874                 break;
875             }
876             case XML_TOK_MASTERPAGE_USE_HEADER_NAME:
877             {
878                 maUseHeaderDeclName =  sValue;
879                 break;
880             }
881             case XML_TOK_MASTERPAGE_USE_FOOTER_NAME:
882             {
883                 maUseFooterDeclName =  sValue;
884                 break;
885             }
886             case XML_TOK_MASTERPAGE_USE_DATE_TIME_NAME:
887             {
888                 maUseDateTimeDeclName =  sValue;
889                 break;
890             }
891         }
892     }
893 
894     if( !msDisplayName.getLength() )
895         msDisplayName = msName;
896     else if( msDisplayName != msName )
897         GetImport().AddStyleDisplayName( XML_STYLE_FAMILY_MASTER_PAGE, msName, msDisplayName );
898 
899     GetImport().GetShapeImport()->startPage( GetLocalShapesContext() );
900 
901     // set page name?
902     if(!bHandoutMaster && msDisplayName.getLength() && GetLocalShapesContext().is())
903     {
904         uno::Reference < container::XNamed > xNamed(GetLocalShapesContext(), uno::UNO_QUERY);
905         if(xNamed.is())
906             xNamed->setName(msDisplayName);
907     }
908 
909     // set page-master?
910     if(msPageMasterName.getLength())
911     {
912         SetPageMaster( msPageMasterName );
913     }
914 
915     SetStyle( msStyleName );
916 
917     SetLayout();
918 
919     DeleteAllShapes();
920 }
921 
922 //////////////////////////////////////////////////////////////////////////////
923 
924 SdXMLMasterPageContext::~SdXMLMasterPageContext()
925 {
926 }
927 
928 //////////////////////////////////////////////////////////////////////////////
929 
930 void SdXMLMasterPageContext::EndElement()
931 {
932     // set styles on master-page
933     if(msName.getLength() && GetSdImport().GetShapeImport()->GetStylesContext())
934     {
935         SvXMLImportContext* pContext = GetSdImport().GetShapeImport()->GetStylesContext();
936         if( pContext && pContext->ISA( SvXMLStyleContext ) )
937             ((SdXMLStylesContext*)pContext)->SetMasterPageStyles(*this);
938     }
939 
940     SdXMLGenericPageContext::EndElement();
941     GetImport().GetShapeImport()->endPage(GetLocalShapesContext());
942 }
943 
944 //////////////////////////////////////////////////////////////////////////////
945 
946 SvXMLImportContext* SdXMLMasterPageContext::CreateChildContext(
947     sal_uInt16 nPrefix,
948     const OUString& rLocalName,
949     const uno::Reference< xml::sax::XAttributeList>& xAttrList )
950 {
951     SvXMLImportContext* pContext = 0;
952     const SvXMLTokenMap& rTokenMap = GetSdImport().GetMasterPageElemTokenMap();
953 
954     // some special objects inside style:masterpage context
955     switch(rTokenMap.Get(nPrefix, rLocalName))
956     {
957         case XML_TOK_MASTERPAGE_STYLE:
958         {
959             if(GetSdImport().GetShapeImport()->GetStylesContext())
960             {
961                 // style:style inside master-page context -> presentation style
962                 XMLShapeStyleContext* pNew = new XMLShapeStyleContext(
963                     GetSdImport(), nPrefix, rLocalName, xAttrList,
964                     *GetSdImport().GetShapeImport()->GetStylesContext(),
965                     XML_STYLE_FAMILY_SD_PRESENTATION_ID);
966 
967                 // add this style to the outer StylesContext class for later processing
968                 if(pNew)
969                 {
970                     pContext = pNew;
971                     GetSdImport().GetShapeImport()->GetStylesContext()->AddStyle(*pNew);
972                 }
973             }
974             break;
975         }
976         case XML_TOK_MASTERPAGE_NOTES:
977         {
978             if( GetSdImport().IsImpress() )
979             {
980                 // get notes page
981                 uno::Reference< presentation::XPresentationPage > xPresPage(GetLocalShapesContext(), uno::UNO_QUERY);
982                 if(xPresPage.is())
983                 {
984                     uno::Reference< drawing::XDrawPage > xNotesDrawPage(xPresPage->getNotesPage(), uno::UNO_QUERY);
985                     if(xNotesDrawPage.is())
986                     {
987                         uno::Reference< drawing::XShapes > xNewShapes(xNotesDrawPage, uno::UNO_QUERY);
988                         if(xNewShapes.is())
989                         {
990                             // presentation:notes inside master-page context
991                             pContext = new SdXMLNotesContext( GetSdImport(), nPrefix, rLocalName, xAttrList, xNewShapes);
992                         }
993                     }
994                 }
995             }
996         }
997     }
998 
999     // call base class
1000     if(!pContext)
1001         pContext = SdXMLGenericPageContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
1002 
1003     return pContext;
1004 }
1005 
1006 //////////////////////////////////////////////////////////////////////////////
1007 //////////////////////////////////////////////////////////////////////////////
1008 
1009 TYPEINIT1( SdXMLStylesContext, SvXMLStyleContext );
1010 
1011 SdXMLStylesContext::SdXMLStylesContext(
1012     SdXMLImport& rImport,
1013     sal_uInt16 nPrfx,
1014     const OUString& rLName,
1015     const uno::Reference< xml::sax::XAttributeList >& xAttrList,
1016     sal_Bool bIsAutoStyle)
1017 :   SvXMLStylesContext(rImport, nPrfx, rLName, xAttrList),
1018     mbIsAutoStyle(bIsAutoStyle)
1019 {
1020     // #110680#
1021     // Reference< lang::XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
1022     Reference< lang::XMultiServiceFactory > xMSF = rImport.getServiceFactory();
1023 
1024     mpNumFormatter = new SvNumberFormatter( xMSF, LANGUAGE_SYSTEM );
1025 
1026     // #110680#
1027     // mpNumFmtHelper = new SvXMLNumFmtHelper( mpNumFormatter );
1028     mpNumFmtHelper = new SvXMLNumFmtHelper( mpNumFormatter, xMSF );
1029 }
1030 
1031 //////////////////////////////////////////////////////////////////////////////
1032 
1033 SdXMLStylesContext::~SdXMLStylesContext()
1034 {
1035     delete mpNumFmtHelper;
1036     delete mpNumFormatter;
1037 }
1038 
1039 //////////////////////////////////////////////////////////////////////////////
1040 
1041 SvXMLStyleContext* SdXMLStylesContext::CreateStyleChildContext(
1042     sal_uInt16 nPrefix,
1043     const OUString& rLocalName,
1044     const uno::Reference< xml::sax::XAttributeList >& xAttrList)
1045 {
1046     SvXMLStyleContext* pContext = 0;
1047     const SvXMLTokenMap& rStyleTokenMap = GetSdImport().GetStylesElemTokenMap();
1048 
1049     switch(rStyleTokenMap.Get(nPrefix, rLocalName))
1050     {
1051         case XML_TOK_STYLES_PAGE_MASTER:
1052         {
1053             // style:page-master inside office:styles context
1054             pContext = new SdXMLPageMasterContext(GetSdImport(), nPrefix, rLocalName, xAttrList);
1055             break;
1056         }
1057         case XML_TOK_STYLES_PRESENTATION_PAGE_LAYOUT:
1058         {
1059             // style:presentation-page-layout inside office:styles context
1060             pContext = new SdXMLPresentationPageLayoutContext(GetSdImport(), nPrefix, rLocalName, xAttrList);
1061             break;
1062         }
1063     }
1064 
1065     if(!pContext)
1066     {
1067         const SvXMLTokenMap& rTokenMap = mpNumFmtHelper->GetStylesElemTokenMap();
1068         sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
1069         switch (nToken)
1070         {
1071             case XML_TOK_STYLES_DATE_STYLE:
1072             case XML_TOK_STYLES_TIME_STYLE:
1073                 // number:date-style or number:time-style
1074                 pContext = new SdXMLNumberFormatImportContext( GetSdImport(), nPrefix, rLocalName, mpNumFmtHelper->getData(), nToken, xAttrList, *this );
1075                 break;
1076 
1077             case XML_TOK_STYLES_NUMBER_STYLE:
1078             case XML_TOK_STYLES_CURRENCY_STYLE:
1079             case XML_TOK_STYLES_PERCENTAGE_STYLE:
1080             case XML_TOK_STYLES_BOOLEAN_STYLE:
1081             case XML_TOK_STYLES_TEXT_STYLE:
1082                 pContext = new SvXMLNumFormatContext( GetSdImport(), nPrefix, rLocalName,
1083                                                         mpNumFmtHelper->getData(), nToken, xAttrList, *this );
1084                 break;
1085         }
1086     }
1087 
1088     if(!pContext && nPrefix == XML_NAMESPACE_PRESENTATION )
1089     {
1090         if( IsXMLToken( rLocalName, XML_HEADER_DECL ) ||
1091             IsXMLToken( rLocalName, XML_FOOTER_DECL ) ||
1092             IsXMLToken( rLocalName, XML_DATE_TIME_DECL ) )
1093         {
1094             pContext = new SdXMLHeaderFooterDeclContext( GetImport(), nPrefix, rLocalName, xAttrList );
1095         }
1096     }
1097 
1098     if(!pContext && (nPrefix == XML_NAMESPACE_TABLE) && IsXMLToken( rLocalName, XML_TABLE_TEMPLATE ) )
1099     {
1100         pContext = GetImport().GetShapeImport()->GetShapeTableImport()->CreateTableTemplateContext(nPrefix, rLocalName, xAttrList );
1101     }
1102 
1103     // call base class
1104     if(!pContext)
1105         pContext = SvXMLStylesContext::CreateStyleChildContext(nPrefix, rLocalName, xAttrList);
1106 
1107     return pContext;
1108 }
1109 
1110 //////////////////////////////////////////////////////////////////////////////
1111 
1112 SvXMLStyleContext* SdXMLStylesContext::CreateStyleStyleChildContext(
1113     sal_uInt16 nFamily,
1114     sal_uInt16 nPrefix,
1115     const OUString& rLocalName,
1116     const uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList)
1117 {
1118     SvXMLStyleContext* pContext = 0;
1119 
1120     switch( nFamily )
1121     {
1122     case XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID:
1123         pContext = new SdXMLDrawingPageStyleContext(GetSdImport(), nPrefix, rLocalName, xAttrList, *this );
1124         break;
1125     case XML_STYLE_FAMILY_TABLE_CELL:
1126     case XML_STYLE_FAMILY_TABLE_COLUMN:
1127     case XML_STYLE_FAMILY_TABLE_ROW:
1128         pContext = new XMLShapeStyleContext( GetSdImport(), nPrefix, rLocalName, xAttrList, *this, nFamily );
1129         break;
1130     }
1131 
1132     // call base class
1133     if(!pContext)
1134         pContext = SvXMLStylesContext::CreateStyleStyleChildContext(nFamily, nPrefix, rLocalName, xAttrList);
1135 
1136     return pContext;
1137 }
1138 
1139 //////////////////////////////////////////////////////////////////////////////
1140 
1141 SvXMLStyleContext* SdXMLStylesContext::CreateDefaultStyleStyleChildContext(
1142     sal_uInt16 nFamily,
1143     sal_uInt16 nPrefix,
1144     const OUString& rLocalName,
1145     const Reference< XAttributeList > & xAttrList )
1146 {
1147     SvXMLStyleContext* pContext = 0;
1148 
1149     switch( nFamily )
1150     {
1151     case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
1152         pContext = new XMLGraphicsDefaultStyle(GetSdImport(), nPrefix, rLocalName, xAttrList, *this );
1153         break;
1154     }
1155 
1156     // call base class
1157     if(!pContext)
1158         pContext = SvXMLStylesContext::CreateDefaultStyleStyleChildContext(nFamily, nPrefix, rLocalName, xAttrList);
1159 
1160     return pContext;
1161 }
1162 
1163 //////////////////////////////////////////////////////////////////////////////
1164 
1165 sal_uInt16 SdXMLStylesContext::GetFamily( const OUString& rFamily ) const
1166 {
1167 //  if(rFamily.getLength())
1168 //  {
1169 //      if(rFamily.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME))))
1170 //          return XML_STYLE_FAMILY_SD_GRAPHICS_ID;
1171 //
1172 //      if(rFamily.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_NAME))))
1173 //          return XML_STYLE_FAMILY_SD_PRESENTATION_ID;
1174 //
1175 //      if(rFamily.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_POOL_NAME))))
1176 //          return XML_STYLE_FAMILY_SD_POOL_ID;
1177 //
1178 //      if(rFamily.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_DRAWINGPAGE_NAME))))
1179 //          return XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID;
1180 //  }
1181 
1182     // call base class
1183     return SvXMLStylesContext::GetFamily(rFamily);
1184 }
1185 
1186 //////////////////////////////////////////////////////////////////////////////
1187 
1188 UniReference< SvXMLImportPropertyMapper > SdXMLStylesContext::GetImportPropertyMapper(
1189     sal_uInt16 nFamily) const
1190 {
1191     UniReference < SvXMLImportPropertyMapper > xMapper;
1192 
1193 //  if(XML_STYLE_FAMILY_SD_GRAPHICS_ID == nFamily
1194 //      || XML_STYLE_FAMILY_SD_PRESENTATION_ID == nFamily
1195 //      || XML_STYLE_FAMILY_SD_POOL_ID == nFamily)
1196 //  {
1197 //      if(!xPropImpPropMapper.is())
1198 //      {
1199 //          UniReference< XMLShapeImportHelper > aImpHelper = ((SvXMLImport&)GetImport()).GetShapeImport();
1200 //          ((SdXMLStylesContext*)this)->xPropImpPropMapper =
1201 //              new SvXMLImportPropertyMapper(aImpHelper->GetPropertySetMapper());
1202 //      }
1203 //      xMapper = xPropImpPropMapper;
1204 //      return xMapper;
1205 //  }
1206 
1207     switch( nFamily )
1208     {
1209     case XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID:
1210     {
1211         if(!xPresImpPropMapper.is())
1212         {
1213             UniReference< XMLShapeImportHelper > aImpHelper = ((SvXMLImport&)GetImport()).GetShapeImport();
1214             ((SdXMLStylesContext*)this)->xPresImpPropMapper =
1215                 aImpHelper->GetPresPagePropsMapper();
1216         }
1217         xMapper = xPresImpPropMapper;
1218         break;
1219     }
1220 
1221     case XML_STYLE_FAMILY_TABLE_COLUMN:
1222     case XML_STYLE_FAMILY_TABLE_ROW:
1223     case XML_STYLE_FAMILY_TABLE_CELL:
1224     {
1225         const rtl::Reference< XMLTableImport >& xTableImport( const_cast< SvXMLImport& >( GetImport() ).GetShapeImport()->GetShapeTableImport() );
1226 
1227         switch( nFamily )
1228         {
1229         case XML_STYLE_FAMILY_TABLE_COLUMN: xMapper = xTableImport->GetColumnImportPropertySetMapper().get(); break;
1230         case XML_STYLE_FAMILY_TABLE_ROW: xMapper = xTableImport->GetRowImportPropertySetMapper().get(); break;
1231         case XML_STYLE_FAMILY_TABLE_CELL: xMapper = xTableImport->GetCellImportPropertySetMapper().get(); break;
1232         }
1233         break;
1234     }
1235     }
1236 
1237     // call base class
1238     if( !xMapper.is() )
1239         xMapper = SvXMLStylesContext::GetImportPropertyMapper(nFamily);
1240     return xMapper;
1241 }
1242 
1243 //////////////////////////////////////////////////////////////////////////////
1244 // Process all style and object info
1245 //
1246 void SdXMLStylesContext::EndElement()
1247 {
1248     if(mbIsAutoStyle)
1249     {
1250         // AutoStyles for text import
1251         GetImport().GetTextImport()->SetAutoStyles( this );
1252 
1253         // AutoStyles for chart
1254         GetImport().GetChartImport()->SetAutoStylesContext( this );
1255 
1256         // AutoStyles for forms
1257         GetImport().GetFormImport()->setAutoStyleContext( this );
1258 
1259         // associate AutoStyles with styles in preparation to setting Styles on shapes
1260         for(sal_uInt32 a(0L); a < GetStyleCount(); a++)
1261         {
1262             const SvXMLStyleContext* pStyle = GetStyle(a);
1263             if(pStyle && pStyle->ISA(XMLShapeStyleContext))
1264             {
1265                 XMLShapeStyleContext* pDocStyle = (XMLShapeStyleContext*)pStyle;
1266 //              pDocStyle->Filter();
1267 
1268                 SvXMLStylesContext* pStylesContext = GetSdImport().GetShapeImport()->GetStylesContext();
1269                 if( pStylesContext )
1270                 {
1271                     pStyle = pStylesContext->FindStyleChildContext(pStyle->GetFamily(), pStyle->GetParentName());
1272 
1273                     if(pStyle && pStyle->ISA(XMLShapeStyleContext))
1274                     {
1275                         XMLShapeStyleContext* pParentStyle = (XMLShapeStyleContext*)pStyle;
1276                         if(pParentStyle->GetStyle().is())
1277                         {
1278                             pDocStyle->SetStyle(pParentStyle->GetStyle());
1279                         }
1280                     }
1281                 }
1282             }
1283         }
1284 
1285         FinishStyles( false );
1286     }
1287     else
1288     {
1289         // Process styles list
1290         ImpSetGraphicStyles();
1291         ImpSetCellStyles();
1292         GetImport().GetShapeImport()->GetShapeTableImport()->finishStyles();
1293 
1294         // put style infos in the info set for other components ( content import f.e. )
1295         uno::Reference< beans::XPropertySet > xInfoSet( GetImport().getImportInfo() );
1296         if( xInfoSet.is() )
1297         {
1298             uno::Reference< beans::XPropertySetInfo > xInfoSetInfo( xInfoSet->getPropertySetInfo() );
1299 
1300             if( xInfoSetInfo->hasPropertyByName( OUString( RTL_CONSTASCII_USTRINGPARAM( "PageLayouts" ) ) ) )
1301                 xInfoSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PageLayouts" ) ), uno::makeAny( getPageLayouts() ) );
1302         }
1303 
1304     }
1305 }
1306 
1307 //////////////////////////////////////////////////////////////////////////////
1308 // set master-page styles (all with family="presentation" and a special
1309 // prefix) on given master-page.
1310 //
1311 void SdXMLStylesContext::SetMasterPageStyles(SdXMLMasterPageContext& rMaster) const
1312 {
1313     UniString sPrefix(rMaster.GetDisplayName(), (sal_uInt16)rMaster.GetDisplayName().getLength());
1314     sPrefix += sal_Unicode('-');
1315 
1316     if(GetSdImport().GetLocalDocStyleFamilies().is() && GetSdImport().GetLocalDocStyleFamilies()->hasByName(rMaster.GetDisplayName())) try
1317     {
1318         uno::Reference< container::XNameAccess > xMasterPageStyles( GetSdImport().GetLocalDocStyleFamilies()->getByName(rMaster.GetDisplayName()), UNO_QUERY_THROW );
1319         ImpSetGraphicStyles(xMasterPageStyles, XML_STYLE_FAMILY_SD_PRESENTATION_ID, sPrefix);
1320     }
1321     catch( uno::Exception& )
1322     {
1323         DBG_ERROR( "xmloff::SdXMLStylesContext::SetMasterPageStyles(), exception caught!" );
1324     }
1325 }
1326 
1327 //////////////////////////////////////////////////////////////////////////////
1328 // Process styles list:
1329 // set graphic styles (all with family="graphics"). Remember xStyle at list element.
1330 //
1331 void SdXMLStylesContext::ImpSetGraphicStyles() const
1332 {
1333     if(GetSdImport().GetLocalDocStyleFamilies().is()) try
1334     {
1335         const OUString sGraphicStyleName(OUString(RTL_CONSTASCII_USTRINGPARAM("graphics")));
1336         uno::Reference< container::XNameAccess > xGraphicPageStyles( GetSdImport().GetLocalDocStyleFamilies()->getByName(sGraphicStyleName), uno::UNO_QUERY_THROW );
1337 
1338         UniString aPrefix;
1339         ImpSetGraphicStyles(xGraphicPageStyles, XML_STYLE_FAMILY_SD_GRAPHICS_ID, aPrefix);
1340     }
1341     catch( uno::Exception& )
1342     {
1343         DBG_ERROR( "xmloff::SdXMLStylesContext::ImpSetGraphicStyles(), exception caught!" );
1344     }
1345 }
1346 
1347 void SdXMLStylesContext::ImpSetCellStyles() const
1348 {
1349     if(GetSdImport().GetLocalDocStyleFamilies().is()) try
1350     {
1351         const OUString sCellStyleName(OUString(RTL_CONSTASCII_USTRINGPARAM("cell")));
1352         uno::Reference< container::XNameAccess > xGraphicPageStyles( GetSdImport().GetLocalDocStyleFamilies()->getByName(sCellStyleName), uno::UNO_QUERY_THROW );
1353 
1354         UniString aPrefix;
1355         ImpSetGraphicStyles(xGraphicPageStyles, XML_STYLE_FAMILY_TABLE_CELL, aPrefix);
1356     }
1357     catch( uno::Exception& )
1358     {
1359         DBG_ERROR( "xmloff::SdXMLStylesContext::ImpSetCellStyles(), exception caught!" );
1360     }
1361 }
1362 
1363 //////////////////////////////////////////////////////////////////////////////
1364 // help function used by ImpSetGraphicStyles() and ImpSetMasterPageStyles()
1365 //
1366 void SdXMLStylesContext::ImpSetGraphicStyles( uno::Reference< container::XNameAccess >& xPageStyles,  sal_uInt16 nFamily,  const UniString& rPrefix) const
1367 {
1368     xub_StrLen nPrefLen(rPrefix.Len());
1369 
1370     sal_uInt32 a;
1371 
1372     // set defaults
1373     for( a = 0; a < GetStyleCount(); a++)
1374     {
1375         const SvXMLStyleContext* pStyle = GetStyle(a);
1376 
1377         if(nFamily == pStyle->GetFamily() && pStyle->IsDefaultStyle())
1378         {
1379             ((SvXMLStyleContext*)pStyle)->SetDefaults();
1380         }
1381     }
1382 
1383     // create all styles and set properties
1384     for( a = 0; a < GetStyleCount(); a++)
1385     {
1386         try
1387         {
1388             const SvXMLStyleContext* pStyle = GetStyle(a);
1389             if(nFamily == pStyle->GetFamily() && !pStyle->IsDefaultStyle())
1390             {
1391                 OUString aStyleName(pStyle->GetDisplayName());
1392                 if( nPrefLen )
1393                 {
1394                     sal_Int32 nStylePrefLen = aStyleName.lastIndexOf( sal_Unicode('-') ) + 1;
1395                     if( (nPrefLen != nStylePrefLen) ||  (aStyleName.compareTo( rPrefix, nPrefLen ) != 0) )
1396                         continue;
1397 
1398                     aStyleName = aStyleName.copy( nPrefLen );
1399                 }
1400 
1401                 uno::Reference< style::XStyle > xStyle;
1402                 if(xPageStyles->hasByName(aStyleName))
1403                 {
1404                     xPageStyles->getByName(aStyleName) >>= xStyle;
1405 
1406                     // set properties of existing styles to default
1407                     uno::Reference< beans::XPropertySet > xPropSet( xStyle, uno::UNO_QUERY );
1408                     uno::Reference< beans::XPropertySetInfo > xPropSetInfo;
1409                     if( xPropSet.is() )
1410                         xPropSetInfo = xPropSet->getPropertySetInfo();
1411 
1412                     uno::Reference< beans::XPropertyState > xPropState( xStyle, uno::UNO_QUERY );
1413 
1414                     if( xPropState.is() )
1415                     {
1416                         UniReference < XMLPropertySetMapper > xPrMap;
1417                         UniReference < SvXMLImportPropertyMapper > xImpPrMap = GetImportPropertyMapper( nFamily );
1418                         DBG_ASSERT( xImpPrMap.is(), "There is the import prop mapper" );
1419                         if( xImpPrMap.is() )
1420                             xPrMap = xImpPrMap->getPropertySetMapper();
1421                         if( xPrMap.is() )
1422                         {
1423                             const sal_Int32 nCount = xPrMap->GetEntryCount();
1424                             for( sal_Int32 i = 0; i < nCount; i++ )
1425                             {
1426                                 const OUString& rName = xPrMap->GetEntryAPIName( i );
1427                                 if( xPropSetInfo->hasPropertyByName( rName ) && beans::PropertyState_DIRECT_VALUE == xPropState->getPropertyState( rName ) )
1428                                 {
1429                                     xPropState->setPropertyToDefault( rName );
1430                                 }
1431                             }
1432                         }
1433                     }
1434                 }
1435                 else
1436                 {
1437                     // graphics style does not exist, create and add it
1438                     uno::Reference< lang::XSingleServiceFactory > xServiceFact(xPageStyles, uno::UNO_QUERY);
1439                     if(xServiceFact.is())
1440                     {
1441                         uno::Reference< style::XStyle > xNewStyle( xServiceFact->createInstance(), uno::UNO_QUERY);
1442 
1443                         if(xNewStyle.is())
1444                         {
1445                             // remember style
1446                             xStyle = xNewStyle;
1447 
1448                             // add new style to graphics style pool
1449                             uno::Reference< container::XNameContainer > xInsertContainer(xPageStyles, uno::UNO_QUERY);
1450                             if(xInsertContainer.is())
1451                                 xInsertContainer->insertByName(aStyleName, uno::Any( xStyle ) );
1452                         }
1453                     }
1454                 }
1455 
1456                 if(xStyle.is())
1457                 {
1458                     // set properties at style
1459                     XMLPropStyleContext* pPropStyle = dynamic_cast< XMLPropStyleContext* >( const_cast< SvXMLStyleContext* >( pStyle ) );
1460                     uno::Reference< beans::XPropertySet > xPropSet(xStyle, uno::UNO_QUERY);
1461 
1462                     if(xPropSet.is() && pPropStyle)
1463                     {
1464                         pPropStyle->FillPropertySet(xPropSet);
1465                         pPropStyle->SetStyle(xStyle);
1466                     }
1467                 }
1468             }
1469         }
1470         catch( Exception& e)
1471         {
1472             uno::Sequence<OUString> aSeq(0);
1473             const_cast<SdXMLImport*>(&GetSdImport())->SetError( XMLERROR_FLAG_WARNING | XMLERROR_API, aSeq, e.Message, NULL );
1474         }
1475     }
1476 
1477     // now set parents for all styles (when necessary)
1478     for(a = 0L; a < GetStyleCount(); a++)
1479     {
1480         const SvXMLStyleContext* pStyle = GetStyle(a);
1481 
1482         if(pStyle && pStyle->GetName().getLength() && (nFamily == pStyle->GetFamily())) try
1483         {
1484             OUString aStyleName(pStyle->GetDisplayName());
1485             if( nPrefLen )
1486             {
1487                 sal_Int32 nStylePrefLen = aStyleName.lastIndexOf( sal_Unicode('-') ) + 1;
1488                 if( (nPrefLen != nStylePrefLen) ||  (aStyleName.compareTo( rPrefix, nPrefLen ) != 0) )
1489                     continue;
1490 
1491                 aStyleName = aStyleName.copy( nPrefLen );
1492             }
1493 
1494             uno::Reference< style::XStyle > xStyle( xPageStyles->getByName(aStyleName), UNO_QUERY );
1495             if(xStyle.is())
1496             {
1497                 // set parent style name
1498                 ::rtl::OUString sParentStyleDisplayName( const_cast< SvXMLImport& >( GetImport() ).GetStyleDisplayName( pStyle->GetFamily(), pStyle->GetParentName() ) );
1499                 if( nPrefLen )
1500                 {
1501                     sal_Int32 nStylePrefLen = sParentStyleDisplayName.lastIndexOf( sal_Unicode('-') ) + 1;
1502                     if( (nPrefLen != nStylePrefLen) || (sParentStyleDisplayName.compareTo( rPrefix, nPrefLen ) != 0) )
1503                         continue;
1504 
1505                     sParentStyleDisplayName = sParentStyleDisplayName.copy( nPrefLen );
1506                 }
1507                 xStyle->setParentStyle( sParentStyleDisplayName );
1508             }
1509         }
1510         catch( Exception& e )
1511         {
1512             uno::Sequence<OUString> aSeq(0);
1513             const_cast<SdXMLImport*>(&GetSdImport())->SetError( XMLERROR_FLAG_WARNING | XMLERROR_API, aSeq, e.Message, NULL );
1514         }
1515     }
1516 }
1517 
1518 ////////////////////////////////////////////////////////////////////////////////
1519 // helper function to create the uno component that hold the mappings from
1520 // xml auto layout name to internal autolayout id
1521 
1522 uno::Reference< container::XNameAccess > SdXMLStylesContext::getPageLayouts() const
1523 {
1524     uno::Reference< container::XNameContainer > xLayouts( comphelper::NameContainer_createInstance( ::getCppuType((const sal_Int32*)0)) );
1525 
1526     for(sal_uInt32 a(0L); a < GetStyleCount(); a++)
1527     {
1528         const SvXMLStyleContext* pStyle = GetStyle(a);
1529         if(pStyle && pStyle->ISA(SdXMLPresentationPageLayoutContext))
1530         {
1531             xLayouts->insertByName( pStyle->GetName(), uno::makeAny(
1532             (sal_Int32)((SdXMLPresentationPageLayoutContext*)pStyle)->GetTypeId() ) );
1533         }
1534     }
1535 
1536     return uno::Reference< container::XNameAccess >::query( xLayouts );
1537 }
1538 
1539 ////////////////////////////////////////////////////////////////////////////////
1540 ////////////////////////////////////////////////////////////////////////////////
1541 //
1542 TYPEINIT1( SdXMLMasterStylesContext, SvXMLImportContext );
1543 
1544 SdXMLMasterStylesContext::SdXMLMasterStylesContext(
1545     SdXMLImport& rImport,
1546     sal_uInt16 nPrfx,
1547     const rtl::OUString& rLName)
1548 :   SvXMLImportContext( rImport, nPrfx, rLName)
1549 {
1550 }
1551 
1552 SdXMLMasterStylesContext::~SdXMLMasterStylesContext()
1553 {
1554     while(maMasterPageList.Count())
1555         maMasterPageList.Remove(maMasterPageList.Count() - 1)->ReleaseRef();
1556 }
1557 
1558 SvXMLImportContext* SdXMLMasterStylesContext::CreateChildContext(
1559     sal_uInt16 nPrefix,
1560     const rtl::OUString& rLocalName,
1561     const uno::Reference< xml::sax::XAttributeList >& xAttrList)
1562 {
1563     SvXMLImportContext* pContext = 0;
1564 
1565     if(nPrefix == XML_NAMESPACE_STYLE
1566        && IsXMLToken( rLocalName, XML_MASTER_PAGE ) )
1567     {
1568         // style:masterpage inside office:styles context
1569         uno::Reference< drawing::XDrawPage > xNewMasterPage;
1570         uno::Reference< drawing::XDrawPages > xMasterPages(GetSdImport().GetLocalMasterPages(), uno::UNO_QUERY);
1571 
1572         if( xMasterPages.is() )
1573         {
1574             if(GetSdImport().GetNewMasterPageCount() + 1 > xMasterPages->getCount())
1575             {
1576                 // new page, create and insert
1577                 xNewMasterPage = xMasterPages->insertNewByIndex(xMasterPages->getCount());
1578             }
1579             else
1580             {
1581                 // existing page, use it
1582                 xMasterPages->getByIndex(GetSdImport().GetNewMasterPageCount()) >>= xNewMasterPage;
1583             }
1584 
1585             // increment global import page counter
1586             GetSdImport().IncrementNewMasterPageCount();
1587 
1588             if(xNewMasterPage.is())
1589             {
1590                 uno::Reference< drawing::XShapes > xNewShapes(xNewMasterPage, uno::UNO_QUERY);
1591                 if(xNewShapes.is() && GetSdImport().GetShapeImport()->GetStylesContext())
1592                 {
1593                     pContext = new SdXMLMasterPageContext(GetSdImport(),
1594                         nPrefix, rLocalName, xAttrList, xNewShapes);
1595 
1596                     if(pContext)
1597                     {
1598                         pContext->AddRef();
1599                         maMasterPageList.Insert((SdXMLMasterPageContext*)pContext, LIST_APPEND);
1600                     }
1601                 }
1602             }
1603         }
1604     }
1605     else    if(nPrefix == XML_NAMESPACE_STYLE
1606         && IsXMLToken( rLocalName, XML_HANDOUT_MASTER ) )
1607     {
1608         uno::Reference< presentation::XHandoutMasterSupplier > xHandoutSupp( GetSdImport().GetModel(), uno::UNO_QUERY );
1609         if( xHandoutSupp.is() )
1610         {
1611             uno::Reference< drawing::XShapes > xHandoutPage( xHandoutSupp->getHandoutMasterPage(), uno::UNO_QUERY );
1612             if(xHandoutPage.is() && GetSdImport().GetShapeImport()->GetStylesContext())
1613             {
1614                 pContext = new SdXMLMasterPageContext(GetSdImport(),
1615                     nPrefix, rLocalName, xAttrList, xHandoutPage);
1616             }
1617         }
1618     }
1619     else if( (nPrefix == XML_NAMESPACE_DRAW )&& IsXMLToken( rLocalName, XML_LAYER_SET ) )
1620     {
1621         pContext = new SdXMLLayerSetContext( GetImport(), nPrefix, rLocalName, xAttrList );
1622     }
1623 
1624     // call base class
1625     if(!pContext)
1626         pContext = SvXMLImportContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
1627 
1628     return pContext;
1629 }
1630 
1631 ///////////////////////////////////////////////////////////////////////
1632 
1633 SdXMLHeaderFooterDeclContext::SdXMLHeaderFooterDeclContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
1634         const ::rtl::OUString& rLName,
1635         const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
1636 : SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList )
1637 {
1638     const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1639     for(sal_Int16 i=0; i < nAttrCount; i++)
1640     {
1641         OUString aLocalName;
1642         const OUString aValue( xAttrList->getValueByIndex(i) );
1643         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(xAttrList->getNameByIndex(i), &aLocalName);
1644 
1645         if( nPrefix == XML_NAMESPACE_PRESENTATION )
1646         {
1647             if( IsXMLToken( aLocalName, XML_NAME ) )
1648             {
1649                 maStrName = aValue;
1650             }
1651             else if( IsXMLToken( aLocalName, XML_SOURCE ) )
1652             {
1653                 mbFixed = IsXMLToken( aValue, XML_FIXED );
1654             }
1655         }
1656         else if( nPrefix == XML_NAMESPACE_STYLE )
1657         {
1658             if( IsXMLToken( aLocalName, XML_DATA_STYLE_NAME ) )
1659             {
1660                 maStrDateTimeFormat = aValue;
1661             }
1662         }
1663     }
1664 }
1665 
1666 sal_Bool SdXMLHeaderFooterDeclContext::IsTransient() const
1667 {
1668     return sal_True;
1669 }
1670 
1671 void SdXMLHeaderFooterDeclContext::EndElement()
1672 {
1673     SdXMLImport& rImport = *dynamic_cast< SdXMLImport* >( &GetImport() );
1674     if( IsXMLToken( GetLocalName(), XML_HEADER_DECL ) )
1675     {
1676         rImport.AddHeaderDecl( maStrName, maStrText );
1677     }
1678     else if( IsXMLToken( GetLocalName(), XML_FOOTER_DECL ) )
1679     {
1680         rImport.AddFooterDecl( maStrName, maStrText );
1681     }
1682     else if( IsXMLToken( GetLocalName(), XML_DATE_TIME_DECL ) )
1683     {
1684         rImport.AddDateTimeDecl( maStrName, maStrText, mbFixed, maStrDateTimeFormat );
1685     }
1686 }
1687 
1688 void SdXMLHeaderFooterDeclContext::Characters( const ::rtl::OUString& rChars )
1689 {
1690     maStrText += rChars;
1691 }
1692 
1693