LCOV - code coverage report
Current view: top level - xmloff/source/style - xmlstyle.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 378 392 96.4 %
Date: 2014-04-11 Functions: 53 62 85.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <com/sun/star/xml/sax/SAXParseException.hpp>
      21             : #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
      22             : #include <com/sun/star/xml/sax/SAXException.hpp>
      23             : #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
      24             : #include <com/sun/star/xml/sax/XAttributeList.hpp>
      25             : #include <com/sun/star/xml/sax/XLocator.hpp>
      26             : #include <com/sun/star/container/XNameContainer.hpp>
      27             : #include <com/sun/star/beans/XPropertySet.hpp>
      28             : #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
      29             : #include <com/sun/star/style/XAutoStylesSupplier.hpp>
      30             : #include <com/sun/star/style/XAutoStyleFamily.hpp>
      31             : #include "PageMasterPropMapper.hxx"
      32             : #include <tools/debug.hxx>
      33             : #include <svl/itemset.hxx>
      34             : #include <xmloff/nmspmap.hxx>
      35             : #include <xmloff/xmlnmspe.hxx>
      36             : #include <xmloff/xmltoken.hxx>
      37             : 
      38             : #include <xmloff/families.hxx>
      39             : #include <xmloff/xmlimp.hxx>
      40             : #include <xmloff/xmlnumi.hxx>
      41             : #include <xmloff/xmlimppr.hxx>
      42             : #include <xmloff/xmlstyle.hxx>
      43             : #include <xmloff/txtstyli.hxx>
      44             : #include <xmloff/txtprmap.hxx>
      45             : #include <xmloff/xmlnumfi.hxx>
      46             : #include "XMLChartStyleContext.hxx"
      47             : #include "XMLChartPropertySetMapper.hxx"
      48             : #include <xmloff/XMLShapeStyleContext.hxx>
      49             : #include "FillStyleContext.hxx"
      50             : #include "XMLFootnoteConfigurationImportContext.hxx"
      51             : #include "XMLIndexBibliographyConfigurationContext.hxx"
      52             : #include "XMLLineNumberingImportContext.hxx"
      53             : #include "PageMasterImportContext.hxx"
      54             : #include "PageMasterImportPropMapper.hxx"
      55             : 
      56             : #include <set>
      57             : #include <vector>
      58             : 
      59             : using namespace ::com::sun::star;
      60             : using namespace ::com::sun::star::uno;
      61             : using namespace ::com::sun::star::container;
      62             : using namespace ::com::sun::star::style;
      63             : using namespace ::xmloff::token;
      64             : 
      65             : static SvXMLTokenMapEntry aStyleStylesElemTokenMap[] =
      66             : {
      67             :     { XML_NAMESPACE_STYLE,  XML_STYLE,          XML_TOK_STYLE_STYLE                },
      68             :     { XML_NAMESPACE_STYLE,  XML_PAGE_LAYOUT,    XML_TOK_STYLE_PAGE_MASTER          },
      69             :     { XML_NAMESPACE_TEXT,   XML_LIST_STYLE,     XML_TOK_TEXT_LIST_STYLE            },
      70             :     { XML_NAMESPACE_TEXT,   XML_OUTLINE_STYLE,  XML_TOK_TEXT_OUTLINE               },
      71             :     { XML_NAMESPACE_STYLE,  XML_DEFAULT_STYLE,  XML_TOK_STYLE_DEFAULT_STYLE        },
      72             :     { XML_NAMESPACE_DRAW,   XML_GRADIENT,       XML_TOK_STYLES_GRADIENTSTYLES      },
      73             :     { XML_NAMESPACE_DRAW,   XML_HATCH,          XML_TOK_STYLES_HATCHSTYLES         },
      74             :     { XML_NAMESPACE_DRAW,   XML_FILL_IMAGE,     XML_TOK_STYLES_BITMAPSTYLES        },
      75             :     { XML_NAMESPACE_DRAW,   XML_OPACITY,        XML_TOK_STYLES_TRANSGRADIENTSTYLES },
      76             :     { XML_NAMESPACE_DRAW,   XML_MARKER,         XML_TOK_STYLES_MARKERSTYLES        },
      77             :     { XML_NAMESPACE_DRAW,   XML_STROKE_DASH,    XML_TOK_STYLES_DASHSTYLES        },
      78             :     { XML_NAMESPACE_TEXT,   XML_NOTES_CONFIGURATION,    XML_TOK_TEXT_NOTE_CONFIG },
      79             :     { XML_NAMESPACE_TEXT,   XML_BIBLIOGRAPHY_CONFIGURATION, XML_TOK_TEXT_BIBLIOGRAPHY_CONFIG },
      80             :     { XML_NAMESPACE_TEXT,   XML_LINENUMBERING_CONFIGURATION,XML_TOK_TEXT_LINENUMBERING_CONFIG },
      81             :     { XML_NAMESPACE_STYLE,  XML_DEFAULT_PAGE_LAYOUT,    XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT        },
      82             :     XML_TOKEN_MAP_END
      83             : };
      84             : 
      85        8623 : const SvXMLTokenMap& SvXMLStylesContext::GetStyleStylesElemTokenMap()
      86             : {
      87        8623 :     if( !mpStyleStylesElemTokenMap )
      88             :         mpStyleStylesElemTokenMap =
      89         885 :             new SvXMLTokenMap( aStyleStylesElemTokenMap );
      90             : 
      91        8623 :     return *mpStyleStylesElemTokenMap;
      92             : }
      93             : 
      94       19388 : void SvXMLStyleContext::SetAttribute( sal_uInt16 nPrefixKey,
      95             :                                       const OUString& rLocalName,
      96             :                                       const OUString& rValue )
      97             : {
      98             :     // TODO: use a map here
      99       19388 :     if( XML_NAMESPACE_STYLE == nPrefixKey )
     100             :     {
     101       17720 :         if( IsXMLToken( rLocalName, XML_FAMILY ) )
     102             :         {
     103         500 :             if( IsXMLToken( rValue, XML_PARAGRAPH ) )
     104           0 :                 mnFamily = (sal_uInt16)SFX_STYLE_FAMILY_PARA;
     105         500 :             else if( IsXMLToken( rValue, XML_TEXT ) )
     106           0 :                 mnFamily = (sal_uInt16)SFX_STYLE_FAMILY_CHAR;
     107             :         }
     108       17220 :         else if( IsXMLToken( rLocalName, XML_NAME ) )
     109             :         {
     110       12205 :             maName = rValue;
     111             :         }
     112        5015 :         else if( IsXMLToken( rLocalName, XML_DISPLAY_NAME ) )
     113             :         {
     114         835 :             maDisplayName = rValue;
     115             :         }
     116        4180 :         else if( IsXMLToken( rLocalName, XML_PARENT_STYLE_NAME ) )
     117             :         {
     118        3156 :             maParentName = rValue;
     119             :         }
     120        1024 :         else if( IsXMLToken( rLocalName, XML_NEXT_STYLE_NAME ) )
     121             :         {
     122         187 :             maFollow = rValue;
     123             :         }
     124         837 :         else if( IsXMLToken( rLocalName, XML_HELP_FILE_NAME ) )
     125             :         {
     126           0 :             maHelpFile = rValue;
     127             :         }
     128         837 :         else if( IsXMLToken( rLocalName, XML_HELP_ID ) )
     129             :         {
     130           0 :             sal_Int32 nTmp = rValue.toInt32();
     131             :             mnHelpId =
     132             :                 (nTmp < 0L) ? 0U : ( (nTmp > USHRT_MAX) ? USHRT_MAX
     133           0 :                                                         : (sal_uInt16)nTmp );
     134             :         }
     135         837 :         else if( IsXMLToken( rLocalName, XML_HIDDEN ) )
     136             :         {
     137           0 :             mbHidden = rValue.toBoolean();
     138             :         }
     139             :     }
     140       19388 : }
     141             : 
     142        1844 : TYPEINIT1( SvXMLStyleContext, SvXMLImportContext );
     143             : 
     144       13418 : SvXMLStyleContext::SvXMLStyleContext(
     145             :         SvXMLImport& rImp, sal_uInt16 nPrfx,
     146             :         const OUString& rLName,
     147             :         const uno::Reference< xml::sax::XAttributeList >&,
     148             :         sal_uInt16 nFam, bool bDefault ) :
     149             :     SvXMLImportContext( rImp, nPrfx, rLName ),
     150             :     mbHidden( false ),
     151             :     mnHelpId( UCHAR_MAX ),
     152             :     mnFamily( nFam ),
     153             :     mbValid( true ),
     154             :     mbNew( true ),
     155       13418 :     mbDefaultStyle( bDefault )
     156             : {
     157       13418 : }
     158             : 
     159       13382 : SvXMLStyleContext::~SvXMLStyleContext()
     160             : {
     161       13382 : }
     162             : 
     163           5 : SvXMLImportContext *SvXMLStyleContext::CreateChildContext( sal_uInt16 nPrefix,
     164             :                                                            const OUString& rLocalName,
     165             :                                                            const uno::Reference< xml::sax::XAttributeList > & )
     166             : {
     167           5 :     return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
     168             : }
     169             : 
     170       12534 : void SvXMLStyleContext::StartElement( const uno::Reference< xml::sax::XAttributeList > & xAttrList )
     171             : {
     172       12534 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     173       47402 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     174             :     {
     175       34868 :         const OUString& rAttrName = xAttrList->getNameByIndex( i );
     176       69736 :         OUString aLocalName;
     177       34868 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
     178       69736 :         const OUString& rValue = xAttrList->getValueByIndex( i );
     179             : 
     180       34868 :         SetAttribute( nPrefix, aLocalName, rValue );
     181       34868 :     }
     182       12534 : }
     183             : 
     184           0 : void SvXMLStyleContext::SetDefaults()
     185             : {
     186           0 : }
     187             : 
     188         393 : void SvXMLStyleContext::CreateAndInsert( bool /*bOverwrite*/ )
     189             : {
     190         393 : }
     191             : 
     192        3387 : void SvXMLStyleContext::CreateAndInsertLate( bool /*bOverwrite*/ )
     193             : {
     194        3387 : }
     195             : 
     196        1242 : void SvXMLStyleContext::Finish( bool /*bOverwrite*/ )
     197             : {
     198        1242 : }
     199             : 
     200       12650 : bool SvXMLStyleContext::IsTransient() const
     201             : {
     202       12650 :     return false;
     203             : }
     204             : 
     205       43233 : class SvXMLStyleIndex_Impl
     206             : {
     207             :     OUString              sName;
     208             :     sal_uInt16            nFamily;
     209             :     const SvXMLStyleContext *pStyle;
     210             : 
     211             : public:
     212             : 
     213       18807 :     SvXMLStyleIndex_Impl( sal_uInt16 nFam, const OUString& rName ) :
     214             :         sName( rName ),
     215             :         nFamily( nFam ),
     216       18807 :         pStyle ( 0 )
     217             :     {
     218       18807 :     }
     219             : 
     220       24431 :     SvXMLStyleIndex_Impl( const SvXMLStyleContext *pStl ) :
     221       24431 :         sName( pStl->GetName() ),
     222       24431 :         nFamily( pStl->GetFamily() ),
     223       48862 :         pStyle ( pStl )
     224             :     {
     225       24431 :     }
     226             : 
     227      197552 :     const OUString& GetName() const { return sName; }
     228      516392 :     sal_uInt16 GetFamily() const { return nFamily; }
     229       17567 :     const SvXMLStyleContext *GetStyle() const { return pStyle; }
     230             : };
     231             : 
     232             : struct SvXMLStyleIndexCmp_Impl
     233             : {
     234      142510 :     bool operator()(const SvXMLStyleIndex_Impl& r1, const SvXMLStyleIndex_Impl& r2) const
     235             :     {
     236             :         sal_Int32 nRet;
     237             : 
     238      142510 :         if( (sal_uInt16)r1.GetFamily() < (sal_uInt16)r2.GetFamily() )
     239       26824 :             nRet = -1;
     240      115686 :         else if( (sal_uInt16)r1.GetFamily() > (sal_uInt16)r2.GetFamily() )
     241       16910 :             nRet = 1;
     242             :         else
     243       98776 :             nRet = r1.GetName().compareTo( r2.GetName() );
     244             : 
     245      142510 :         return nRet < 0;
     246             :     }
     247             : };
     248             : 
     249             : class SvXMLStylesContext_Impl
     250             : {
     251             :     typedef std::vector<SvXMLStyleContext*> StylesType;
     252             :     typedef std::set<SvXMLStyleIndex_Impl, SvXMLStyleIndexCmp_Impl> IndicesType;
     253             : 
     254             :     StylesType aStyles;
     255             :     mutable IndicesType* pIndices;
     256             :     bool bAutomaticStyle;
     257             : 
     258             : #ifdef DBG_UTIL
     259             :     mutable sal_uInt32 nIndexCreated;
     260             : #endif
     261             : 
     262       15352 :     void FlushIndex() { delete pIndices; pIndices = 0; }
     263             : 
     264             : public:
     265             :     SvXMLStylesContext_Impl( bool bAuto );
     266             :     ~SvXMLStylesContext_Impl();
     267             : 
     268        6188 :     size_t GetStyleCount() const { return aStyles.size(); }
     269             : 
     270       20427 :     SvXMLStyleContext *GetStyle( size_t i )
     271             :     {
     272       20427 :         return i < aStyles.size() ? aStyles[ i ] : 0;
     273             :     }
     274             : 
     275             :     inline void AddStyle( SvXMLStyleContext *pStyle );
     276             :     void Clear();
     277             : 
     278             :     const SvXMLStyleContext *FindStyleChildContext( sal_uInt16 nFamily,
     279             :                                                     const OUString& rName,
     280             :                                                     bool bCreateIndex ) const;
     281       11546 :     bool IsAutomaticStyle() const { return bAutomaticStyle; }
     282             : };
     283             : 
     284        1777 : SvXMLStylesContext_Impl::SvXMLStylesContext_Impl( bool bAuto ) :
     285             :     pIndices( 0 ),
     286        1777 :     bAutomaticStyle( bAuto )
     287             : #ifdef DBG_UTIL
     288             : ,   nIndexCreated( 0 )
     289             : #endif
     290        1777 : {}
     291             : 
     292        3546 : SvXMLStylesContext_Impl::~SvXMLStylesContext_Impl()
     293             : {
     294        1773 :     delete pIndices;
     295             : 
     296        2006 :     for ( size_t i = 0, n = aStyles.size(); i < n; ++i )
     297             :     {
     298         233 :         SvXMLStyleContext *pStyle = aStyles[ i ];
     299         233 :         pStyle->ReleaseRef();
     300             :     }
     301        1773 :     aStyles.clear();
     302        1773 : }
     303             : 
     304       13197 : inline void SvXMLStylesContext_Impl::AddStyle( SvXMLStyleContext *pStyle )
     305             : {
     306       13197 :     aStyles.push_back( pStyle );
     307       13197 :     pStyle->AddRef();
     308             : 
     309       13197 :     FlushIndex();
     310       13197 : }
     311             : 
     312        2155 : void SvXMLStylesContext_Impl::Clear()
     313             : {
     314        2155 :     FlushIndex();
     315             : 
     316       15083 :     for ( size_t i = 0, n = aStyles.size(); i < n; ++i )
     317             :     {
     318       12928 :         SvXMLStyleContext *pStyle = aStyles[ i ];
     319       12928 :         pStyle->ReleaseRef();
     320             :     }
     321        2155 :     aStyles.clear();
     322        2155 : }
     323             : 
     324       21701 : const SvXMLStyleContext *SvXMLStylesContext_Impl::FindStyleChildContext( sal_uInt16 nFamily,
     325             :                                                                          const OUString& rName,
     326             :                                                                          bool bCreateIndex ) const
     327             : {
     328       21701 :     const SvXMLStyleContext *pStyle = 0;
     329             : 
     330       21701 :     if( !pIndices && bCreateIndex && !aStyles.empty() )
     331             :     {
     332             : #ifdef DBG_UTIL
     333             :         DBG_ASSERT( 0==nIndexCreated,
     334             :                     "Performance warning: sdbcx::Index created multiple times" );
     335             : #endif
     336         967 :         pIndices = new IndicesType(aStyles.begin(), aStyles.end());
     337             :         SAL_WARN_IF(pIndices->size() != aStyles.size(), "xmloff", "Here is a duplicate Style");
     338             : #ifdef DBG_UTIL
     339             :         ++nIndexCreated;
     340             : #endif
     341             :     }
     342             : 
     343       21701 :     if( pIndices )
     344             :     {
     345       18807 :         SvXMLStyleIndex_Impl aIndex( nFamily, rName );
     346       18807 :         IndicesType::iterator aFind = pIndices->find(aIndex);
     347       18807 :         if( aFind != pIndices->end() )
     348       17567 :             pStyle = aFind->GetStyle();
     349             :     }
     350             :     else
     351             :     {
     352       37464 :         for( size_t i = 0; !pStyle && i < aStyles.size(); i++ )
     353             :         {
     354       34570 :             const SvXMLStyleContext *pS = aStyles[ i ];
     355       51988 :             if( pS->GetFamily() == nFamily &&
     356       17418 :                 pS->GetName() == rName )
     357        2710 :                 pStyle = pS;
     358             :         }
     359             :     }
     360       21701 :     return pStyle;
     361             : }
     362             : 
     363           0 : TYPEINIT1( SvXMLStylesContext, SvXMLImportContext );
     364             : 
     365        6188 : sal_uInt32 SvXMLStylesContext::GetStyleCount() const
     366             : {
     367        6188 :     return mpImpl->GetStyleCount();
     368             : }
     369             : 
     370       16107 : SvXMLStyleContext *SvXMLStylesContext::GetStyle( sal_uInt32 i )
     371             : {
     372       16107 :     return mpImpl->GetStyle( i );
     373             : }
     374             : 
     375        4320 : const SvXMLStyleContext *SvXMLStylesContext::GetStyle( sal_uInt32 i ) const
     376             : {
     377        4320 :     return mpImpl->GetStyle( i );
     378             : }
     379             : 
     380       11546 : bool SvXMLStylesContext::IsAutomaticStyle() const
     381             : {
     382       11546 :     return mpImpl->IsAutomaticStyle();
     383             : }
     384             : 
     385        9710 : SvXMLStyleContext *SvXMLStylesContext::CreateStyleChildContext( sal_uInt16 p_nPrefix,
     386             :                                                                 const OUString& rLocalName,
     387             :                                                                 const uno::Reference< xml::sax::XAttributeList > & xAttrList )
     388             : {
     389        9710 :     SvXMLStyleContext *pStyle = NULL;
     390             : 
     391        9710 :     if(GetImport().GetDataStylesImport())
     392             :     {
     393        8902 :         pStyle = GetImport().GetDataStylesImport()->CreateChildContext(GetImport(), p_nPrefix,
     394       17804 :                                                rLocalName, xAttrList, *this);
     395             :     }
     396             : 
     397        9710 :     if (!pStyle)
     398             :     {
     399        8623 :         const SvXMLTokenMap& rTokenMap = GetStyleStylesElemTokenMap();
     400        8623 :         sal_uInt16 nToken = rTokenMap.Get( p_nPrefix, rLocalName );
     401        8623 :         switch( nToken )
     402             :         {
     403             :             case XML_TOK_STYLE_STYLE:
     404             :             case XML_TOK_STYLE_DEFAULT_STYLE:
     405             :             {
     406        7455 :                 sal_uInt16 nFamily = 0;
     407        7455 :                 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     408       13540 :                 for( sal_Int16 i=0; i < nAttrCount; i++ )
     409             :                 {
     410       13540 :                     const OUString& rAttrName = xAttrList->getNameByIndex( i );
     411       19625 :                     OUString aLocalName;
     412             :                     sal_uInt16 nPrefix =
     413       13540 :                         GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
     414       13540 :                                                                     &aLocalName );
     415       27080 :                     if( XML_NAMESPACE_STYLE == nPrefix &&
     416       13540 :                         IsXMLToken( aLocalName, XML_FAMILY ) )
     417             :                     {
     418        7455 :                         const OUString& rValue = xAttrList->getValueByIndex( i );
     419        7455 :                         nFamily = GetFamily( rValue );
     420        7455 :                         break;
     421             :                     }
     422        6085 :                 }
     423             :                 pStyle = XML_TOK_STYLE_STYLE==nToken
     424             :                     ? CreateStyleStyleChildContext( nFamily, p_nPrefix,
     425        6781 :                                                     rLocalName, xAttrList )
     426             :                     : CreateDefaultStyleStyleChildContext( nFamily, p_nPrefix,
     427       14236 :                                                     rLocalName, xAttrList );
     428             :             }
     429        7455 :             break;
     430             :             case XML_TOK_STYLE_PAGE_MASTER:
     431             :             case XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT:
     432             :             {
     433             :                 //there is not page family in ODF now, so I specify one for it
     434         447 :                 bool bDefaultStyle  = XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT == nToken;
     435         447 :                 pStyle = new PageStyleContext( GetImport(), p_nPrefix,
     436         447 :                                                     rLocalName, xAttrList, *this, bDefaultStyle );
     437             :             }
     438         447 :             break;
     439             :             case XML_TOK_TEXT_LIST_STYLE:
     440         143 :                 pStyle = new SvxXMLListStyleContext( GetImport(), p_nPrefix,
     441         143 :                                                     rLocalName, xAttrList );
     442         143 :                 break;
     443             :             case XML_TOK_TEXT_OUTLINE:
     444         114 :                 pStyle = new SvxXMLListStyleContext( GetImport(), p_nPrefix,
     445         114 :                                                     rLocalName, xAttrList, true );
     446         114 :                 break;
     447             :             case XML_TOK_TEXT_NOTE_CONFIG:
     448         228 :                 pStyle = new XMLFootnoteConfigurationImportContext(GetImport(),
     449             :                                                                    p_nPrefix,
     450             :                                                                    rLocalName,
     451         228 :                                                                    xAttrList);
     452         228 :                 break;
     453             : 
     454             :             case XML_TOK_TEXT_BIBLIOGRAPHY_CONFIG:
     455             :                 pStyle = new XMLIndexBibliographyConfigurationContext(
     456           2 :                     GetImport(), p_nPrefix, rLocalName, xAttrList);
     457           2 :                 break;
     458             : 
     459             :             case XML_TOK_TEXT_LINENUMBERING_CONFIG:
     460             :                 pStyle = new XMLLineNumberingImportContext(
     461         114 :                     GetImport(), p_nPrefix, rLocalName, xAttrList);
     462         114 :                 break;
     463             : 
     464             : 
     465             :             // FillStyles
     466             : 
     467             :             case XML_TOK_STYLES_GRADIENTSTYLES:
     468             :             {
     469          31 :                 pStyle = new XMLGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
     470          31 :                 break;
     471             :             }
     472             :             case XML_TOK_STYLES_HATCHSTYLES:
     473             :             {
     474          21 :                 pStyle = new XMLHatchStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
     475          21 :                 break;
     476             :             }
     477             :             case XML_TOK_STYLES_BITMAPSTYLES:
     478             :             {
     479          13 :                 pStyle = new XMLBitmapStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
     480          13 :                 break;
     481             :             }
     482             :             case XML_TOK_STYLES_TRANSGRADIENTSTYLES:
     483             :             {
     484           6 :                 pStyle = new XMLTransGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
     485           6 :                 break;
     486             :             }
     487             :             case XML_TOK_STYLES_MARKERSTYLES:
     488             :             {
     489          35 :                 pStyle = new XMLMarkerStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
     490          35 :                 break;
     491             :             }
     492             :             case XML_TOK_STYLES_DASHSTYLES:
     493             :             {
     494          14 :                 pStyle = new XMLDashStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
     495          14 :                 break;
     496             :             }
     497             :         }
     498             :     }
     499             : 
     500        9710 :     return pStyle;
     501             : }
     502             : 
     503        3989 : SvXMLStyleContext *SvXMLStylesContext::CreateStyleStyleChildContext(
     504             :         sal_uInt16 nFamily, sal_uInt16 nPrefix, const OUString& rLocalName,
     505             :         const uno::Reference< xml::sax::XAttributeList > & xAttrList )
     506             : {
     507        3989 :     SvXMLStyleContext *pStyle = 0;
     508             : 
     509        3989 :     switch( nFamily )
     510             :     {
     511             :         case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
     512             :         case XML_STYLE_FAMILY_TEXT_TEXT:
     513             :         case XML_STYLE_FAMILY_TEXT_SECTION:
     514         840 :             pStyle = new XMLTextStyleContext( GetImport(), nPrefix, rLocalName,
     515         840 :                                               xAttrList, *this, nFamily );
     516         840 :             break;
     517             : 
     518             :         case XML_STYLE_FAMILY_TEXT_RUBY:
     519           7 :             pStyle = new XMLPropStyleContext( GetImport(), nPrefix, rLocalName,
     520           7 :                                               xAttrList, *this, nFamily );
     521           7 :             break;
     522             :         case XML_STYLE_FAMILY_SCH_CHART_ID:
     523         929 :             pStyle = new XMLChartStyleContext( GetImport(), nPrefix, rLocalName,
     524         929 :                                                xAttrList, *this, nFamily );
     525         929 :             break;
     526             : 
     527             :         case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
     528             :         case XML_STYLE_FAMILY_SD_PRESENTATION_ID:
     529             :         case XML_STYLE_FAMILY_SD_POOL_ID:
     530         596 :             pStyle = new XMLShapeStyleContext( GetImport(), nPrefix, rLocalName,
     531         596 :                                                xAttrList, *this, nFamily );
     532             :     }
     533             : 
     534        3989 :     return pStyle;
     535             : }
     536             : 
     537         136 : SvXMLStyleContext *SvXMLStylesContext::CreateDefaultStyleStyleChildContext(
     538             :         sal_uInt16 /*nFamily*/, sal_uInt16 /*nPrefix*/, const OUString& /*rLocalName*/,
     539             :         const uno::Reference< xml::sax::XAttributeList > & )
     540             : {
     541         136 :     return 0;
     542             : }
     543             : 
     544        4924 : bool SvXMLStylesContext::InsertStyleFamily( sal_uInt16 ) const
     545             : {
     546        4924 :     return true;
     547             : }
     548             : 
     549        7455 : sal_uInt16 SvXMLStylesContext::GetFamily( const OUString& rValue ) const
     550             : {
     551        7455 :     sal_uInt16 nFamily = 0U;
     552        7455 :     if( IsXMLToken( rValue, XML_PARAGRAPH ) )
     553             :     {
     554        1951 :         nFamily = XML_STYLE_FAMILY_TEXT_PARAGRAPH;
     555             :     }
     556        5504 :     else if( IsXMLToken( rValue, XML_TEXT ) )
     557             :     {
     558         782 :         nFamily = XML_STYLE_FAMILY_TEXT_TEXT;
     559             :     }
     560        4722 :     else if( IsXMLToken( rValue, XML_DATA_STYLE ) )
     561             :     {
     562           0 :         nFamily = XML_STYLE_FAMILY_DATA_STYLE;
     563             :     }
     564        4722 :     else if ( IsXMLToken( rValue, XML_SECTION ) )
     565             :     {
     566          21 :         nFamily = XML_STYLE_FAMILY_TEXT_SECTION;
     567             :     }
     568        4701 :     else if( IsXMLToken( rValue, XML_TABLE ) )
     569             :     {
     570         265 :         nFamily = XML_STYLE_FAMILY_TABLE_TABLE;
     571             :     }
     572        4436 :     else if( IsXMLToken( rValue, XML_TABLE_COLUMN ) )
     573         406 :         nFamily = XML_STYLE_FAMILY_TABLE_COLUMN;
     574        4030 :     else if( IsXMLToken( rValue, XML_TABLE_ROW ) )
     575         401 :         nFamily = XML_STYLE_FAMILY_TABLE_ROW;
     576        3629 :     else if( IsXMLToken( rValue, XML_TABLE_CELL ) )
     577        1404 :         nFamily = XML_STYLE_FAMILY_TABLE_CELL;
     578        2225 :     else if ( rValue == XML_STYLE_FAMILY_SD_GRAPHICS_NAME )
     579             :     {
     580         986 :         nFamily = XML_STYLE_FAMILY_SD_GRAPHICS_ID;
     581             :     }
     582        1239 :     else if ( rValue == XML_STYLE_FAMILY_SD_PRESENTATION_NAME )
     583             :     {
     584         226 :         nFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID;
     585             :     }
     586        1013 :     else if ( rValue == XML_STYLE_FAMILY_SD_POOL_NAME )
     587             :     {
     588           0 :         nFamily = XML_STYLE_FAMILY_SD_POOL_ID;
     589             :     }
     590        1013 :     else if ( rValue == XML_STYLE_FAMILY_SD_DRAWINGPAGE_NAME )
     591             :     {
     592          77 :         nFamily = XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID;
     593             :     }
     594         936 :     else if ( rValue == XML_STYLE_FAMILY_SCH_CHART_NAME )
     595             :     {
     596         929 :         nFamily = XML_STYLE_FAMILY_SCH_CHART_ID;
     597             :     }
     598           7 :     else if ( IsXMLToken( rValue, XML_RUBY ) )
     599             :     {
     600           7 :         nFamily = XML_STYLE_FAMILY_TEXT_RUBY;
     601             :     }
     602             : 
     603        7455 :     return nFamily;
     604             : }
     605             : 
     606       34136 : UniReference < SvXMLImportPropertyMapper > SvXMLStylesContext::GetImportPropertyMapper(
     607             :                         sal_uInt16 nFamily ) const
     608             : {
     609       34136 :     UniReference < SvXMLImportPropertyMapper > xMapper;
     610             : 
     611       34136 :     switch( nFamily )
     612             :     {
     613             :     case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
     614        8072 :         if( !mxParaImpPropMapper.is() )
     615             :         {
     616         329 :             SvXMLStylesContext * pThis = (SvXMLStylesContext *)this;
     617         329 :             pThis->mxParaImpPropMapper =
     618         329 :                 pThis->GetImport().GetTextImport()
     619         658 :                      ->GetParaImportPropertySetMapper();
     620             :         }
     621        8072 :         xMapper = mxParaImpPropMapper;
     622        8072 :         break;
     623             :     case XML_STYLE_FAMILY_TEXT_TEXT:
     624        4973 :         if( !mxTextImpPropMapper.is() )
     625             :         {
     626         160 :             SvXMLStylesContext * pThis = (SvXMLStylesContext *)this;
     627         160 :             pThis->mxTextImpPropMapper =
     628         160 :                 pThis->GetImport().GetTextImport()
     629         320 :                      ->GetTextImportPropertySetMapper();
     630             :         }
     631        4973 :         xMapper = mxTextImpPropMapper;
     632        4973 :         break;
     633             : 
     634             :     case XML_STYLE_FAMILY_TEXT_SECTION:
     635             :         // don't cache section mapper, as it's rarely used
     636             :         // *sigh*, cast to non-const, because this is a const method,
     637             :         // but SvXMLImport::GetTextImport() isn't.
     638          66 :         xMapper = ((SvXMLStylesContext*)this)->GetImport().GetTextImport()->
     639          66 :             GetSectionImportPropertySetMapper();
     640          66 :         break;
     641             : 
     642             :     case XML_STYLE_FAMILY_TEXT_RUBY:
     643             :         // don't cache section mapper, as it's rarely used
     644             :         // *sigh*, cast to non-const, because this is a const method,
     645             :         // but SvXMLImport::GetTextImport() isn't.
     646          19 :         xMapper = ((SvXMLStylesContext*)this)->GetImport().GetTextImport()->
     647          19 :             GetRubyImportPropertySetMapper();
     648          19 :         break;
     649             : 
     650             :     case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
     651             :     case XML_STYLE_FAMILY_SD_PRESENTATION_ID:
     652             :     case XML_STYLE_FAMILY_SD_POOL_ID:
     653        5083 :         if(!mxShapeImpPropMapper.is())
     654             :         {
     655         313 :             UniReference< XMLShapeImportHelper > aImpHelper = ((SvXMLImport&)GetImport()).GetShapeImport();
     656         313 :             ((SvXMLStylesContext*)this)->mxShapeImpPropMapper =
     657         313 :                 aImpHelper->GetPropertySetMapper();
     658             :         }
     659        5083 :         xMapper = mxShapeImpPropMapper;
     660        5083 :         break;
     661             :     case XML_STYLE_FAMILY_SCH_CHART_ID:
     662        4626 :         if( ! mxChartImpPropMapper.is() )
     663             :         {
     664          83 :             XMLPropertySetMapper *pPropMapper = new XMLChartPropertySetMapper( false );
     665          83 :             mxChartImpPropMapper = new XMLChartImportPropertyMapper( pPropMapper, GetImport() );
     666             :         }
     667        4626 :         xMapper = mxChartImpPropMapper;
     668        4626 :         break;
     669             :     case XML_STYLE_FAMILY_PAGE_MASTER:
     670        1663 :         if( ! mxPageImpPropMapper.is() )
     671             :         {
     672             :             XMLPropertySetMapper *pPropMapper =
     673         284 :                 new XMLPageMasterPropSetMapper( false );
     674        1136 :             mxPageImpPropMapper =
     675             :                 new PageMasterImportPropertyMapper( pPropMapper,
     676         852 :                                     ((SvXMLStylesContext*)this)->GetImport() );
     677             :         }
     678        1663 :         xMapper = mxPageImpPropMapper;
     679        1663 :         break;
     680             :     }
     681             : 
     682       34136 :     return xMapper;
     683             : }
     684             : 
     685        1111 : Reference < XAutoStyleFamily > SvXMLStylesContext::GetAutoStyles( sal_uInt16 nFamily ) const
     686             : {
     687        1111 :     Reference < XAutoStyleFamily > xAutoStyles;
     688        1111 :     if( XML_STYLE_FAMILY_TEXT_TEXT == nFamily || XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily)
     689             :     {
     690        1111 :         bool bPara = XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily;
     691        1111 :         OUString sName;
     692        1111 :         if( !bPara && mxTextAutoStyles.is() )
     693         413 :             xAutoStyles = mxTextAutoStyles;
     694         698 :         else if( bPara && mxParaAutoStyles.is() )
     695         501 :             xAutoStyles = mxParaAutoStyles;
     696             :         else
     697             :         {
     698         197 :             sName = bPara ? OUString( "ParagraphStyles" ): OUString( "CharacterStyles" );
     699         197 :             Reference< XAutoStylesSupplier > xAutoStylesSupp(   GetImport().GetModel(), UNO_QUERY );
     700         394 :             Reference< XAutoStyles > xAutoStyleFamilies = xAutoStylesSupp->getAutoStyles();
     701         197 :             if (xAutoStyleFamilies->hasByName(sName))
     702             :             {
     703         197 :                 Any aAny = xAutoStyleFamilies->getByName( sName );
     704         197 :                 xAutoStyles = *(Reference<XAutoStyleFamily>*)aAny.getValue();
     705         197 :                 if( bPara )
     706         120 :                     ((SvXMLStylesContext *)this)->mxParaAutoStyles = xAutoStyles;
     707             :                 else
     708          77 :                     ((SvXMLStylesContext *)this)->mxTextAutoStyles = xAutoStyles;
     709         197 :             }
     710        1111 :         }
     711             :     }
     712        1111 :     return xAutoStyles;
     713             : }
     714             : 
     715        3812 : Reference < XNameContainer > SvXMLStylesContext::GetStylesContainer(
     716             :                                                 sal_uInt16 nFamily ) const
     717             : {
     718        3812 :     Reference < XNameContainer > xStyles;
     719        7624 :     OUString sName;
     720        3812 :     switch( nFamily )
     721             :     {
     722             :     case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
     723        2098 :         if( mxParaStyles.is() )
     724        1948 :             xStyles = mxParaStyles;
     725             :         else
     726         150 :             sName = "ParagraphStyles";
     727        2098 :         break;
     728             : 
     729             :     case XML_STYLE_FAMILY_TEXT_TEXT:
     730         476 :         if( mxTextStyles.is() )
     731         420 :             xStyles = mxTextStyles;
     732             :         else
     733          56 :             sName = "CharacterStyles";
     734         476 :         break;
     735             :     }
     736        3812 :     if( !xStyles.is() && !sName.isEmpty() )
     737             :     {
     738             :         Reference< XStyleFamiliesSupplier > xFamiliesSupp(
     739         206 :                                         GetImport().GetModel(), UNO_QUERY );
     740         206 :         if ( xFamiliesSupp.is() )
     741             :         {
     742         206 :             Reference< XNameAccess > xFamilies = xFamiliesSupp->getStyleFamilies();
     743         206 :             if (xFamilies->hasByName(sName))
     744             :             {
     745         206 :                 xStyles.set(xFamilies->getByName( sName ),uno::UNO_QUERY);
     746             : 
     747         206 :                 switch( nFamily )
     748             :                 {
     749             :                 case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
     750         150 :                     ((SvXMLStylesContext *)this)->mxParaStyles = xStyles;
     751         150 :                     break;
     752             : 
     753             :                 case XML_STYLE_FAMILY_TEXT_TEXT:
     754          56 :                     ((SvXMLStylesContext *)this)->mxTextStyles = xStyles;
     755          56 :                     break;
     756             :                 }
     757         206 :             }
     758         206 :         }
     759             :     }
     760             : 
     761        7624 :     return xStyles;
     762             : }
     763             : 
     764         332 : OUString SvXMLStylesContext::GetServiceName( sal_uInt16 nFamily ) const
     765             : {
     766         332 :     OUString sServiceName;
     767         332 :     switch( nFamily )
     768             :     {
     769             :     case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
     770         100 :         sServiceName = msParaStyleServiceName;
     771         100 :         break;
     772             :     case XML_STYLE_FAMILY_TEXT_TEXT:
     773         148 :         sServiceName = msTextStyleServiceName;
     774         148 :         break;
     775             :     }
     776             : 
     777         332 :     return sServiceName;
     778             : }
     779             : 
     780        1777 : SvXMLStylesContext::SvXMLStylesContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
     781             :                                         const OUString& rLName,
     782             :                                         const uno::Reference< xml::sax::XAttributeList > &, bool bAuto ) :
     783             :     SvXMLImportContext( rImport, nPrfx, rLName ),
     784             :     msParaStyleServiceName( "com.sun.star.style.ParagraphStyle" ),
     785             :     msTextStyleServiceName( "com.sun.star.style.CharacterStyle" ),
     786        1777 :     mpImpl( new SvXMLStylesContext_Impl( bAuto ) ),
     787        3554 :     mpStyleStylesElemTokenMap( 0 )
     788             : {
     789        1777 : }
     790             : 
     791        3712 : SvXMLStylesContext::~SvXMLStylesContext()
     792             : {
     793        1773 :     delete mpStyleStylesElemTokenMap;
     794        1773 :     delete mpImpl;
     795        1939 : }
     796             : 
     797       12770 : SvXMLImportContext *SvXMLStylesContext::CreateChildContext( sal_uInt16 nPrefix,
     798             :                                                             const OUString& rLocalName,
     799             :                                                             const uno::Reference< xml::sax::XAttributeList > & xAttrList )
     800             : {
     801       12770 :     SvXMLImportContext *pContext = 0;
     802             : 
     803             :     SvXMLStyleContext *pStyle =
     804       12770 :         CreateStyleChildContext( nPrefix, rLocalName, xAttrList );
     805       12770 :     if( pStyle )
     806             :     {
     807       12770 :         if( !pStyle->IsTransient() )
     808       12650 :             mpImpl->AddStyle( pStyle );
     809       12770 :         pContext = pStyle;
     810             :     }
     811             :     else
     812             :     {
     813           0 :         pContext = new SvXMLImportContext( GetImport(), nPrefix,
     814           0 :                                            rLocalName );
     815             :     }
     816             : 
     817       12770 :     return pContext;
     818             : }
     819             : 
     820        1022 : void SvXMLStylesContext::EndElement()
     821             : {
     822        1022 : }
     823             : 
     824         547 : void SvXMLStylesContext::AddStyle(SvXMLStyleContext& rNew)
     825             : {
     826         547 :     mpImpl->AddStyle( &rNew );
     827         547 : }
     828             : 
     829        2155 : void SvXMLStylesContext::Clear()
     830             : {
     831        2155 :     mpImpl->Clear();
     832        2155 : }
     833             : 
     834         264 : void SvXMLStylesContext::CopyAutoStylesToDoc()
     835             : {
     836         264 :     sal_uInt32 nCount = GetStyleCount();
     837             :     sal_uInt32 i;
     838        2382 :     for( i = 0; i < nCount; i++ )
     839             :     {
     840        2118 :         SvXMLStyleContext *pStyle = GetStyle( i );
     841        4492 :         if( !pStyle || ( pStyle->GetFamily() != XML_STYLE_FAMILY_TEXT_TEXT &&
     842        2643 :             pStyle->GetFamily() != XML_STYLE_FAMILY_TEXT_PARAGRAPH  &&
     843        1015 :             pStyle->GetFamily() != XML_STYLE_FAMILY_TABLE_CELL ) )
     844         746 :             continue;
     845        1372 :         pStyle->CreateAndInsert( false );
     846             :     }
     847         264 : }
     848             : 
     849         259 : void SvXMLStylesContext::CopyStylesToDoc( bool bOverwrite,
     850             :                                           bool bFinish )
     851             : {
     852             :     // pass 1: create text, paragraph and frame styles
     853         259 :     sal_uInt32 nCount = GetStyleCount();
     854             :     sal_uInt32 i;
     855             : 
     856        4497 :     for( i = 0; i < nCount; i++ )
     857             :     {
     858        4238 :         SvXMLStyleContext *pStyle = GetStyle( i );
     859        4238 :         if( !pStyle )
     860           0 :             continue;
     861             : 
     862        4238 :         if (pStyle->IsDefaultStyle())
     863         686 :             pStyle->SetDefaults();
     864        3552 :         else if( InsertStyleFamily( pStyle->GetFamily() ) )
     865        3552 :             pStyle->CreateAndInsert( bOverwrite );
     866             :     }
     867             : 
     868             :     // pass 2: create list styles (they require char styles)
     869        4497 :     for( i=0; i<nCount; i++ )
     870             :     {
     871        4238 :         SvXMLStyleContext *pStyle = GetStyle( i );
     872        4238 :         if( !pStyle || pStyle->IsDefaultStyle())
     873         686 :             continue;
     874             : 
     875        3552 :         if( InsertStyleFamily( pStyle->GetFamily() ) )
     876        3552 :             pStyle->CreateAndInsertLate( bOverwrite );
     877             :     }
     878             : 
     879             :     // pass3: finish creation of styles
     880         259 :     if( bFinish )
     881         108 :         FinishStyles( bOverwrite );
     882         259 : }
     883             : 
     884         565 : void SvXMLStylesContext::FinishStyles( bool bOverwrite )
     885             : {
     886         565 :     sal_uInt32 nCount = GetStyleCount();
     887        5663 :     for( sal_uInt32 i=0; i<nCount; i++ )
     888             :     {
     889        5098 :         SvXMLStyleContext *pStyle = GetStyle( i );
     890        5098 :         if( !pStyle || !pStyle->IsValid() || pStyle->IsDefaultStyle() )
     891         758 :             continue;
     892             : 
     893        4340 :         if( InsertStyleFamily( pStyle->GetFamily() ) )
     894        4340 :             pStyle->Finish( bOverwrite );
     895             :     }
     896         565 : }
     897             : 
     898       21701 : const SvXMLStyleContext *SvXMLStylesContext::FindStyleChildContext(
     899             :                                   sal_uInt16 nFamily,
     900             :                                   const OUString& rName,
     901             :                                   bool bCreateIndex ) const
     902             : {
     903       21701 :     return mpImpl->FindStyleChildContext( nFamily, rName, bCreateIndex );
     904             : }
     905             : 
     906             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10