summaryrefslogtreecommitdiff
path: root/xmloff/source/style/xmlstyle.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'xmloff/source/style/xmlstyle.cxx')
-rw-r--r--xmloff/source/style/xmlstyle.cxx954
1 files changed, 954 insertions, 0 deletions
diff --git a/xmloff/source/style/xmlstyle.cxx b/xmloff/source/style/xmlstyle.cxx
new file mode 100644
index 000000000000..b3343c307193
--- /dev/null
+++ b/xmloff/source/style/xmlstyle.cxx
@@ -0,0 +1,954 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_xmloff.hxx"
+#include <com/sun/star/xml/sax/SAXParseException.hpp>
+#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
+#include <com/sun/star/xml/sax/SAXException.hpp>
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+#include <com/sun/star/xml/sax/XAttributeList.hpp>
+#include <com/sun/star/xml/sax/XLocator.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+#include <com/sun/star/style/XAutoStylesSupplier.hpp>
+#include <com/sun/star/style/XAutoStyleFamily.hpp>
+#include "PageMasterPropMapper.hxx"
+#include <tools/debug.hxx>
+#include <svl/cntnrsrt.hxx>
+#include <svl/itemset.hxx>
+#include <xmloff/nmspmap.hxx>
+#include "xmloff/xmlnmspe.hxx"
+#include <xmloff/xmltoken.hxx>
+
+#include <xmloff/families.hxx>
+#include <xmloff/xmlimp.hxx>
+#include <xmloff/xmlnumi.hxx>
+#include <xmloff/xmlimppr.hxx>
+#include <xmloff/xmlstyle.hxx>
+#include <xmloff/txtstyli.hxx>
+#include <xmloff/txtprmap.hxx>
+#include <xmloff/xmlnumfi.hxx>
+#include "XMLChartStyleContext.hxx"
+#include "XMLChartPropertySetMapper.hxx"
+#include <xmloff/XMLShapeStyleContext.hxx>
+#include "FillStyleContext.hxx"
+#include "XMLFootnoteConfigurationImportContext.hxx"
+#include "XMLIndexBibliographyConfigurationContext.hxx"
+#include "XMLLineNumberingImportContext.hxx"
+#include "PageMasterImportContext.hxx"
+#include "PageMasterImportPropMapper.hxx"
+
+#include <vector>
+
+using ::rtl::OUString;
+using ::rtl::OUStringBuffer;
+using ::std::vector;
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::style;
+using namespace ::xmloff::token;
+
+// ---------------------------------------------------------------------
+
+static SvXMLTokenMapEntry aStyleStylesElemTokenMap[] =
+{
+ { XML_NAMESPACE_STYLE, XML_STYLE, XML_TOK_STYLE_STYLE },
+ { XML_NAMESPACE_STYLE, XML_PAGE_LAYOUT, XML_TOK_STYLE_PAGE_MASTER },
+ { XML_NAMESPACE_TEXT, XML_LIST_STYLE, XML_TOK_TEXT_LIST_STYLE },
+ { XML_NAMESPACE_TEXT, XML_OUTLINE_STYLE, XML_TOK_TEXT_OUTLINE },
+ { XML_NAMESPACE_STYLE, XML_DEFAULT_STYLE, XML_TOK_STYLE_DEFAULT_STYLE },
+ { XML_NAMESPACE_DRAW, XML_GRADIENT, XML_TOK_STYLES_GRADIENTSTYLES },
+ { XML_NAMESPACE_DRAW, XML_HATCH, XML_TOK_STYLES_HATCHSTYLES },
+ { XML_NAMESPACE_DRAW, XML_FILL_IMAGE, XML_TOK_STYLES_BITMAPSTYLES },
+ { XML_NAMESPACE_DRAW, XML_OPACITY, XML_TOK_STYLES_TRANSGRADIENTSTYLES },
+ { XML_NAMESPACE_DRAW, XML_MARKER, XML_TOK_STYLES_MARKERSTYLES },
+ { XML_NAMESPACE_DRAW, XML_STROKE_DASH, XML_TOK_STYLES_DASHSTYLES },
+ { XML_NAMESPACE_TEXT, XML_NOTES_CONFIGURATION, XML_TOK_TEXT_NOTE_CONFIG },
+ { XML_NAMESPACE_TEXT, XML_BIBLIOGRAPHY_CONFIGURATION, XML_TOK_TEXT_BIBLIOGRAPHY_CONFIG },
+ { XML_NAMESPACE_TEXT, XML_LINENUMBERING_CONFIGURATION,XML_TOK_TEXT_LINENUMBERING_CONFIG },
+ { XML_NAMESPACE_STYLE, XML_DEFAULT_PAGE_LAYOUT, XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT },
+ XML_TOKEN_MAP_END
+};
+
+const SvXMLTokenMap& SvXMLStylesContext::GetStyleStylesElemTokenMap()
+{
+ if( !mpStyleStylesElemTokenMap )
+ mpStyleStylesElemTokenMap =
+ new SvXMLTokenMap( aStyleStylesElemTokenMap );
+
+ return *mpStyleStylesElemTokenMap;
+}
+
+// ---------------------------------------------------------------------
+
+void SvXMLStyleContext::SetAttribute( sal_uInt16 nPrefixKey,
+ const OUString& rLocalName,
+ const OUString& rValue )
+{
+ // TODO: use a map here
+ if( XML_NAMESPACE_STYLE == nPrefixKey )
+ {
+ if( IsXMLToken( rLocalName, XML_FAMILY ) )
+ {
+ if( IsXMLToken( rValue, XML_PARAGRAPH ) )
+ mnFamily = (sal_uInt16)SFX_STYLE_FAMILY_PARA;
+ else if( IsXMLToken( rValue, XML_TEXT ) )
+ mnFamily = (sal_uInt16)SFX_STYLE_FAMILY_CHAR;
+ }
+ else if( IsXMLToken( rLocalName, XML_NAME ) )
+ {
+ maName = rValue;
+ }
+ else if( IsXMLToken( rLocalName, XML_DISPLAY_NAME ) )
+ {
+ maDisplayName = rValue;
+ }
+ else if( IsXMLToken( rLocalName, XML_PARENT_STYLE_NAME ) )
+ {
+ maParentName = rValue;
+ }
+ else if( IsXMLToken( rLocalName, XML_NEXT_STYLE_NAME ) )
+ {
+ maFollow = rValue;
+ }
+ else if( IsXMLToken( rLocalName, XML_HELP_FILE_NAME ) )
+ {
+ maHelpFile = rValue;
+ }
+ else if( IsXMLToken( rLocalName, XML_HELP_ID ) )
+ {
+ sal_Int32 nTmp = rValue.toInt32();
+ mnHelpId =
+ (nTmp < 0L) ? 0U : ( (nTmp > USHRT_MAX) ? USHRT_MAX
+ : (sal_uInt16)nTmp );
+ }
+ }
+}
+
+TYPEINIT1( SvXMLStyleContext, SvXMLImportContext );
+
+SvXMLStyleContext::SvXMLStyleContext(
+ SvXMLImport& rImp, sal_uInt16 nPrfx,
+ const OUString& rLName,
+ const uno::Reference< xml::sax::XAttributeList >&,
+ sal_uInt16 nFam, sal_Bool bDefault ) :
+ SvXMLImportContext( rImp, nPrfx, rLName ),
+ mnHelpId( UCHAR_MAX ),
+ mnFamily( nFam ),
+ mbValid( sal_True ),
+ mbNew( sal_True ),
+ mbDefaultStyle( bDefault )
+{
+}
+
+SvXMLStyleContext::~SvXMLStyleContext()
+{
+}
+
+SvXMLImportContext *SvXMLStyleContext::CreateChildContext( sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList > & )
+{
+ return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );;
+}
+
+void SvXMLStyleContext::StartElement( const uno::Reference< xml::sax::XAttributeList > & xAttrList )
+{
+ sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
+ for( sal_Int16 i=0; i < nAttrCount; i++ )
+ {
+ const OUString& rAttrName = xAttrList->getNameByIndex( i );
+ OUString aLocalName;
+ sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
+ const OUString& rValue = xAttrList->getValueByIndex( i );
+
+ SetAttribute( nPrefix, aLocalName, rValue );
+ }
+}
+
+void SvXMLStyleContext::SetDefaults()
+{
+}
+
+void SvXMLStyleContext::CreateAndInsert( sal_Bool /*bOverwrite*/ )
+{
+}
+
+void SvXMLStyleContext::CreateAndInsertLate( sal_Bool /*bOverwrite*/ )
+{
+}
+
+void SvXMLStyleContext::Finish( sal_Bool /*bOverwrite*/ )
+{
+}
+
+sal_Bool SvXMLStyleContext::IsTransient() const
+{
+ return sal_False;
+}
+
+// ---------------------------------------------------------------------
+
+class SvXMLStyleIndex_Impl
+{
+ OUString sName;
+ sal_uInt16 nFamily;
+ const SvXMLStyleContext *pStyle;
+
+public:
+
+ SvXMLStyleIndex_Impl( sal_uInt16 nFam, const OUString& rName ) :
+ sName( rName ),
+ nFamily( nFam ),
+ pStyle ( 0 )
+ {
+ }
+
+ SvXMLStyleIndex_Impl( const SvXMLStyleContext *pStl ) :
+ sName( pStl->GetName() ),
+ nFamily( pStl->GetFamily() ),
+ pStyle ( pStl )
+ {
+ }
+
+ const OUString& GetName() const { return sName; }
+ sal_uInt16 GetFamily() const { return nFamily; }
+ const SvXMLStyleContext *GetStyle() const { return pStyle; }
+};
+
+int SvXMLStyleIndexCmp_Impl( const SvXMLStyleIndex_Impl& r1,
+ const SvXMLStyleIndex_Impl& r2 )
+{
+ int nRet;
+ if( (sal_uInt16)r1.GetFamily() < (sal_uInt16)r2.GetFamily() )
+ nRet = -1;
+ else if( (sal_uInt16)r1.GetFamily() > (sal_uInt16)r2.GetFamily() )
+ nRet = 1;
+ else
+ nRet = (int)r1.GetName().compareTo( r2.GetName() );
+
+ return nRet;
+}
+
+// ---------------------------------------------------------------------
+
+typedef SvXMLStyleContext *SvXMLStyleContextPtr;
+typedef vector< SvXMLStyleContextPtr > SvXMLStyleContexts_Impl;
+
+DECLARE_CONTAINER_SORT_DEL( SvXMLStyleIndices_Impl, SvXMLStyleIndex_Impl )
+IMPL_CONTAINER_SORT( SvXMLStyleIndices_Impl, SvXMLStyleIndex_Impl,
+ SvXMLStyleIndexCmp_Impl )
+
+
+class SvXMLStylesContext_Impl
+{
+ SvXMLStyleContexts_Impl aStyles;
+ SvXMLStyleIndices_Impl *pIndices;
+ sal_Bool bAutomaticStyle;
+
+#ifdef DBG_UTIL
+ sal_uInt32 nIndexCreated;
+#endif
+
+ void FlushIndex() { delete pIndices; pIndices = 0; }
+
+public:
+ SvXMLStylesContext_Impl( sal_Bool bAuto );
+ ~SvXMLStylesContext_Impl();
+
+ size_t GetStyleCount() const { return aStyles.size(); }
+
+ const SvXMLStyleContext *GetStyle( size_t i ) const
+ {
+ return i < aStyles.size() ? aStyles[ i ] : 0;
+ }
+
+ SvXMLStyleContext *GetStyle( size_t i )
+ {
+ return i < aStyles.size() ? aStyles[ i ] : 0;
+ }
+
+ inline void AddStyle( SvXMLStyleContext *pStyle );
+ void Clear();
+
+ const SvXMLStyleContext *FindStyleChildContext( sal_uInt16 nFamily,
+ const OUString& rName, sal_Bool bCreateIndex ) const;
+ sal_Bool IsAutomaticStyle() const { return bAutomaticStyle; }
+};
+
+SvXMLStylesContext_Impl::SvXMLStylesContext_Impl( sal_Bool bAuto ) :
+ pIndices( 0 ),
+ bAutomaticStyle( bAuto )
+#ifdef DBG_UTIL
+, nIndexCreated( 0 )
+#endif
+{}
+
+SvXMLStylesContext_Impl::~SvXMLStylesContext_Impl()
+{
+ delete pIndices;
+
+ for ( size_t i = 0, n = aStyles.size(); i < n; ++i )
+ {
+ SvXMLStyleContext *pStyle = aStyles[ i ];
+ pStyle->ReleaseRef();
+ }
+ aStyles.clear();
+}
+
+inline void SvXMLStylesContext_Impl::AddStyle( SvXMLStyleContext *pStyle )
+{
+ aStyles.push_back( pStyle );
+ pStyle->AddRef();
+
+ FlushIndex();
+}
+
+void SvXMLStylesContext_Impl::Clear()
+{
+ FlushIndex();
+
+ for ( size_t i = 0, n = aStyles.size(); i < n; ++i )
+ {
+ SvXMLStyleContext *pStyle = aStyles[ i ];
+ pStyle->ReleaseRef();
+ }
+ aStyles.clear();
+}
+
+const SvXMLStyleContext *SvXMLStylesContext_Impl::FindStyleChildContext(
+ sal_uInt16 nFamily,
+ const OUString& rName,
+ sal_Bool bCreateIndex ) const
+{
+ const SvXMLStyleContext *pStyle = 0;
+
+ if( !pIndices && bCreateIndex && !aStyles.empty() )
+ {
+#ifdef DBG_UTIL
+ DBG_ASSERT( 0==nIndexCreated,
+ "Performance warning: sdbcx::Index created multiple times" );
+#endif
+ ((SvXMLStylesContext_Impl *)this)->pIndices =
+ new SvXMLStyleIndices_Impl(
+ sal::static_int_cast< sal_uInt16 >( aStyles.size() ), 5 );
+ for( size_t i = 0; i < aStyles.size(); i++ )
+ {
+ SvXMLStyleIndex_Impl* pStyleIndex = new SvXMLStyleIndex_Impl( aStyles[ i ] );
+ if (!pIndices->Insert( pStyleIndex ))
+ {
+ OSL_FAIL("Here is a double Style");
+ delete pStyleIndex;
+ }
+ }
+#ifdef DBG_UTIL
+ ((SvXMLStylesContext_Impl *)this)->nIndexCreated++;
+#endif
+ }
+
+ if( pIndices )
+ {
+ SvXMLStyleIndex_Impl aIndex( nFamily, rName );
+ sal_uLong nPos = 0;
+ if( pIndices->Seek_Entry( &aIndex, &nPos ) )
+ pStyle = pIndices->GetObject( nPos )->GetStyle();
+ }
+ else
+ {
+ for( size_t i = 0; !pStyle && i < aStyles.size(); i++ )
+ {
+ const SvXMLStyleContext *pS = aStyles[ i ];
+ if( pS->GetFamily() == nFamily &&
+ pS->GetName() == rName )
+ pStyle = pS;
+ }
+ }
+ return pStyle;
+}
+
+// ---------------------------------------------------------------------
+
+TYPEINIT1( SvXMLStylesContext, SvXMLImportContext );
+
+sal_uInt32 SvXMLStylesContext::GetStyleCount() const
+{
+ return mpImpl->GetStyleCount();
+}
+
+SvXMLStyleContext *SvXMLStylesContext::GetStyle( sal_uInt32 i )
+{
+ return mpImpl->GetStyle( i );
+}
+
+const SvXMLStyleContext *SvXMLStylesContext::GetStyle( sal_uInt32 i ) const
+{
+ return mpImpl->GetStyle( i );
+}
+
+sal_Bool SvXMLStylesContext::IsAutomaticStyle() const
+{
+ return mpImpl->IsAutomaticStyle();
+}
+
+SvXMLStyleContext *SvXMLStylesContext::CreateStyleChildContext(
+ sal_uInt16 p_nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList > & xAttrList )
+{
+ SvXMLStyleContext *pStyle = NULL;
+
+ if(GetImport().GetDataStylesImport())
+ {
+ pStyle = GetImport().GetDataStylesImport()->CreateChildContext(GetImport(), p_nPrefix,
+ rLocalName, xAttrList, *this);
+ }
+
+ if (!pStyle)
+ {
+ const SvXMLTokenMap& rTokenMap = GetStyleStylesElemTokenMap();
+ sal_uInt16 nToken = rTokenMap.Get( p_nPrefix, rLocalName );
+ switch( nToken )
+ {
+ case XML_TOK_STYLE_STYLE:
+ case XML_TOK_STYLE_DEFAULT_STYLE:
+ {
+ sal_uInt16 nFamily = 0;
+ sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
+ for( sal_Int16 i=0; i < nAttrCount; i++ )
+ {
+ const OUString& rAttrName = xAttrList->getNameByIndex( i );
+ OUString aLocalName;
+ sal_uInt16 nPrefix =
+ GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
+ &aLocalName );
+ if( XML_NAMESPACE_STYLE == nPrefix &&
+ IsXMLToken( aLocalName, XML_FAMILY ) )
+ {
+ const OUString& rValue = xAttrList->getValueByIndex( i );
+ nFamily = GetFamily( rValue );
+ break;
+ }
+ }
+ pStyle = XML_TOK_STYLE_STYLE==nToken
+ ? CreateStyleStyleChildContext( nFamily, p_nPrefix,
+ rLocalName, xAttrList )
+ : CreateDefaultStyleStyleChildContext( nFamily, p_nPrefix,
+ rLocalName, xAttrList );
+ }
+ break;
+ case XML_TOK_STYLE_PAGE_MASTER:
+ case XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT:
+ {
+ //there is not page family in odf now, so I specify one for it
+ sal_Bool bDefaultStyle = XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT == nToken
+ ? sal_True: sal_False;
+ pStyle = new PageStyleContext( GetImport(), p_nPrefix,
+ rLocalName, xAttrList, *this, bDefaultStyle );
+ }
+ break;
+ case XML_TOK_TEXT_LIST_STYLE:
+ pStyle = new SvxXMLListStyleContext( GetImport(), p_nPrefix,
+ rLocalName, xAttrList );
+ break;
+ case XML_TOK_TEXT_OUTLINE:
+ pStyle = new SvxXMLListStyleContext( GetImport(), p_nPrefix,
+ rLocalName, xAttrList, sal_True );
+ break;
+ case XML_TOK_TEXT_NOTE_CONFIG:
+ pStyle = new XMLFootnoteConfigurationImportContext(GetImport(),
+ p_nPrefix,
+ rLocalName,
+ xAttrList);
+ break;
+
+ case XML_TOK_TEXT_BIBLIOGRAPHY_CONFIG:
+ pStyle = new XMLIndexBibliographyConfigurationContext(
+ GetImport(), p_nPrefix, rLocalName, xAttrList);
+ break;
+
+ case XML_TOK_TEXT_LINENUMBERING_CONFIG:
+ pStyle = new XMLLineNumberingImportContext(
+ GetImport(), p_nPrefix, rLocalName, xAttrList);
+ break;
+
+ //
+ // FillStyles
+ //
+ case XML_TOK_STYLES_GRADIENTSTYLES:
+ {
+ pStyle = new XMLGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
+ break;
+ }
+ case XML_TOK_STYLES_HATCHSTYLES:
+ {
+ pStyle = new XMLHatchStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
+ break;
+ }
+ case XML_TOK_STYLES_BITMAPSTYLES:
+ {
+ pStyle = new XMLBitmapStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
+ break;
+ }
+ case XML_TOK_STYLES_TRANSGRADIENTSTYLES:
+ {
+ pStyle = new XMLTransGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
+ break;
+ }
+ case XML_TOK_STYLES_MARKERSTYLES:
+ {
+ pStyle = new XMLMarkerStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
+ break;
+ }
+ case XML_TOK_STYLES_DASHSTYLES:
+ {
+ pStyle = new XMLDashStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
+ break;
+ }
+ }
+ }
+
+ return pStyle;
+}
+
+SvXMLStyleContext *SvXMLStylesContext::CreateStyleStyleChildContext(
+ sal_uInt16 nFamily, sal_uInt16 nPrefix, const OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList > & xAttrList )
+{
+ SvXMLStyleContext *pStyle = 0;
+
+ switch( nFamily )
+ {
+ case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
+ case XML_STYLE_FAMILY_TEXT_TEXT:
+ case XML_STYLE_FAMILY_TEXT_SECTION:
+ pStyle = new XMLTextStyleContext( GetImport(), nPrefix, rLocalName,
+ xAttrList, *this, nFamily );
+ break;
+
+ case XML_STYLE_FAMILY_TEXT_RUBY:
+ pStyle = new XMLPropStyleContext( GetImport(), nPrefix, rLocalName,
+ xAttrList, *this, nFamily );
+ break;
+ case XML_STYLE_FAMILY_SCH_CHART_ID:
+ pStyle = new XMLChartStyleContext( GetImport(), nPrefix, rLocalName,
+ xAttrList, *this, nFamily );
+ break;
+
+ case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
+ case XML_STYLE_FAMILY_SD_PRESENTATION_ID:
+ case XML_STYLE_FAMILY_SD_POOL_ID:
+ pStyle = new XMLShapeStyleContext( GetImport(), nPrefix, rLocalName,
+ xAttrList, *this, nFamily );
+ }
+
+ return pStyle;
+}
+
+SvXMLStyleContext *SvXMLStylesContext::CreateDefaultStyleStyleChildContext(
+ sal_uInt16 /*nFamily*/, sal_uInt16 /*nPrefix*/, const OUString& /*rLocalName*/,
+ const uno::Reference< xml::sax::XAttributeList > & )
+{
+ return 0;
+}
+
+
+sal_Bool SvXMLStylesContext::InsertStyleFamily( sal_uInt16 ) const
+{
+ return sal_True;
+}
+
+sal_uInt16 SvXMLStylesContext::GetFamily(
+ const ::rtl::OUString& rValue ) const
+{
+ sal_uInt16 nFamily = 0U;
+ if( IsXMLToken( rValue, XML_PARAGRAPH ) )
+ {
+ nFamily = XML_STYLE_FAMILY_TEXT_PARAGRAPH;
+ }
+ else if( IsXMLToken( rValue, XML_TEXT ) )
+ {
+ nFamily = XML_STYLE_FAMILY_TEXT_TEXT;
+ }
+ else if( IsXMLToken( rValue, XML_DATA_STYLE ) )
+ {
+ nFamily = XML_STYLE_FAMILY_DATA_STYLE;
+ }
+ else if ( IsXMLToken( rValue, XML_SECTION ) )
+ {
+ nFamily = XML_STYLE_FAMILY_TEXT_SECTION;
+ }
+ else if( IsXMLToken( rValue, XML_TABLE ) )
+ {
+ nFamily = XML_STYLE_FAMILY_TABLE_TABLE;
+ }
+ else if( IsXMLToken( rValue, XML_TABLE_COLUMN ) )
+ nFamily = XML_STYLE_FAMILY_TABLE_COLUMN;
+ else if( IsXMLToken( rValue, XML_TABLE_ROW ) )
+ nFamily = XML_STYLE_FAMILY_TABLE_ROW;
+ else if( IsXMLToken( rValue, XML_TABLE_CELL ) )
+ nFamily = XML_STYLE_FAMILY_TABLE_CELL;
+ else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)))
+ {
+ nFamily = XML_STYLE_FAMILY_SD_GRAPHICS_ID;
+ }
+ else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_NAME)))
+ {
+ nFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID;
+ }
+ else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_POOL_NAME)))
+ {
+ nFamily = XML_STYLE_FAMILY_SD_POOL_ID;
+ }
+ else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_DRAWINGPAGE_NAME)))
+ {
+ nFamily = XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID;
+ }
+ else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( XML_STYLE_FAMILY_SCH_CHART_NAME )))
+ {
+ nFamily = XML_STYLE_FAMILY_SCH_CHART_ID;
+ }
+ else if ( IsXMLToken( rValue, XML_RUBY ) )
+ {
+ nFamily = XML_STYLE_FAMILY_TEXT_RUBY;
+ }
+
+ return nFamily;
+}
+
+UniReference < SvXMLImportPropertyMapper > SvXMLStylesContext::GetImportPropertyMapper(
+ sal_uInt16 nFamily ) const
+{
+ UniReference < SvXMLImportPropertyMapper > xMapper;
+
+ switch( nFamily )
+ {
+ case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
+ if( !mxParaImpPropMapper.is() )
+ {
+ SvXMLStylesContext * pThis = (SvXMLStylesContext *)this;
+ pThis->mxParaImpPropMapper =
+ pThis->GetImport().GetTextImport()
+ ->GetParaImportPropertySetMapper();
+ }
+ xMapper = mxParaImpPropMapper;
+ break;
+ case XML_STYLE_FAMILY_TEXT_TEXT:
+ if( !mxTextImpPropMapper.is() )
+ {
+ SvXMLStylesContext * pThis = (SvXMLStylesContext *)this;
+ pThis->mxTextImpPropMapper =
+ pThis->GetImport().GetTextImport()
+ ->GetTextImportPropertySetMapper();
+ }
+ xMapper = mxTextImpPropMapper;
+ break;
+
+ case XML_STYLE_FAMILY_TEXT_SECTION:
+ // don't cache section mapper, as it's rarely used
+ // *sigh*, cast to non-const, because this is a const method,
+ // but SvXMLImport::GetTextImport() isn't.
+ xMapper = ((SvXMLStylesContext*)this)->GetImport().GetTextImport()->
+ GetSectionImportPropertySetMapper();
+ break;
+
+ case XML_STYLE_FAMILY_TEXT_RUBY:
+ // don't cache section mapper, as it's rarely used
+ // *sigh*, cast to non-const, because this is a const method,
+ // but SvXMLImport::GetTextImport() isn't.
+ xMapper = ((SvXMLStylesContext*)this)->GetImport().GetTextImport()->
+ GetRubyImportPropertySetMapper();
+ break;
+
+ case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
+ case XML_STYLE_FAMILY_SD_PRESENTATION_ID:
+ case XML_STYLE_FAMILY_SD_POOL_ID:
+ if(!mxShapeImpPropMapper.is())
+ {
+ UniReference< XMLShapeImportHelper > aImpHelper = ((SvXMLImport&)GetImport()).GetShapeImport();
+ ((SvXMLStylesContext*)this)->mxShapeImpPropMapper =
+ aImpHelper->GetPropertySetMapper();
+ }
+ xMapper = mxShapeImpPropMapper;
+ break;
+ case XML_STYLE_FAMILY_SCH_CHART_ID:
+ if( ! mxChartImpPropMapper.is() )
+ {
+ XMLPropertySetMapper *pPropMapper = new XMLChartPropertySetMapper();
+ mxChartImpPropMapper = new XMLChartImportPropertyMapper( pPropMapper, GetImport() );
+ }
+ xMapper = mxChartImpPropMapper;
+ break;
+ case XML_STYLE_FAMILY_PAGE_MASTER:
+ if( ! mxPageImpPropMapper.is() )
+ {
+ XMLPropertySetMapper *pPropMapper =
+ new XMLPageMasterPropSetMapper();
+ mxPageImpPropMapper =
+ new PageMasterImportPropertyMapper( pPropMapper,
+ ((SvXMLStylesContext*)this)->GetImport() );
+ }
+ xMapper = mxPageImpPropMapper;
+ break;
+ }
+
+ return xMapper;
+}
+
+Reference < XAutoStyleFamily > SvXMLStylesContext::GetAutoStyles( sal_uInt16 nFamily ) const
+{
+ Reference < XAutoStyleFamily > xAutoStyles;
+ if( XML_STYLE_FAMILY_TEXT_TEXT == nFamily || XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily)
+ {
+ bool bPara = XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily;
+ OUString sName;
+ if( !bPara && mxTextAutoStyles.is() )
+ xAutoStyles = mxTextAutoStyles;
+ else if( bPara && mxParaAutoStyles.is() )
+ xAutoStyles = mxParaAutoStyles;
+ else
+ {
+ sName = bPara ?
+ OUString( RTL_CONSTASCII_USTRINGPARAM( "ParagraphStyles" ) ):
+ OUString( RTL_CONSTASCII_USTRINGPARAM( "CharacterStyles" ) );
+ Reference< XAutoStylesSupplier > xAutoStylesSupp( GetImport().GetModel(), UNO_QUERY );
+ Reference< XAutoStyles > xAutoStyleFamilies = xAutoStylesSupp->getAutoStyles();
+ if (xAutoStyleFamilies->hasByName(sName))
+ {
+ Any aAny = xAutoStyleFamilies->getByName( sName );
+ xAutoStyles = *(Reference<XAutoStyleFamily>*)aAny.getValue();
+ if( bPara )
+ ((SvXMLStylesContext *)this)->mxParaAutoStyles = xAutoStyles;
+ else
+ ((SvXMLStylesContext *)this)->mxTextAutoStyles = xAutoStyles;
+ }
+ }
+ }
+ return xAutoStyles;
+}
+
+Reference < XNameContainer > SvXMLStylesContext::GetStylesContainer(
+ sal_uInt16 nFamily ) const
+{
+ Reference < XNameContainer > xStyles;
+ OUString sName;
+ switch( nFamily )
+ {
+ case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
+ if( mxParaStyles.is() )
+ xStyles = mxParaStyles;
+ else
+ sName =
+ OUString( RTL_CONSTASCII_USTRINGPARAM( "ParagraphStyles" ) );
+ break;
+
+ case XML_STYLE_FAMILY_TEXT_TEXT:
+ if( mxTextStyles.is() )
+ xStyles = mxTextStyles;
+ else
+ sName =
+ OUString( RTL_CONSTASCII_USTRINGPARAM( "CharacterStyles" ) );
+ break;
+ }
+ if( !xStyles.is() && sName.getLength() )
+ {
+ Reference< XStyleFamiliesSupplier > xFamiliesSupp(
+ GetImport().GetModel(), UNO_QUERY );
+ if ( xFamiliesSupp.is() )
+ {
+ Reference< XNameAccess > xFamilies = xFamiliesSupp->getStyleFamilies();
+ if (xFamilies->hasByName(sName))
+ {
+ xStyles.set(xFamilies->getByName( sName ),uno::UNO_QUERY);
+
+ switch( nFamily )
+ {
+ case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
+ ((SvXMLStylesContext *)this)->mxParaStyles = xStyles;
+ break;
+
+ case XML_STYLE_FAMILY_TEXT_TEXT:
+ ((SvXMLStylesContext *)this)->mxTextStyles = xStyles;
+ break;
+ }
+ }
+ }
+ }
+
+ return xStyles;
+}
+
+OUString SvXMLStylesContext::GetServiceName( sal_uInt16 nFamily ) const
+{
+ String sServiceName;
+ switch( nFamily )
+ {
+ case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
+ sServiceName = msParaStyleServiceName;
+ break;
+ case XML_STYLE_FAMILY_TEXT_TEXT:
+ sServiceName = msTextStyleServiceName;
+ break;
+ }
+
+ return sServiceName;
+}
+
+
+SvXMLStylesContext::SvXMLStylesContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
+ const OUString& rLName,
+ const uno::Reference< xml::sax::XAttributeList > &, sal_Bool bAuto ) :
+ SvXMLImportContext( rImport, nPrfx, rLName ),
+ msParaStyleServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.ParagraphStyle" ) ),
+ msTextStyleServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.CharacterStyle" ) ),
+ mpImpl( new SvXMLStylesContext_Impl( bAuto ) ),
+ mpStyleStylesElemTokenMap( 0 )
+{
+}
+
+
+SvXMLStylesContext::~SvXMLStylesContext()
+{
+ delete mpStyleStylesElemTokenMap;
+ delete mpImpl;
+}
+
+SvXMLImportContext *SvXMLStylesContext::CreateChildContext( sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList > & xAttrList )
+{
+ SvXMLImportContext *pContext = 0;
+
+ SvXMLStyleContext *pStyle =
+ CreateStyleChildContext( nPrefix, rLocalName, xAttrList );
+ if( pStyle )
+ {
+ if( !pStyle->IsTransient() )
+ mpImpl->AddStyle( pStyle );
+ pContext = pStyle;
+ }
+ else
+ {
+ pContext = new SvXMLImportContext( GetImport(), nPrefix,
+ rLocalName );
+ }
+
+ return pContext;
+}
+
+void SvXMLStylesContext::EndElement()
+{
+}
+
+void SvXMLStylesContext::AddStyle(SvXMLStyleContext& rNew)
+{
+ mpImpl->AddStyle( &rNew );
+}
+
+void SvXMLStylesContext::Clear()
+{
+ mpImpl->Clear();
+}
+
+void SvXMLStylesContext::CopyAutoStylesToDoc()
+{
+ sal_uInt32 nCount = GetStyleCount();
+ sal_uInt32 i;
+ for( i = 0; i < nCount; i++ )
+ {
+ SvXMLStyleContext *pStyle = GetStyle( i );
+ if( !pStyle || ( pStyle->GetFamily() != XML_STYLE_FAMILY_TEXT_TEXT &&
+ pStyle->GetFamily() != XML_STYLE_FAMILY_TEXT_PARAGRAPH &&
+ pStyle->GetFamily() != XML_STYLE_FAMILY_TABLE_CELL ) )
+ continue;
+ pStyle->CreateAndInsert( sal_False );
+ }
+}
+
+void SvXMLStylesContext::CopyStylesToDoc( sal_Bool bOverwrite,
+ sal_Bool bFinish )
+{
+ // pass 1: create text, paragraph and frame styles
+ sal_uInt32 nCount = GetStyleCount();
+ sal_uInt32 i;
+
+ for( i = 0; i < nCount; i++ )
+ {
+ SvXMLStyleContext *pStyle = GetStyle( i );
+ if( !pStyle )
+ continue;
+
+ if (pStyle->IsDefaultStyle())
+ pStyle->SetDefaults();
+ else if( InsertStyleFamily( pStyle->GetFamily() ) )
+ pStyle->CreateAndInsert( bOverwrite );
+ }
+
+ // pass 2: create list styles (they require char styles)
+ for( i=0; i<nCount; i++ )
+ {
+ SvXMLStyleContext *pStyle = GetStyle( i );
+ if( !pStyle || pStyle->IsDefaultStyle())
+ continue;
+
+ if( InsertStyleFamily( pStyle->GetFamily() ) )
+ pStyle->CreateAndInsertLate( bOverwrite );
+ }
+
+ // pass3: finish creation of styles
+ if( bFinish )
+ FinishStyles( bOverwrite );
+}
+
+void SvXMLStylesContext::FinishStyles( sal_Bool bOverwrite )
+{
+ sal_uInt32 nCount = GetStyleCount();
+ for( sal_uInt32 i=0; i<nCount; i++ )
+ {
+ SvXMLStyleContext *pStyle = GetStyle( i );
+ if( !pStyle || !pStyle->IsValid() || pStyle->IsDefaultStyle() )
+ continue;
+
+ if( InsertStyleFamily( pStyle->GetFamily() ) )
+ pStyle->Finish( bOverwrite );
+ }
+}
+
+
+const SvXMLStyleContext *SvXMLStylesContext::FindStyleChildContext(
+ sal_uInt16 nFamily,
+ const OUString& rName,
+ sal_Bool bCreateIndex ) const
+{
+ return mpImpl->FindStyleChildContext( nFamily, rName, bCreateIndex );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */