summaryrefslogtreecommitdiff
path: root/sw/source/filter/xml/xmlfmt.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/xml/xmlfmt.cxx')
-rw-r--r--sw/source/filter/xml/xmlfmt.cxx1814
1 files changed, 1814 insertions, 0 deletions
diff --git a/sw/source/filter/xml/xmlfmt.cxx b/sw/source/filter/xml/xmlfmt.cxx
new file mode 100644
index 000000000000..2a8d964c4d72
--- /dev/null
+++ b/sw/source/filter/xml/xmlfmt.cxx
@@ -0,0 +1,1814 @@
+/*************************************************************************
+ *
+ * $RCSfile: xmlfmt.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifdef PRECOMPILED
+#include "filt_pch.hxx"
+#endif
+
+#pragma hdrstop
+
+#ifndef _RTL_USTRBUF_HXX_
+#include <rtl/ustrbuf.hxx>
+#endif
+
+#ifndef _URLOBJ_HXX
+#include <tools/urlobj.hxx>
+#endif
+
+#ifndef _SVSTDARR_STRINGSSORT_DECL
+#define _SVSTDARR_STRINGSSORT
+#include <svtools/svstdarr.hxx>
+#endif
+
+#ifndef _XMLOFF_NMSPMAP_HXX
+#include <xmloff/nmspmap.hxx>
+#endif
+
+#ifndef _FORMAT_HXX //autogen wg. SwFmt
+#include <format.hxx>
+#endif
+#ifndef _FMTCOL_HXX //autogen wg. SwTxtFmtColl
+#include <fmtcol.hxx>
+#endif
+#ifndef _HINTS_HXX //autogen wg. SwFmtChg
+#include <hints.hxx>
+#endif
+
+#ifndef _POOLFMT_HXX //autogen wg. RES_POOL_CHRFMT_TYPE
+#include <poolfmt.hxx>
+#endif
+#ifndef _CHARFMT_HXX //autogen wg. SwCharFmt
+#include <charfmt.hxx>
+#endif
+#ifndef _FRMFMT_HXX //autogen wg. SwFrmFmt
+#include <frmfmt.hxx>
+#endif
+#ifndef _PARATR_HXX
+#include <paratr.hxx>
+#endif
+
+#ifndef _DOC_HXX //autogen wg. SwDoc
+#include <doc.hxx>
+#endif
+#include "docary.hxx"
+#ifndef _UNOSTYLE_HXX
+#include "unostyle.hxx"
+#endif
+
+#ifndef _XMLOFF_XMLNMSPE_HXX
+#include <xmloff/xmlnmspe.hxx>
+#endif
+#ifndef _XMLOFF_I18NMAP_HXX
+#include <xmloff/i18nmap.hxx>
+#endif
+#ifndef _XMLOFF_XMLTKMAP_HXX
+#include <xmloff/xmltkmap.hxx>
+#endif
+#ifndef _XMLOFF_XMLITEM_HXX
+#include <xmloff/xmlitem.hxx>
+#endif
+#ifndef _XMLOFF_XMLSTYLE_HXX
+#include <xmloff/xmlstyle.hxx>
+#endif
+#ifndef _XMLOFF_XMLKYWD_HXX
+#include <xmloff/xmlkywd.hxx>
+#endif
+#ifndef _XMLOFF_TXTSTYLI_HXX
+#include <xmloff/txtstyli.hxx>
+#endif
+#ifndef _XMLOFF_TXTIMP_HXX
+#include <xmloff/txtimp.hxx>
+#endif
+#ifndef _XMLOFF_FAMILIES_HXX
+#include <xmloff/families.hxx>
+#endif
+
+#ifndef _NUMRULE_HXX
+#include <numrule.hxx>
+#endif
+#ifndef _XMLIMP_HXX
+#include "xmlimp.hxx"
+#endif
+#ifndef _XMLNUM_HXX
+#include "xmlnum.hxx"
+#endif
+#ifndef _XMLTBLI_HXX
+#include "xmltbli.hxx"
+#endif
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::style;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::rtl;
+
+class SwXMLConditionParser_Impl
+{
+ OUString sInput;
+
+ sal_uInt32 nCondition;
+ sal_uInt32 nSubCondition;
+
+ sal_Int32 nPos;
+ sal_Int32 nLength;
+
+ inline sal_Bool SkipWS();
+ inline sal_Bool MatchChar( sal_Unicode c );
+ inline sal_Bool MatchName( OUString& rName );
+ inline sal_Bool MatchNumber( sal_uInt32& rNumber );
+
+public:
+
+ SwXMLConditionParser_Impl( const OUString& rInp );
+
+ sal_Bool IsValid() const { return 0 != nCondition; }
+
+ sal_uInt32 GetCondition() const { return nCondition; }
+ sal_uInt32 GetSubCondition() const { return nSubCondition; }
+};
+
+inline sal_Bool SwXMLConditionParser_Impl::SkipWS()
+{
+ while( nPos < nLength && ' ' == sInput[nPos] )
+ nPos++;
+ return sal_True;
+}
+
+inline sal_Bool SwXMLConditionParser_Impl::MatchChar( sal_Unicode c )
+{
+ sal_Bool bRet = sal_False;
+ if( nPos < nLength && c == sInput[nPos] )
+ {
+ nPos++;
+ bRet = sal_True;
+ }
+ return bRet;
+}
+
+inline sal_Bool SwXMLConditionParser_Impl::MatchName( OUString& rName )
+{
+ OUStringBuffer sBuffer( nLength );
+ while( nPos < nLength &&
+ ( ('a' <= sInput[nPos] && sInput[nPos] <= 'z') ||
+ '-' == sInput[nPos] ) )
+ {
+ sBuffer.append( sInput[nPos] );
+ nPos++;
+ }
+ rName = sBuffer.makeStringAndClear();
+ return rName.getLength() > 0;
+}
+
+inline sal_Bool SwXMLConditionParser_Impl::MatchNumber( sal_uInt32& rNumber )
+{
+ OUStringBuffer sBuffer( nLength );
+ while( nPos < nLength && '0' <= sInput[nPos] && sInput[nPos] <= '9' )
+ {
+ sBuffer.append( sInput[nPos] );
+ nPos++;
+ }
+
+ OUString sNum( sBuffer.makeStringAndClear() );
+ if( sNum.getLength() )
+ rNumber = sNum.toInt32();
+ return sNum.getLength() > 0;
+}
+
+SwXMLConditionParser_Impl::SwXMLConditionParser_Impl( const OUString& rInp ) :
+ sInput( rInp ),
+ nPos( 0 ),
+ nLength( rInp.getLength() ),
+ nCondition( 0 ),
+ nSubCondition( 0 )
+{
+ OUString sFunc;
+ sal_Bool bHasSub = sal_False;
+ sal_uInt32 nSub = 0;
+ sal_Bool bOK = SkipWS() && MatchName( sFunc ) && SkipWS() &&
+ MatchChar( '(' ) && SkipWS() && MatchChar( ')' ) && SkipWS();
+ if( bOK && MatchChar( '=' ) )
+ {
+ bOK = SkipWS() && MatchNumber( nSub ) && SkipWS();
+ bHasSub = sal_True;
+ }
+
+ bOK &= nPos == nLength;
+
+ if( bOK )
+ {
+ switch( sFunc[0] )
+ {
+ case 'e':
+ if( sFunc.compareToAscii( sXML_endnote ) == 0 && !bHasSub )
+ nCondition = PARA_IN_ENDNOTE;
+ break;
+
+ case 'f':
+ if( sFunc.compareToAscii( sXML_footer ) == 0 && !bHasSub )
+ nCondition = PARA_IN_FOOTER;
+ else if( sFunc.compareToAscii( sXML_table_header ) == 0 &&
+ !bHasSub )
+ nCondition = PARA_IN_FOOTENOTE;
+ break;
+
+ case 'h':
+ if( sFunc.compareToAscii( sXML_header ) == 0 && !bHasSub )
+ nCondition = PARA_IN_HEADER;
+ break;
+
+ case 'l':
+ if( sFunc.compareToAscii( sXML_list_level ) == 0 &&
+ nSub >=1 && nSub < MAXLEVEL )
+ {
+ nCondition = PARA_IN_LIST;
+ nSubCondition = nSub-1;
+ }
+ break;
+
+ case 'o':
+ if( sFunc.compareToAscii( sXML_outline_level ) == 0 &&
+ nSub >=1 && nSub < MAXLEVEL )
+ {
+ nCondition = PARA_IN_OUTLINE;
+ nSubCondition = nSub-1;
+ }
+ break;
+
+ case 's':
+ if( sFunc.compareToAscii( sXML_section ) == 0 && !bHasSub )
+ {
+ nCondition = PARA_IN_SECTION;
+ }
+ break;
+
+ case 't':
+ if( sFunc.compareToAscii( sXML_table ) == 0 && !bHasSub )
+ {
+ nCondition = PARA_IN_TABLEBODY;
+ }
+ else if( sFunc.compareToAscii( sXML_table_header ) == 0 &&
+ !bHasSub )
+ {
+ nCondition = PARA_IN_TABLEHEAD;
+ }
+ else if( sFunc.compareToAscii( sXML_text_box ) == 0 && !bHasSub )
+ {
+ nCondition = PARA_IN_FRAME;
+ }
+ break;
+ }
+ }
+}
+
+// ---------------------------------------------------------------------
+
+class SwXMLConditionContext_Impl : public SvXMLImportContext
+{
+ sal_uInt32 nCondition;
+ sal_uInt32 nSubCondition;
+
+ OUString sApplyStyle;
+
+ void ParseCondition( const OUString& rCond );
+
+public:
+
+ SwXMLConditionContext_Impl(
+ SvXMLImport& rImport, sal_uInt16 nPrfx,
+ const OUString& rLName,
+ const Reference< xml::sax::XAttributeList > & xAttrList );
+ virtual ~SwXMLConditionContext_Impl();
+
+ sal_Bool IsValid() const { return 0 != nCondition; }
+
+ sal_uInt32 GetCondition() const { return nCondition; }
+ sal_uInt32 GetSubCondition() const { return nSubCondition; }
+ const OUString& GetApplyStyle() const { return sApplyStyle; }
+};
+
+SwXMLConditionContext_Impl::SwXMLConditionContext_Impl(
+ SvXMLImport& rImport, sal_uInt16 nPrfx,
+ const OUString& rLName,
+ const Reference< xml::sax::XAttributeList > & xAttrList ) :
+ SvXMLImportContext( rImport, nPrfx, rLName ),
+ nCondition( 0 ),
+ nSubCondition( 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 );
+ const OUString& rValue = xAttrList->getValueByIndex( i );
+
+ // TODO: use a map here
+ if( XML_NAMESPACE_STYLE == nPrefix )
+ {
+ if( aLocalName.compareToAscii( sXML_condition ) == 0 )
+ {
+ SwXMLConditionParser_Impl aCondParser( rValue );
+ if( aCondParser.IsValid() )
+ {
+ nCondition = aCondParser.GetCondition();
+ nSubCondition = aCondParser.GetSubCondition();
+ }
+ }
+ else if( aLocalName.compareToAscii( sXML_apply_style_name ) == 0 )
+ {
+ sApplyStyle = rValue;
+ }
+ }
+ }
+}
+
+SwXMLConditionContext_Impl::~SwXMLConditionContext_Impl()
+{
+}
+
+// ---------------------------------------------------------------------
+
+typedef SwXMLConditionContext_Impl *SwXMLConditionContextPtr;
+SV_DECL_PTRARR( SwXMLConditions_Impl, SwXMLConditionContextPtr, 5, 2 );
+
+#ifndef XML_CORE_API
+
+class SwXMLTextStyleContext_Impl : public XMLTextStyleContext
+{
+ SwXMLConditions_Impl *pConditions;
+
+protected:
+
+ virtual Reference < XStyle > Create();
+
+public:
+
+ TYPEINFO();
+
+ SwXMLTextStyleContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx,
+ const OUString& rLName,
+ const Reference< xml::sax::XAttributeList > & xAttrList,
+ sal_uInt16 nFamily,
+ SvXMLStylesContext& rStyles );
+ virtual ~SwXMLTextStyleContext_Impl();
+
+ virtual SvXMLImportContext *CreateChildContext(
+ sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const Reference< xml::sax::XAttributeList > & xAttrList );
+
+ virtual void Finish( sal_Bool bOverwrite );
+};
+
+TYPEINIT1( SwXMLTextStyleContext_Impl, XMLTextStyleContext );
+
+Reference < XStyle > SwXMLTextStyleContext_Impl::Create()
+{
+ Reference < XStyle > xNewStyle;
+
+ if( pConditions && XML_STYLE_FAMILY_TEXT_PARAGRAPH == GetFamily() )
+ {
+ Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(),
+ UNO_QUERY );
+ if( xFactory.is() )
+ {
+ OUString sServiceName( RTL_CONSTASCII_USTRINGPARAM(
+ "com.sun.star.style.ConditionalParagraphStyle" ) );
+ Reference < XInterface > xIfc =
+ xFactory->createInstance( sServiceName );
+ if( xIfc.is() )
+ xNewStyle = Reference < XStyle >( xIfc, UNO_QUERY );
+ }
+ }
+ else
+ {
+ xNewStyle = XMLTextStyleContext::Create();
+ }
+
+ return xNewStyle;
+}
+
+SwXMLTextStyleContext_Impl::SwXMLTextStyleContext_Impl( SwXMLImport& rImport,
+ sal_uInt16 nPrfx, const OUString& rLName,
+ const Reference< xml::sax::XAttributeList > & xAttrList,
+ sal_uInt16 nFamily,
+ SvXMLStylesContext& rStyles ) :
+ XMLTextStyleContext( rImport, nPrfx, rLName, xAttrList, rStyles ),
+ pConditions( 0 )
+{
+ SetFamily( nFamily );
+}
+
+SwXMLTextStyleContext_Impl::~SwXMLTextStyleContext_Impl()
+{
+ if( pConditions )
+ {
+ while( pConditions->Count() )
+ {
+ SwXMLConditionContext_Impl *pCond = pConditions->GetObject(0);
+ pConditions->Remove( 0UL );
+ pCond->ReleaseRef();
+ }
+ delete pConditions;
+ }
+}
+
+SvXMLImportContext *SwXMLTextStyleContext_Impl::CreateChildContext(
+ sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const Reference< xml::sax::XAttributeList > & xAttrList )
+{
+ SvXMLImportContext *pContext = 0;
+
+ if( XML_NAMESPACE_STYLE == nPrefix &&
+ rLocalName.compareToAscii( sXML_map ) == 0 )
+ {
+ SwXMLConditionContext_Impl *pCond =
+ new SwXMLConditionContext_Impl( GetImport(), nPrefix,
+ rLocalName, xAttrList );
+ if( pCond->IsValid() )
+ {
+ if( !pConditions )
+ pConditions = new SwXMLConditions_Impl;
+ pConditions->Insert( pCond, pConditions->Count() );
+ pCond->AddRef();
+ }
+ pContext = pCond;
+ }
+
+ if( !pContext )
+ pContext = XMLTextStyleContext::CreateChildContext( nPrefix, rLocalName,
+ xAttrList );
+
+ return pContext;
+}
+
+void SwXMLTextStyleContext_Impl::Finish( sal_Bool bOverwrite )
+{
+ XMLTextStyleContext::Finish( bOverwrite );
+
+ if( !pConditions || XML_STYLE_FAMILY_TEXT_PARAGRAPH != GetFamily() )
+ return;
+
+ Reference < XStyle > xStyle = GetStyle();
+ if( !xStyle.is() )
+ return;
+
+ const SwXStyle* pStyle = 0;
+ Reference<XUnoTunnel> xStyleTunnel( xStyle, UNO_QUERY);
+ if( xStyleTunnel.is() )
+ {
+ pStyle = (SwXStyle*)xStyleTunnel->getSomething(
+ SwXStyle::getUnoTunnelId() );
+ }
+ if( !pStyle )
+ return;
+
+ SwDoc& rDoc = ((SwXMLImport&)GetImport()).GetDoc();
+
+ const OUString& rName =
+ SwXStyleFamilies::GetUIName( GetName(), SFX_STYLE_FAMILY_PARA );
+ SwTxtFmtColl *pColl = rDoc.FindTxtFmtCollByName( rName );
+ ASSERT( pColl, "Text collection not found" );
+ if( !pColl || RES_CONDTXTFMTCOLL != pColl->Which() )
+ return;
+
+ sal_uInt16 nCount = pConditions->Count();
+ for( sal_uInt16 i = 0; i < nCount; i++ )
+ {
+ const SwXMLConditionContext_Impl *pCond = (*pConditions)[i];
+ const OUString& rName =
+ SwXStyleFamilies::GetUIName( pCond->GetApplyStyle(),
+ SFX_STYLE_FAMILY_PARA );
+ SwTxtFmtColl* pCondColl = rDoc.FindTxtFmtCollByName( rName );
+ ASSERT( pCondColl,
+ "SwXMLItemSetStyleContext_Impl::ConnectConditions: cond coll missing" );
+ if( pCondColl )
+ {
+ SwCollCondition aCond( pCondColl, pCond->GetCondition(),
+ pCond->GetSubCondition() );
+ ((SwConditionTxtFmtColl*)pColl)->InsertCondition( aCond );
+ }
+ }
+}
+#endif
+
+// ---------------------------------------------------------------------
+
+class SwXMLItemSetStyleContext_Impl : public SvXMLStyleContext
+{
+#ifdef XML_CORE_API
+ OUString sListStyleName;
+ SwFmt *pFmt;
+#endif
+ SfxItemSet *pItemSet;
+
+#ifdef XML_CORE_API
+ SwXMLConditions_Impl *pConditions;
+
+ sal_uInt16 nPoolId; // PoolId
+ sal_Bool bAutoUpdate;
+#endif
+
+ SvXMLImportContext *CreateItemSetContext(
+ sal_uInt16 nPrefix,
+ const OUString& rLName,
+ const Reference< xml::sax::XAttributeList > & xAttrList);
+
+protected:
+
+#ifdef XML_CORE_API
+ virtual void SetAttribute( sal_uInt16 nPrefixKey,
+ const OUString& rLocalName,
+ const OUString& rValue );
+#endif
+
+ const SwXMLImport& GetSwImport() const
+ { return (const SwXMLImport&)GetImport(); }
+ SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
+
+public:
+
+ TYPEINFO();
+
+ SwXMLItemSetStyleContext_Impl(
+ SwXMLImport& rImport, sal_uInt16 nPrfx,
+ const OUString& rLName,
+ const Reference< xml::sax::XAttributeList > & xAttrList
+#ifndef XML_CORE_API
+ ,sal_uInt16 nFamily
+#endif
+ );
+ virtual ~SwXMLItemSetStyleContext_Impl();
+
+ virtual SvXMLImportContext *CreateChildContext(
+ sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const Reference< xml::sax::XAttributeList > & xAttrList );
+
+#ifdef XML_CORE_API
+ sal_uInt16 GetPoolId() const { return nPoolId; }
+ sal_Bool IsAutoUpdate() const { return bAutoUpdate; }
+#endif
+
+ // The item set may be empty!
+ SfxItemSet *GetItemSet() { return pItemSet; }
+ const SfxItemSet *GetItemSet() const { return pItemSet; }
+
+#ifdef XML_CORE_API
+ SwFmt *GetFmt() { return pFmt; }
+ void SetFmt( SwFmt *p ) { pFmt = p; }
+
+ SwTxtFmtColl* GetColl();
+
+ sal_Bool HasConditions() const { return 0 != pConditions &&
+ pConditions->Count() > 0; }
+ const OUString& GetListStyle() const { return sListStyleName; }
+
+ void ConnectParent();
+ void ConnectFollow();
+ void ConnectConditions();
+ void ConnectListStyle();
+ void ConnectAutoListStyle();
+#endif
+};
+
+#ifdef XML_CORE_API
+void SwXMLItemSetStyleContext_Impl::SetAttribute( sal_uInt16 nPrefixKey,
+ const OUString& rLocalName,
+ const OUString& rValue )
+{
+ // TODO: use a map here
+ if( XML_NAMESPACE_STYLE == nPrefixKey )
+ {
+ if( rLocalName.compareToAscii( sXML_family ) == 0 )
+ {
+ SfxStyleFamily eFamily = SFX_STYLE_FAMILY_ALL;
+ sal_uInt16 nSubFamily = 0U;
+ if( rValue.compareToAscii( sXML_paragraph ) == 0 )
+ {
+ eFamily = SFX_STYLE_FAMILY_PARA;
+ }
+ else if( rValue.compareToAscii( sXML_text ) == 0 )
+ {
+ eFamily = SFX_STYLE_FAMILY_CHAR;
+ }
+ else if( 0 == rValue.compareToAscii( sXML_table, 5L ) )
+ {
+ eFamily = SFX_STYLE_FAMILY_FRAME;
+ if( 5L == rValue.getLength() )
+ nSubFamily = SW_STYLE_SUBFAMILY_TABLE;
+ else if( rValue.compareToAscii( sXML_table_column ) == 0 )
+ nSubFamily = SW_STYLE_SUBFAMILY_TABLE_COL;
+ else if( rValue.compareToAscii( sXML_table_row ) == 0 )
+ nSubFamily = SW_STYLE_SUBFAMILY_TABLE_LINE;
+ else if( rValue.compareToAscii( sXML_table_cell ) == 0 )
+ nSubFamily = SW_STYLE_SUBFAMILY_TABLE_BOX;
+ else
+ eFamily = SFX_STYLE_FAMILY_ALL;
+ }
+
+ if( SFX_STYLE_FAMILY_ALL != eFamily )
+ {
+ SetFamily( eFamily );
+ SetSubFamily( nSubFamily );
+ }
+ }
+ else if( rLocalName.compareToAscii( sXML_pool_id ) == 0 )
+ {
+ sal_Int32 nTmp = rValue.toInt32();
+ nPoolId =
+ (nTmp < 0L) ? 0U : ( (nTmp > USHRT_MAX) ? USHRT_MAX
+ : (sal_uInt16)nTmp );
+ }
+ else if( rLocalName.compareToAscii( sXML_auto_update ) == 0 )
+ {
+ if( rValue.compareToAscii( sXML_true ) == 0 )
+ bAutoUpdate = sal_True;
+ }
+ else if( rLocalName.compareToAscii( sXML_list_style_name ) == 0 )
+ {
+ sListStyleName = rValue;
+ }
+ else
+ {
+ SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
+ }
+ }
+ else
+ {
+ SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
+ }
+}
+#endif
+
+SvXMLImportContext *SwXMLItemSetStyleContext_Impl::CreateItemSetContext(
+ sal_uInt16 nPrefix, const OUString& rLName,
+ const Reference< xml::sax::XAttributeList > & xAttrList )
+{
+ ASSERT( !pItemSet,
+ "SwXMLItemSetStyleContext_Impl::CreateItemSetContext: item set exists" );
+
+ SvXMLImportContext *pContext = 0;
+ SfxItemPool& rItemPool = GetSwImport().GetDoc().GetAttrPool();
+
+#ifdef XML_CORE_API
+ switch( GetFamily() )
+ {
+ case SFX_STYLE_FAMILY_PARA:
+ pItemSet = new SfxItemSet( rItemPool, aTxtFmtCollSetRange );
+ pContext = GetSwImport().CreateParaItemImportContext(
+ nPrefix, rLName, xAttrList, *pItemSet );
+ break;
+
+ case SFX_STYLE_FAMILY_CHAR:
+ pItemSet = new SfxItemSet( rItemPool, aCharFmtSetRange );
+ pContext = GetSwImport().CreateParaItemImportContext(
+ nPrefix, rLName, xAttrList, *pItemSet );
+ break;
+
+ case SFX_STYLE_FAMILY_FRAME:
+ {
+ switch( GetSubFamily() )
+ {
+ case SW_STYLE_SUBFAMILY_TABLE:
+ pItemSet = new SfxItemSet( rItemPool, aTableSetRange );
+ break;
+ case SW_STYLE_SUBFAMILY_TABLE_COL:
+ pItemSet = new SfxItemSet( rItemPool, RES_FRM_SIZE,
+ RES_FRM_SIZE, 0 );
+ break;
+ case SW_STYLE_SUBFAMILY_TABLE_LINE:
+ pItemSet = new SfxItemSet( rItemPool, aTableLineSetRange );
+ break;
+ case SW_STYLE_SUBFAMILY_TABLE_BOX:
+ pItemSet = new SfxItemSet( rItemPool, aTableBoxSetRange );
+ break;
+ }
+ if( pItemSet )
+ pContext = GetSwImport().CreateTableItemImportContext(
+ nPrefix, rLName, xAttrList, GetSubFamily(),
+ *pItemSet );
+ ASSERT( pItemSet,
+ "SwXMLItemSetStyleContext_Impl::CreateItemSetContext: frames are unsopprted");
+ }
+ break;
+
+ default:
+ ASSERT( !this,
+ "SwXMLItemSetStyleContext_Impl::CreateItemSetContext: unknown family" );
+ break;
+ }
+#else
+ switch( GetFamily() )
+ {
+ case XML_STYLE_FAMILY_TABLE_TABLE:
+ pItemSet = new SfxItemSet( rItemPool, aTableSetRange );
+ break;
+ case XML_STYLE_FAMILY_TABLE_COLUMN:
+ pItemSet = new SfxItemSet( rItemPool, RES_FRM_SIZE, RES_FRM_SIZE, 0 );
+ break;
+ case XML_STYLE_FAMILY_TABLE_ROW:
+ pItemSet = new SfxItemSet( rItemPool, aTableLineSetRange );
+ break;
+ case XML_STYLE_FAMILY_TABLE_CELL:
+ pItemSet = new SfxItemSet( rItemPool, aTableBoxSetRange );
+ break;
+ default:
+ ASSERT( !this,
+ "SwXMLItemSetStyleContext_Impl::CreateItemSetContext: unknown family" );
+ break;
+ }
+ if( pItemSet )
+ pContext = GetSwImport().CreateTableItemImportContext(
+ nPrefix, rLName, xAttrList, GetFamily(),
+ *pItemSet );
+#endif
+
+ if( !pContext )
+ {
+ delete pItemSet;
+ pItemSet = 0;
+ }
+
+ return pContext;
+}
+
+TYPEINIT1( SwXMLItemSetStyleContext_Impl, SvXMLStyleContext );
+
+SwXMLItemSetStyleContext_Impl::SwXMLItemSetStyleContext_Impl( SwXMLImport& rImport,
+ sal_uInt16 nPrfx, const OUString& rLName,
+ const Reference< xml::sax::XAttributeList > & xAttrList
+#ifndef XML_CORE_API
+ ,sal_uInt16 nFamily
+#endif
+ ) :
+ SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList ),
+#ifdef XML_CORE_API
+ nPoolId( USHRT_MAX ),
+ bAutoUpdate( sal_False ),
+ pFmt( 0 ),
+ pConditions( 0 ),
+#endif
+ pItemSet( 0 )
+{
+#ifndef XML_CORE_API
+ SetFamily( nFamily );
+#endif
+}
+
+SwXMLItemSetStyleContext_Impl::~SwXMLItemSetStyleContext_Impl()
+{
+ delete pItemSet;
+#ifdef XML_CORE_API
+ if( pConditions )
+ {
+ while( pConditions->Count() )
+ {
+ SwXMLConditionContext_Impl *pCond = pConditions->GetObject(0);
+ pConditions->Remove( 0UL );
+ pCond->ReleaseRef();
+ }
+ delete pConditions;
+ }
+#endif
+}
+
+SvXMLImportContext *SwXMLItemSetStyleContext_Impl::CreateChildContext(
+ sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const Reference< xml::sax::XAttributeList > & xAttrList )
+{
+ SvXMLImportContext *pContext = 0;
+
+ if( XML_NAMESPACE_STYLE == nPrefix )
+ {
+ if( rLocalName.compareToAscii( sXML_properties ) == 0 )
+ {
+ pContext = CreateItemSetContext( nPrefix, rLocalName, xAttrList );
+ }
+#ifdef XML_CORE_API
+ else if( rLocalName.compareToAscii( sXML_map ) == 0 )
+ {
+ SwXMLConditionContext_Impl *pCond =
+ new SwXMLConditionContext_Impl( GetSwImport(), nPrefix,
+ rLocalName, xAttrList );
+ if( pCond->IsValid() )
+ {
+ if( !pConditions )
+ pConditions = new SwXMLConditions_Impl;
+ pConditions->Insert( pCond, pConditions->Count() );
+ pCond->AddRef();
+ }
+ pContext = pCond;
+ }
+#endif
+ }
+
+ if( !pContext )
+ pContext = SvXMLStyleContext::CreateChildContext( nPrefix, rLocalName,
+ xAttrList );
+
+ return pContext;
+}
+
+#ifdef XML_CORE_API
+SwTxtFmtColl* SwXMLItemSetStyleContext_Impl::GetColl()
+{
+ return (GetFamily() & SFX_STYLE_FAMILY_PARA) != 0
+ ? (SwTxtFmtColl*) pFmt
+ : NULL;
+}
+
+void SwXMLItemSetStyleContext_Impl::ConnectParent()
+{
+ if( !pFmt )
+ return;
+
+ SwDoc *pDoc = pFmt->GetDoc();
+ String aName( GetSwImport().GetI18NMap().Get( GetFamily(), GetParent() ) );
+
+// String aName( SwXStyleFamilies::GetUIName( GetParent(),
+// (SfxStyleFamily)GetFamily() ) );
+ SwFmt* pParent;
+ switch( GetFamily() )
+ {
+ case SFX_STYLE_FAMILY_PARA:
+ if( aName.Len() )
+ pParent = pDoc->FindTxtFmtCollByName( aName );
+ else
+ pParent = (*pDoc->GetTxtFmtColls())[ 0 ];
+ break;
+
+ case SFX_STYLE_FAMILY_FRAME:
+ if( aName.Len() )
+ pParent = pDoc->FindFrmFmtByName( aName );
+ else
+ pParent = (*pDoc->GetFrmFmts())[ 0 ];
+ break;
+
+ case SFX_STYLE_FAMILY_CHAR:
+ if( aName.Len() )
+ pParent = pDoc->FindCharFmtByName( aName );
+ else
+ pParent = (*pDoc->GetCharFmts())[ 0 ];
+ break;
+ }
+
+ if( pParent )
+ pFmt->SetDerivedFrom( pParent );
+}
+
+void SwXMLItemSetStyleContext_Impl::ConnectFollow()
+{
+ if( !pFmt || GetFamily() != SFX_STYLE_FAMILY_PARA )
+ return;
+
+ SwDoc *pDoc = pFmt->GetDoc();
+ String aName( GetSwImport().GetI18NMap().Get( GetFamily(), GetFollow() ) );
+// String aName( SwXStyleFamilies::GetUIName( GetFollow(), (SfxStyleFamily)GetFamily() ) );
+
+ SwTxtFmtColl* pFollow;
+ if( aName.Len() )
+ pFollow = pDoc->FindTxtFmtCollByName( aName );
+ else
+ pFollow = GetColl();
+ if( pFollow )
+ GetColl()->SetNextTxtFmtColl( *pFollow );
+}
+
+void SwXMLItemSetStyleContext_Impl::ConnectConditions()
+{
+ if( !pFmt || GetFamily() != SFX_STYLE_FAMILY_PARA || !pConditions ||
+ RES_CONDTXTFMTCOLL != pFmt->Which() )
+ return;
+
+ SwDoc *pDoc = pFmt->GetDoc();
+ SvI18NMap& rI18NMap = ((SwXMLImport&)GetImport()).GetI18NMap();
+
+ sal_uInt16 nCount = pConditions->Count();
+ for( sal_uInt16 i = 0; i < nCount; i++ )
+ {
+ const SwXMLConditionContext_Impl *pCond = (*pConditions)[i];
+ OUString sName( rI18NMap.Get( SFX_STYLE_FAMILY_PARA,
+ pCond->GetApplyStyle() ) );
+// OUString sName( SwXStyleFamilies::GetUIName(
+// pCond->GetApplyStyle(), SFX_STYLE_FAMILY_PARA ) );
+ SwTxtFmtColl* pCondColl = pDoc->FindTxtFmtCollByName( sName );
+ ASSERT( pCondColl,
+ "SwXMLItemSetStyleContext_Impl::ConnectConditions: cond coll missing" );
+ if( pCondColl )
+ {
+ SwCollCondition aCond( pCondColl, pCond->GetCondition(),
+ pCond->GetSubCondition() );
+ ((SwConditionTxtFmtColl*)pFmt)->InsertCondition( aCond );
+ }
+ }
+}
+
+void SwXMLItemSetStyleContext_Impl::ConnectListStyle()
+{
+ if( !pFmt || GetFamily() != SFX_STYLE_FAMILY_PARA ||
+ !GetListStyle().getLength() )
+ return;
+
+ SwDoc *pDoc = pFmt->GetDoc();
+ String aName( GetSwImport().GetI18NMap().Get( SFX_STYLE_FAMILY_PSEUDO,
+ GetListStyle() ) );
+// String aName( SwXStyleFamilies::GetUIName(
+// GetListStyle(), SFX_STYLE_FAMILY_PSEUDO ) );
+ // Styles must not reference automatic num rules
+ SwNumRule *pNumRule = pDoc->FindNumRulePtr( aName );
+ if( pNumRule && !pNumRule->IsAutoRule() )
+ GetColl()->SetAttr( SwNumRuleItem(aName) );
+}
+
+void SwXMLItemSetStyleContext_Impl::ConnectAutoListStyle()
+{
+ if( GetFamily() != SFX_STYLE_FAMILY_PARA || !GetListStyle().getLength() )
+ return;
+
+ SwDoc& rDoc = GetSwImport().GetDoc();
+ String aName( GetSwImport().GetI18NMap().Get( SFX_STYLE_FAMILY_PSEUDO,
+ GetListStyle() ) );
+// String aName( SwXStyleFamilies::GetUIName(
+// GetListStyle(), SFX_STYLE_FAMILY_PSEUDO ) );
+ if( rDoc.FindNumRulePtr( aName ) )
+ {
+ if( !pItemSet )
+ {
+ SfxItemPool& rItemPool = rDoc.GetAttrPool();
+ pItemSet = new SfxItemSet( rItemPool, aTxtFmtCollSetRange );
+ }
+ pItemSet->Put( SwNumRuleItem(aName) );
+ }
+}
+#endif
+
+// ---------------------------------------------------------------------
+
+#ifdef XML_CORE_API
+enum SwXMLStyleStylesElemTokens
+{
+ SW_XML_TOK_STYLE_STYLE,
+ SW_XML_TOK_TEXT_LIST_STYLE,
+ SW_XML_TOK_TEXT_OUTLINE,
+ SW_XML_TOK_STYLE_STYLES_ELEM_END=XML_TOK_UNKNOWN
+};
+
+static __FAR_DATA SvXMLTokenMapEntry aStyleStylesElemTokenMap[] =
+{
+ { XML_NAMESPACE_STYLE, sXML_style, SW_XML_TOK_STYLE_STYLE },
+ { XML_NAMESPACE_TEXT, sXML_list_style, SW_XML_TOK_TEXT_LIST_STYLE},
+ { XML_NAMESPACE_TEXT, sXML_outline_style, SW_XML_TOK_TEXT_OUTLINE },
+ XML_TOKEN_MAP_END
+};
+
+const SvXMLTokenMap& SwXMLImport::GetStyleStylesElemTokenMap()
+{
+ if( !pStyleStylesElemTokenMap )
+ pStyleStylesElemTokenMap =
+ new SvXMLTokenMap( aStyleStylesElemTokenMap );
+
+ return *pStyleStylesElemTokenMap;
+}
+#endif
+
+// ---------------------------------------------------------------------
+//
+class SwXMLStylesContext_Impl : public SvXMLStylesContext
+{
+ SwXMLItemSetStyleContext_Impl *GetSwStyle( sal_uInt16 i ) const;
+#ifdef XML_CORE_API
+ SwXMLListStyleContext *GetSwListStyle( sal_uInt16 i ) const;
+
+ SwFmt *FindFmtByName( const String& rName,
+ sal_uInt16 eFamily ) const;
+ SwXMLItemSetStyleContext_Impl *FindByPoolId( sal_uInt16 nPoolId ) const;
+#endif
+
+ SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
+ const SwXMLImport& GetSwImport() const
+ { return (const SwXMLImport&)GetImport(); }
+
+protected:
+
+#ifdef XML_CORE_API
+ // Create a style context.
+ virtual SvXMLStyleContext *CreateStyleChildContext(
+ sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const Reference< xml::sax::XAttributeList > & xAttrList );
+#else
+ virtual SvXMLStyleContext *CreateStyleStyleChildContext( sal_uInt16 nFamily,
+ sal_uInt16 nPrefix, const OUString& rLocalName,
+ const Reference< xml::sax::XAttributeList > & xAttrList );
+ // HACK
+ virtual UniReference < SvXMLImportPropertyMapper > GetImportPropertyMapper(
+ sal_uInt16 nFamily ) const;
+
+ virtual ::com::sun::star::uno::Reference <
+ ::com::sun::star::container::XNameContainer >
+ GetStylesContainer( sal_uInt16 nFamily ) const;
+ virtual ::rtl::OUString GetServiceName( sal_uInt16 nFamily ) const;
+ // HACK
+#endif
+
+public:
+
+ TYPEINFO();
+
+ SwXMLStylesContext_Impl(
+ SwXMLImport& rImport, sal_uInt16 nPrfx,
+ const OUString& rLName ,
+ const Reference< xml::sax::XAttributeList > & xAttrList );
+ virtual ~SwXMLStylesContext_Impl();
+
+ virtual sal_Bool InsertStyleFamily( sal_uInt16 nFamily ) const;
+#ifdef XML_CORE_API
+ void CopyStylesToDoc();
+ void CopyAutoStylesToDoc();
+#endif
+};
+
+TYPEINIT1( SwXMLStylesContext_Impl, SvXMLStylesContext );
+
+inline SwXMLItemSetStyleContext_Impl *SwXMLStylesContext_Impl::GetSwStyle(
+ sal_uInt16 i ) const
+{
+ return PTR_CAST( SwXMLItemSetStyleContext_Impl, GetStyle( i ) );
+}
+
+#ifdef XML_CORE_API
+inline SwXMLListStyleContext *SwXMLStylesContext_Impl::GetSwListStyle(
+ sal_uInt16 i ) const
+{
+ return PTR_CAST( SwXMLListStyleContext, GetStyle( i ) );
+}
+
+sal_Bool lcl_xmlfmt_isValidPoolId( sal_uInt16 nPoolId, sal_uInt16 eFamily )
+{
+ sal_Bool bValid = sal_False;
+
+ // check if pool id is valid
+ if( eFamily & SFX_STYLE_FAMILY_CHAR )
+ {
+ bValid = (RES_POOLCHR_NORMAL_BEGIN <= nPoolId &&
+ nPoolId < RES_POOLCHR_NORMAL_END) ||
+ (RES_POOLCHR_HTML_BEGIN <= nPoolId &&
+ nPoolId < RES_POOLCHR_HTML_END);
+ }
+ else if( eFamily & SFX_STYLE_FAMILY_FRAME )
+ {
+ bValid = RES_POOLFRM_BEGIN <= nPoolId && nPoolId < RES_POOLFRM_END;
+ }
+ else if( eFamily & SFX_STYLE_FAMILY_PARA )
+ {
+ bValid = (RES_POOLCOLL_TEXT_BEGIN <= nPoolId &&
+ nPoolId < RES_POOLCOLL_TEXT_END) ||
+ (RES_POOLCOLL_LISTS_BEGIN <= nPoolId &&
+ nPoolId < RES_POOLCOLL_LISTS_END) ||
+ (RES_POOLCOLL_EXTRA_BEGIN <= nPoolId &&
+ nPoolId < RES_POOLCOLL_EXTRA_END) ||
+ (RES_POOLCOLL_REGISTER_BEGIN <= nPoolId &&
+ nPoolId < RES_POOLCOLL_REGISTER_END) ||
+ (RES_POOLCOLL_DOC_BEGIN <= nPoolId &&
+ nPoolId < RES_POOLCOLL_DOC_END) ||
+ (RES_POOLCOLL_HTML_BEGIN <= nPoolId &&
+ nPoolId < RES_POOLCOLL_HTML_END);
+ }
+
+ return bValid;
+}
+
+SwFmt *SwXMLStylesContext_Impl::FindFmtByName( const String& rName,
+ sal_uInt16 eFamily ) const
+{
+ const SwDoc& rDoc = GetSwImport().GetDoc();
+ SwFmt *pFmt = 0;
+ switch( eFamily )
+ {
+ case SFX_STYLE_FAMILY_PARA:
+ pFmt = rDoc.FindTxtFmtCollByName( rName );
+ break;
+ case SFX_STYLE_FAMILY_FRAME:
+ pFmt = rDoc.FindFrmFmtByName( rName );
+ break;
+ case SFX_STYLE_FAMILY_CHAR:
+ pFmt = rDoc.FindCharFmtByName( rName );
+ break;
+ }
+
+ return pFmt;
+}
+
+SwXMLItemSetStyleContext_Impl *SwXMLStylesContext_Impl::FindByPoolId(
+ sal_uInt16 nPoolId ) const
+{
+ SwXMLItemSetStyleContext_Impl *pStyle = 0;
+ sal_uInt16 nCount = GetStyleCount();
+ for( sal_uInt16 i=0; i < nCount && !pStyle; i++ )
+ {
+ SwXMLItemSetStyleContext_Impl *pTmp = GetSwStyle( i );
+ if( pTmp && pTmp->GetPoolId() == nPoolId )
+ pStyle = pTmp;
+ }
+
+ return pStyle;
+}
+
+SvXMLStyleContext *SwXMLStylesContext_Impl::CreateStyleChildContext(
+ sal_uInt16 nPrefix, const OUString& rLocalName,
+ const Reference< xml::sax::XAttributeList > & xAttrList )
+{
+ SvXMLStyleContext *pStyle = 0;
+
+ const SvXMLTokenMap& rTokenMap = GetSwImport().GetStyleStylesElemTokenMap();
+ switch( rTokenMap.Get( nPrefix, rLocalName ) )
+ {
+ case SW_XML_TOK_STYLE_STYLE:
+ pStyle = new SwXMLItemSetStyleContext_Impl( GetSwImport(), nPrefix, rLocalName,
+ xAttrList);
+ break;
+ case SW_XML_TOK_TEXT_LIST_STYLE:
+ pStyle = new SwXMLListStyleContext( GetSwImport(), nPrefix,
+ rLocalName, xAttrList );
+ break;
+ case SW_XML_TOK_TEXT_OUTLINE:
+ pStyle = new SwXMLListStyleContext( GetSwImport(), nPrefix,
+ rLocalName, xAttrList, sal_True );
+ break;
+ default:
+ pStyle = SvXMLStylesContext::CreateStyleChildContext( nPrefix,
+ rLocalName,
+ xAttrList );
+ break;
+ }
+
+ return pStyle;
+}
+#else
+SvXMLStyleContext *SwXMLStylesContext_Impl::CreateStyleStyleChildContext(
+ sal_uInt16 nFamily, sal_uInt16 nPrefix, const OUString& rLocalName,
+ const Reference< xml::sax::XAttributeList > & xAttrList )
+{
+ SvXMLStyleContext *pStyle = 0;
+
+ switch( nFamily )
+ {
+ case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
+ pStyle = new SwXMLTextStyleContext_Impl( GetSwImport(), nPrefix,
+ rLocalName, xAttrList, nFamily, *this );
+ break;
+ case XML_STYLE_FAMILY_TABLE_TABLE:
+ case XML_STYLE_FAMILY_TABLE_COLUMN:
+ case XML_STYLE_FAMILY_TABLE_ROW:
+ case XML_STYLE_FAMILY_TABLE_CELL:
+ pStyle = new SwXMLItemSetStyleContext_Impl( GetSwImport(), nPrefix,
+ rLocalName, xAttrList, nFamily );
+ break;
+ case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
+ // HACK until CL is back again
+ pStyle = new XMLTextStyleContext( GetImport(), nPrefix,
+ rLocalName, xAttrList, *this );
+ break;
+ default:
+ pStyle = SvXMLStylesContext::CreateStyleStyleChildContext( nFamily,
+ nPrefix,
+ rLocalName,
+ xAttrList );
+ break;
+ }
+
+ return pStyle;
+}
+#endif
+
+SwXMLStylesContext_Impl::SwXMLStylesContext_Impl(
+ SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
+ const Reference< xml::sax::XAttributeList > & xAttrList ) :
+ SvXMLStylesContext( rImport, nPrfx, rLName, xAttrList )
+{
+}
+
+SwXMLStylesContext_Impl::~SwXMLStylesContext_Impl()
+{
+}
+
+#ifndef XML_CORE_API
+sal_Bool SwXMLStylesContext_Impl::InsertStyleFamily( sal_uInt16 nFamily ) const
+{
+ const SwXMLImport& rSwImport = GetSwImport();
+ sal_uInt16 nStyleFamilyMask = rSwImport.GetStyleFamilyMask();
+
+ sal_Bool bIns = sal_True;
+ switch( nFamily )
+ {
+ case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
+ bIns = (nStyleFamilyMask & SFX_STYLE_FAMILY_PARA) != 0;
+ break;
+ case XML_STYLE_FAMILY_TEXT_TEXT:
+ bIns = (nStyleFamilyMask & SFX_STYLE_FAMILY_CHAR) != 0;
+ break;
+ case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
+ bIns = (nStyleFamilyMask & SFX_STYLE_FAMILY_FRAME) != 0;
+ break;
+ case XML_STYLE_FAMILY_TEXT_LIST:
+ bIns = (nStyleFamilyMask & SFX_STYLE_FAMILY_PSEUDO) != 0;
+ break;
+ case XML_STYLE_FAMILY_TEXT_OUTLINE:
+ bIns = !(rSwImport.IsInsertMode() || rSwImport.IsStylesOnlyMode());
+ break;
+ default:
+ bIns = SvXMLStylesContext::InsertStyleFamily( nFamily );
+ break;
+ }
+
+ return bIns;
+}
+
+UniReference < SvXMLImportPropertyMapper > SwXMLStylesContext_Impl::GetImportPropertyMapper(
+ sal_uInt16 nFamily ) const
+{
+ UniReference < SvXMLImportPropertyMapper > xMapper;
+ if( XML_STYLE_FAMILY_SD_GRAPHICS_ID == nFamily )
+ xMapper = ((SvXMLImport *)&GetImport())->GetTextImport()
+ ->GetFrameImportPropertySetMapper();
+ else
+ xMapper = SvXMLStylesContext::GetImportPropertyMapper( nFamily );
+
+ return xMapper;
+}
+
+Reference < XNameContainer > SwXMLStylesContext_Impl::GetStylesContainer(
+ sal_uInt16 nFamily ) const
+{
+ Reference < XNameContainer > xStyles;
+ if( XML_STYLE_FAMILY_SD_GRAPHICS_ID == nFamily )
+ xStyles = ((SvXMLImport *)&GetImport())->GetTextImport()->GetFrameStyles();
+ else
+ xStyles = SvXMLStylesContext::GetStylesContainer( nFamily );
+
+ return xStyles;
+}
+
+OUString SwXMLStylesContext_Impl::GetServiceName( sal_uInt16 nFamily ) const
+{
+ String sServiceName;
+ if( XML_STYLE_FAMILY_SD_GRAPHICS_ID == nFamily )
+ sServiceName = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.style.FrameStyle") );
+ else
+ sServiceName = SvXMLStylesContext::GetServiceName( nFamily );
+
+ return sServiceName;
+}
+#endif
+
+#ifdef XML_CORE_API
+void SwXMLStylesContext_Impl::CopyStylesToDoc()
+{
+ SwXMLImport& rSwImport = GetSwImport();
+ SwDoc& rDoc = rSwImport.GetDoc();
+ SvI18NMap& rI18NMap = rSwImport.GetI18NMap();
+ sal_Bool bInsertMode = rSwImport.IsInsertMode();
+ sal_uInt16 nStyleFamilyMask = rSwImport.GetStyleFamilyMask();
+
+ // The following families are of interest for pass 1
+ sal_uInt16 nFamilies = nStyleFamilyMask &
+ ( SFX_STYLE_FAMILY_FRAME|SFX_STYLE_FAMILY_PARA|
+ SFX_STYLE_FAMILY_CHAR );
+
+ // pass 1: create text, paragraph and frame styles
+ sal_uInt16 nCount = GetStyleCount();
+ for( sal_uInt16 i=0; i<nCount; i++ )
+ {
+ SwXMLItemSetStyleContext_Impl *pStyle = GetSwStyle( i );
+ if( !pStyle )
+ {
+ continue;
+ }
+
+ sal_uInt16 eFamily = pStyle->GetFamily();
+ if( !(nFamilies & eFamily) )
+ {
+ pStyle->SetValid( sal_False );
+ continue;
+ }
+
+ const OUString& rName = pStyle->GetName();
+ if( 0 == rName.getLength() )
+ {
+ pStyle->SetValid( sal_False );
+ continue;
+ }
+ OUString sName =
+ SwXStyleFamilies::GetUIName( rName, (SfxStyleFamily)eFamily );
+
+// sal_uInt16 nPoolId = pStyle->GetPoolId();
+
+ sal_Bool bNewFmt = sal_False;
+ SwFmt *pFmt = FindFmtByName( sName, eFamily );
+ if( !pFmt )
+ {
+ // it is a new format
+ SwGetPoolIdFromName eNameType;
+ if( eFamily & SFX_STYLE_FAMILY_CHAR )
+ eNameType = GET_POOLID_CHRFMT;
+ else if( eFamily & SFX_STYLE_FAMILY_FRAME )
+ eNameType = GET_POOLID_FRMFMT;
+ else
+ eNameType = GET_POOLID_TXTCOLL;
+
+ sal_uInt16 nPoolId = rDoc.GetPoolId( sName, eNameType );
+ bNewFmt = sal_True;
+// sal_Bool bIsUserDefined = (nPoolId & USER_FMT) != 0;
+ sal_Bool bIsUserDefined = nPoolId == USHRT_MAX;
+#if 0
+ if( !bIsUserDefined )
+ {
+ bIsUserDefined = !lcl_xmlfmt_isValidPoolId( nPoolId, eFamily );
+ if( bIsUserDefined )
+ {
+ // If the pool id is invalid create a user style
+ nPoolId |= (USHRT_MAX &
+ ~(COLL_GET_RANGE_BITS + POOLGRP_NOCOLLID));
+ }
+ }
+ else
+ {
+ // The style is not a pool style, but maybe there is
+ // a pool style with this name now?
+ SwGetPoolIdFromName eNameType;
+ if( eFamily & SFX_STYLE_FAMILY_CHAR )
+ eNameType = GET_POOLID_CHRFMT;
+ else if( eFamily & SFX_STYLE_FAMILY_FRAME )
+ eNameType = GET_POOLID_FRMFMT;
+ else
+ eNameType = GET_POOLID_TXTCOLL;
+ sal_uInt16 nId = rDoc.GetPoolId( rName, eNameType );
+ if( nId != USHRT_MAX )
+ {
+ if( FindByPoolId( nId ) )
+ {
+ // There is a style with the new pool id, too.
+ // This means, that the user style will be ignored.
+ continue;
+ }
+ else
+ {
+ bIsUserDefined = sal_False;
+ nPoolId = nId;
+ }
+ }
+ }
+#endif
+
+ if( bIsUserDefined )
+ {
+ if( eFamily & SFX_STYLE_FAMILY_CHAR )
+ {
+ pFmt = rDoc.MakeCharFmt( rName, NULL );
+ pFmt->SetAuto( sal_False );
+ }
+ else if( eFamily & SFX_STYLE_FAMILY_FRAME )
+ {
+ pFmt = rDoc.MakeFrmFmt( rName, NULL );
+ pFmt->SetAuto( sal_False );
+ }
+ else if( pStyle->HasConditions() )
+ {
+ SwTxtFmtColl* pDer = (*rDoc.GetTxtFmtColls())[ 0 ];
+ pFmt = rDoc.MakeCondTxtFmtColl( rName, pDer );
+ }
+ else
+ {
+ SwTxtFmtColl* pDer = (*rDoc.GetTxtFmtColls())[ 0 ];
+ pFmt = rDoc.MakeTxtFmtColl( rName, pDer );
+ }
+
+// pFmt->SetPoolFmtId( nPoolId );
+// if( pStyle->GetHelpFile().getLength() )
+// pFmt->SetPoolHlpFileId
+// ( (sal_Int8) rDoc.SetDocPattern(
+// pStyle->GetHelpFile() ) );
+// pFmt->SetPoolHelpId( (sal_uInt16)pStyle->GetHelpId() );
+ }
+ else
+ {
+ if( eFamily & SFX_STYLE_FAMILY_CHAR )
+ {
+ sal_uInt16 nStyleCnt = rDoc.GetCharFmts()->Count();
+ pFmt = rDoc.GetCharFmtFromPool( nPoolId );
+ bNewFmt = nStyleCnt != rDoc.GetCharFmts()->Count();
+ }
+ else if( eFamily & SFX_STYLE_FAMILY_FRAME )
+ {
+ sal_uInt16 nStyleCnt = rDoc.GetFrmFmts()->Count();
+ pFmt = rDoc.GetFrmFmtFromPool( nPoolId );
+ bNewFmt = nStyleCnt != rDoc.GetFrmFmts()->Count();
+ }
+ else
+ {
+ sal_uInt16 nStyleCnt = rDoc.GetTxtFmtColls()->Count();
+ pFmt = rDoc.GetTxtCollFromPool( nPoolId );
+ bNewFmt = nStyleCnt != rDoc.GetTxtFmtColls()->Count();
+ }
+
+ // If the name of the pool style has been changed, add
+ // a i18n map entry.
+ if( String(rName) != pFmt->GetName() )
+ rI18NMap.Add( eFamily, pStyle->GetName(), pFmt->GetName() );
+ }
+ }
+#if 0
+ else if( (nPoolId & USER_FMT) != 0 )
+ {
+ // If a pool style has been renamed it may have the same
+ // name a a user style. If this is the case, the user style
+ // will be ignored.
+ sal_uInt16 nId = pFmt->GetPoolFmtId();
+ SwXMLItemSetStyleContext_Impl *pTmp;
+ if( nId != nPoolId && (nId & USER_FMT) == 0 &&
+ (pTmp = FindByPoolId( nPoolId )) != 0 &&
+ pTmp->GetFmt() == pFmt )
+ {
+ pStyle->SetValid( sal_False );
+ continue;
+ }
+ }
+#endif
+
+ pStyle->SetFmt( pFmt );
+
+ if( !bInsertMode || bNewFmt )
+ {
+ if( pStyle->GetItemSet() )
+ {
+ pFmt->ResetAllAttr(); // delete default attributes
+
+ ((SwAttrSet&) pFmt->GetAttrSet()).Put( *pStyle->GetItemSet() );
+ }
+ SwTxtFmtColl* pColl = pStyle->GetColl();
+ if( pColl )
+ {
+ ((SwAttrSet&) pColl->GetAttrSet()).SetModifyAtAttr( pColl );
+ }
+ pFmt->SetAutoUpdateFmt( pStyle->IsAutoUpdate() );
+ }
+ else
+ {
+ pStyle->SetValid( sal_False );
+ }
+ }
+
+ // pass 2: connect parent/next styles and create list styles
+ for( i=0; i<nCount; i++ )
+ {
+ SwXMLItemSetStyleContext_Impl *pStyle = GetSwStyle( i );
+ if( !pStyle )
+ {
+ if( (nStyleFamilyMask & SFX_STYLE_FAMILY_PSEUDO) != 0 )
+ {
+ SwXMLListStyleContext *pListStyle = GetSwListStyle( i );
+ if( pListStyle )
+ pListStyle->InsertNumRule( sal_False );
+ }
+ continue;
+ }
+ else if( !pStyle->IsValid() )
+ continue;
+
+ sal_uInt16 eFamily = pStyle->GetFamily();
+ if( (nFamilies & eFamily) != 0 )
+ {
+ pStyle->ConnectParent();
+ pStyle->ConnectFollow();
+
+ // The format has been changed
+ SwFmtChg aHint( pStyle->GetFmt() );
+ pStyle->GetFmt()->Modify( &aHint, &aHint );
+ }
+ }
+
+ // pass 3: connect conditions and list styles
+ for( i=0; i<nCount; i++ )
+ {
+ SwXMLItemSetStyleContext_Impl *pStyle = GetSwStyle( i );
+ if( pStyle && pStyle->IsValid() &&
+ (nFamilies & pStyle->GetFamily()) != 0 )
+ {
+ pStyle->ConnectListStyle();
+ if( pStyle->HasConditions() )
+ pStyle->ConnectConditions();
+ }
+ }
+}
+
+void SwXMLStylesContext_Impl::CopyAutoStylesToDoc()
+{
+ // pass 1: create list styles
+ sal_uInt16 nCount = GetStyleCount();
+ if( (GetSwImport().GetStyleFamilyMask() & SFX_STYLE_FAMILY_PSEUDO) != 0 )
+ {
+ for( sal_uInt16 i=0; i<nCount; i++ )
+ {
+ SwXMLListStyleContext *pListStyle = GetSwListStyle( i );
+ if( pListStyle && !pListStyle->IsOutline() )
+ pListStyle->InsertNumRule( sal_True );
+ }
+ }
+
+ // pass 3: connect list styles
+ if( (GetSwImport().GetStyleFamilyMask() & SFX_STYLE_FAMILY_PARA) != 0 )
+ {
+ for( sal_uInt16 i=0; i<nCount; i++ )
+ {
+ SwXMLItemSetStyleContext_Impl *pStyle = GetSwStyle( i );
+ if( pStyle && SFX_STYLE_FAMILY_PARA == pStyle->GetFamily() )
+ {
+ pStyle->ConnectAutoListStyle();
+ }
+ }
+ }
+}
+#endif
+
+// ---------------------------------------------------------------------
+
+SvXMLImportContext *SwXMLImport::CreateStylesContext(
+ const OUString& rLocalName,
+ const Reference< xml::sax::XAttributeList > & xAttrList,
+ sal_Bool bAuto )
+{
+ SvXMLImportContext *pContext =
+ new SwXMLStylesContext_Impl( *this, XML_NAMESPACE_OFFICE, rLocalName,
+ xAttrList );
+ if( bAuto )
+ xAutoStyles = pContext;
+ else
+ xStyles = pContext;
+
+ return pContext;
+}
+
+void SwXMLImport::InsertStyles()
+{
+ sal_Bool bStylesValid = xStyles.Is();
+ bAutoStylesValid = xAutoStyles.Is();
+
+ if( bStylesValid )
+#ifdef XML_CORE_API
+ ((SwXMLStylesContext_Impl *)&xStyles)->CopyStylesToDoc();
+#else
+ ((SwXMLStylesContext_Impl *)&xStyles)->CopyStylesToDoc(
+ !IsInsertMode() );
+#endif
+ xStyles = 0;
+
+ if( bAutoStylesValid )
+#ifdef XML_CORE_API
+ ((SwXMLStylesContext_Impl *)&xAutoStyles)->CopyAutoStylesToDoc();
+#else
+ GetTextImport()->SetAutoStyles( (SwXMLStylesContext_Impl *)&xAutoStyles );
+#endif
+ else
+ xAutoStyles = 0;
+}
+
+sal_Bool SwXMLImport::FindAutomaticStyle(
+#ifdef XML_CORE_API
+ SfxStyleFamily eFamily,
+ sal_uInt16 nSubFamily,
+#else
+ sal_uInt16 nFamily,
+#endif
+ const OUString& rName,
+ const SfxItemSet **ppItemSet,
+ OUString *pParent ) const
+{
+ const SwXMLItemSetStyleContext_Impl *pStyle = 0;
+ if( bAutoStylesValid && xAutoStyles.Is() )
+ {
+#ifdef XML_CORE_API
+ pStyle = PTR_CAST( SwXMLItemSetStyleContext_Impl,
+ ((SwXMLStylesContext_Impl *)&xAutoStyles)->
+ FindStyleChildContext( eFamily, nSubFamily, rName,
+ sal_True ) );
+#else
+ pStyle = PTR_CAST( SwXMLItemSetStyleContext_Impl,
+ ((SwXMLStylesContext_Impl *)&xAutoStyles)->
+ FindStyleChildContext( nFamily, rName,
+ sal_True ) );
+#endif
+ if( pStyle )
+ {
+ if( ppItemSet )
+ (*ppItemSet) = pStyle->GetItemSet();
+ if( pParent )
+ *pParent = pStyle->GetParent();
+ }
+ }
+
+ return pStyle != 0;
+}
+
+/*************************************************************************
+
+ Source Code Control System - Header
+
+ $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmlfmt.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $
+
+ Source Code Control System - Update
+
+ $Log: not supported by cvs2svn $
+ Revision 1.42 2000/09/18 16:05:05 willem.vandorp
+ OpenOffice header added.
+
+ Revision 1.41 2000/09/18 11:58:02 mib
+ text frames/graphics import and export continued
+
+ Revision 1.40 2000/08/31 14:26:32 mib
+ conditional styles
+
+ Revision 1.39 2000/08/24 11:16:41 mib
+ text import continued
+
+ Revision 1.38 2000/08/10 10:22:15 mib
+ #74404#: Adeptions to new XSL/XLink working draft
+
+ Revision 1.37 2000/07/27 08:06:34 mib
+ text import continued
+
+ Revision 1.36 2000/07/21 12:55:15 mib
+ text import/export using StarOffice API
+
+ Revision 1.35 2000/07/07 13:58:36 mib
+ text styles using StarOffice API
+
+ Revision 1.34 2000/06/26 08:31:15 mib
+ removed SfxStyleFamily
+
+ Revision 1.33 2000/06/08 09:45:54 aw
+ changed to use functionality from xmloff project now
+
+ Revision 1.32 2000/05/03 12:08:05 mib
+ unicode
+
+ Revision 1.31 2000/03/13 14:33:44 mib
+ UNO3
+
+ Revision 1.30 2000/03/06 10:46:10 mib
+ #72585#: toInt32
+
+ Revision 1.29 2000/02/18 09:20:12 mib
+ #70271#: initialization of pContext was missing
+
+ Revision 1.28 2000/02/17 14:40:30 mib
+ #70271#: XML table import
+
+ Revision 1.26 2000/01/27 08:59:02 mib
+ #70271#: outline numbering
+
+ Revision 1.25 2000/01/20 10:03:15 mib
+ #70271#: Lists reworked
+
+ Revision 1.24 2000/01/06 15:08:27 mib
+ #70271#:separation of text/layout, cond. styles, adaptions to wd-xlink-19991229
+
+ Revision 1.23 1999/12/13 08:28:25 mib
+ #70271#: Support for element items added
+
+ Revision 1.22 1999/12/06 11:41:33 mib
+ #70258#: Container item for unkown attributes
+
+ Revision 1.21 1999/11/26 11:13:57 mib
+ loading of styles only and insert mode
+
+ Revision 1.20 1999/11/22 15:52:34 os
+ headers added
+
+ Revision 1.19 1999/11/17 20:08:49 nn
+ document language
+
+ Revision 1.18 1999/11/12 14:50:28 mib
+ meta import and export reactivated
+
+ Revision 1.17 1999/11/12 11:43:03 mib
+ using item mapper, part iii
+
+ Revision 1.16 1999/11/10 15:08:09 mib
+ Import now uses XMLItemMapper
+
+ Revision 1.15 1999/11/09 15:40:08 mib
+ Using XMLItemMapper for export
+
+ Revision 1.14 1999/11/05 19:44:11 nn
+ handle office:meta
+
+ Revision 1.13 1999/11/01 11:38:50 mib
+ List style import
+
+ Revision 1.12 1999/10/25 10:41:48 mib
+ Using new OUString ASCII methods
+
+ Revision 1.11 1999/10/22 09:49:16 mib
+ List style export
+
+ Revision 1.10 1999/10/15 12:37:05 mib
+ integrated SvXMLStyle into SvXMLStyleContext
+
+ Revision 1.9 1999/10/08 11:47:45 mib
+ moved some file to SVTOOLS/SVX
+
+ Revision 1.8 1999/10/01 13:02:51 mib
+ no comparisons between OUString and char* any longer
+
+ Revision 1.7 1999/09/28 10:47:58 mib
+ char fmts again
+
+ Revision 1.6 1999/09/28 08:31:15 mib
+ char fmts, hints
+
+ Revision 1.5 1999/09/23 11:53:58 mib
+ i18n, token maps and hard paragraph attributes
+
+ Revision 1.4 1999/09/22 11:56:57 mib
+ string -> wstring
+
+ Revision 1.3 1999/08/19 12:57:42 MIB
+ attribute import added
+
+
+ Rev 1.2 19 Aug 1999 14:57:42 MIB
+ attribute import added
+
+ Rev 1.1 18 Aug 1999 17:03:36 MIB
+ Style import
+
+ Rev 1.0 13 Aug 1999 16:18:10 MIB
+ Initial revision.
+
+
+*************************************************************************/
+