| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sw.hxx" |
| |
| |
| #include <rtl/ustrbuf.hxx> |
| #include <tools/urlobj.hxx> |
| |
| #ifndef _SVSTDARR_STRINGSSORT_DECL |
| #define _SVSTDARR_STRINGSSORT |
| #include <svl/svstdarr.hxx> |
| #endif |
| #include <xmloff/nmspmap.hxx> |
| #include <format.hxx> |
| #include <fmtcol.hxx> |
| #include <hints.hxx> |
| #include <poolfmt.hxx> |
| #include <charfmt.hxx> |
| #include <paratr.hxx> |
| #include <doc.hxx> |
| #include "docary.hxx" |
| #include "unostyle.hxx" |
| #include "fmtpdsc.hxx" |
| #include "pagedesc.hxx" |
| #include <xmloff/xmlnmspe.hxx> |
| #include <xmloff/i18nmap.hxx> |
| #include <xmloff/xmltkmap.hxx> |
| #include "xmlitem.hxx" |
| #include <xmloff/xmlstyle.hxx> |
| #include <xmloff/txtstyli.hxx> |
| #include <xmloff/txtimp.hxx> |
| #include <xmloff/families.hxx> |
| #include <xmloff/XMLTextMasterStylesContext.hxx> |
| #include <xmloff/XMLTextShapeStyleContext.hxx> |
| #include <xmloff/XMLGraphicsDefaultStyle.hxx> |
| #include "xmlimp.hxx" |
| #include "xmltbli.hxx" |
| #include "cellatr.hxx" |
| #include <SwStyleNameMapper.hxx> |
| #include <xmloff/attrlist.hxx> |
| #include <unotxdoc.hxx> |
| #include <docsh.hxx> |
| |
| |
| using namespace ::com::sun::star; |
| using ::rtl::OUString; |
| using ::rtl::OUStringBuffer; |
| using namespace ::xmloff::token; |
| |
| 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 ), |
| nCondition( 0 ), |
| nSubCondition( 0 ), |
| nPos( 0 ), |
| nLength( rInp.getLength() ) |
| { |
| 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 ) |
| { |
| if( IsXMLToken( sFunc, XML_ENDNOTE ) && !bHasSub ) |
| nCondition = PARA_IN_ENDNOTE; |
| else if( IsXMLToken( sFunc, XML_FOOTER ) && !bHasSub ) |
| nCondition = PARA_IN_FOOTER; |
| else if( IsXMLToken( sFunc, XML_FOOTNOTE ) && !bHasSub ) |
| nCondition = PARA_IN_FOOTENOTE; |
| else if( IsXMLToken( sFunc, XML_HEADER ) && !bHasSub ) |
| nCondition = PARA_IN_HEADER; |
| else if( IsXMLToken( sFunc, XML_LIST_LEVEL) && |
| nSub >=1 && nSub <= MAXLEVEL ) |
| { |
| nCondition = PARA_IN_LIST; |
| nSubCondition = nSub-1; |
| } |
| else if( IsXMLToken( sFunc, XML_OUTLINE_LEVEL) && |
| nSub >=1 && nSub <= MAXLEVEL ) |
| { |
| nCondition = PARA_IN_OUTLINE; |
| nSubCondition = nSub-1; |
| } |
| else if( IsXMLToken( sFunc, XML_SECTION ) && !bHasSub ) |
| { |
| nCondition = PARA_IN_SECTION; |
| } |
| else if( IsXMLToken( sFunc, XML_TABLE ) && !bHasSub ) |
| { |
| nCondition = PARA_IN_TABLEBODY; |
| } |
| else if( IsXMLToken( sFunc, XML_TABLE_HEADER ) && !bHasSub ) |
| { |
| nCondition = PARA_IN_TABLEHEAD; |
| } |
| else if( IsXMLToken( sFunc, XML_TEXT_BOX ) && !bHasSub ) |
| { |
| nCondition = PARA_IN_FRAME; |
| } |
| } |
| } |
| |
| // --------------------------------------------------------------------- |
| |
| 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 uno::Reference< xml::sax::XAttributeList > & xAttrList ); |
| virtual ~SwXMLConditionContext_Impl(); |
| |
| TYPEINFO(); |
| |
| 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 uno::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( IsXMLToken( aLocalName, XML_CONDITION ) ) |
| { |
| SwXMLConditionParser_Impl aCondParser( rValue ); |
| if( aCondParser.IsValid() ) |
| { |
| nCondition = aCondParser.GetCondition(); |
| nSubCondition = aCondParser.GetSubCondition(); |
| } |
| } |
| else if( IsXMLToken( aLocalName, XML_APPLY_STYLE_NAME ) ) |
| { |
| sApplyStyle = rValue; |
| } |
| } |
| } |
| } |
| |
| SwXMLConditionContext_Impl::~SwXMLConditionContext_Impl() |
| { |
| } |
| |
| TYPEINIT1( SwXMLConditionContext_Impl, XMLTextStyleContext ); |
| |
| // --------------------------------------------------------------------- |
| |
| typedef SwXMLConditionContext_Impl *SwXMLConditionContextPtr; |
| SV_DECL_PTRARR( SwXMLConditions_Impl, SwXMLConditionContextPtr, 5, 2 ) |
| |
| class SwXMLTextStyleContext_Impl : public XMLTextStyleContext |
| { |
| SwXMLConditions_Impl *pConditions; |
| |
| protected: |
| |
| virtual uno::Reference < style::XStyle > Create(); |
| |
| public: |
| |
| TYPEINFO(); |
| |
| SwXMLTextStyleContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx, |
| const OUString& rLName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList, |
| sal_uInt16 nFamily, |
| SvXMLStylesContext& rStyles ); |
| virtual ~SwXMLTextStyleContext_Impl(); |
| |
| virtual SvXMLImportContext *CreateChildContext( |
| sal_uInt16 nPrefix, |
| const OUString& rLocalName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList ); |
| |
| virtual void Finish( sal_Bool bOverwrite ); |
| }; |
| |
| TYPEINIT1( SwXMLTextStyleContext_Impl, XMLTextStyleContext ); |
| |
| uno::Reference < style::XStyle > SwXMLTextStyleContext_Impl::Create() |
| { |
| uno::Reference < style::XStyle > xNewStyle; |
| |
| if( pConditions && XML_STYLE_FAMILY_TEXT_PARAGRAPH == GetFamily() ) |
| { |
| uno::Reference< lang::XMultiServiceFactory > xFactory( GetImport().GetModel(), |
| uno::UNO_QUERY ); |
| if( xFactory.is() ) |
| { |
| OUString sServiceName( RTL_CONSTASCII_USTRINGPARAM( |
| "com.sun.star.style.ConditionalParagraphStyle" ) ); |
| uno::Reference < uno::XInterface > xIfc = |
| xFactory->createInstance( sServiceName ); |
| if( xIfc.is() ) |
| xNewStyle = uno::Reference < style::XStyle >( xIfc, uno::UNO_QUERY ); |
| } |
| } |
| else |
| { |
| xNewStyle = XMLTextStyleContext::Create(); |
| } |
| |
| return xNewStyle; |
| } |
| |
| SwXMLTextStyleContext_Impl::SwXMLTextStyleContext_Impl( SwXMLImport& rImport, |
| sal_uInt16 nPrfx, const OUString& rLName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList, |
| sal_uInt16 nFamily, |
| SvXMLStylesContext& rStyles ) : |
| XMLTextStyleContext( rImport, nPrfx, rLName, xAttrList, rStyles, nFamily ), |
| pConditions( 0 ) |
| { |
| } |
| |
| 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 uno::Reference< xml::sax::XAttributeList > & xAttrList ) |
| { |
| SvXMLImportContext *pContext = 0; |
| |
| if( XML_NAMESPACE_STYLE == nPrefix && IsXMLToken( rLocalName, XML_MAP ) ) |
| { |
| 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; |
| |
| uno::Reference < style::XStyle > xStyle = GetStyle(); |
| if( !xStyle.is() ) |
| return; |
| |
| const SwXStyle* pStyle = 0; |
| uno::Reference<lang::XUnoTunnel> xStyleTunnel( xStyle, uno::UNO_QUERY); |
| if( xStyleTunnel.is() ) |
| { |
| pStyle = reinterpret_cast< SwXStyle * >( |
| sal::static_int_cast< sal_IntPtr >( xStyleTunnel->getSomething( SwXStyle::getUnoTunnelId() ))); |
| } |
| if( !pStyle ) |
| return; |
| |
| const SwDoc *pDoc = pStyle->GetDoc(); |
| |
| SwTxtFmtColl *pColl = pDoc->FindTxtFmtCollByName( pStyle->GetStyleName() ); |
| ASSERT( pColl, "Text collection not found" ); |
| if( !pColl || RES_CONDTXTFMTCOLL != pColl->Which() ) |
| return; |
| |
| sal_uInt16 nCount = pConditions->Count(); |
| String aString; |
| OUString sName; |
| for( sal_uInt16 i = 0; i < nCount; i++ ) |
| { |
| const SwXMLConditionContext_Impl *pCond = (*pConditions)[i]; |
| OUString aDisplayName( |
| GetImport().GetStyleDisplayName( XML_STYLE_FAMILY_TEXT_PARAGRAPH, |
| pCond->GetApplyStyle() ) ); |
| SwStyleNameMapper::FillUIName( aDisplayName, |
| aString, |
| nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, |
| sal_True); |
| sName = aString; |
| SwTxtFmtColl* pCondColl = pDoc->FindTxtFmtCollByName( sName ); |
| ASSERT( pCondColl, |
| "SwXMLItemSetStyleContext_Impl::ConnectConditions: cond coll missing" ); |
| if( pCondColl ) |
| { |
| SwCollCondition aCond( pCondColl, pCond->GetCondition(), |
| pCond->GetSubCondition() ); |
| ((SwConditionTxtFmtColl*)pColl)->InsertCondition( aCond ); |
| } |
| } |
| } |
| |
| // --------------------------------------------------------------------- |
| |
| class SwXMLItemSetStyleContext_Impl : public SvXMLStyleContext |
| { |
| OUString sMasterPageName; |
| SfxItemSet *pItemSet; |
| SwXMLTextStyleContext_Impl *pTextStyle; |
| SvXMLStylesContext &rStyles; |
| |
| OUString sDataStyleName; |
| |
| sal_Bool bHasMasterPageName : 1; |
| sal_Bool bPageDescConnected : 1; |
| sal_Bool bDataStyleIsResolved; |
| |
| SvXMLImportContext *CreateItemSetContext( |
| sal_uInt16 nPrefix, |
| const OUString& rLName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList); |
| |
| protected: |
| |
| virtual void SetAttribute( sal_uInt16 nPrefixKey, |
| const OUString& rLocalName, |
| const OUString& rValue ); |
| |
| 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 uno::Reference< xml::sax::XAttributeList > & xAttrList, |
| SvXMLStylesContext& rStylesC, |
| sal_uInt16 nFamily); |
| virtual ~SwXMLItemSetStyleContext_Impl(); |
| |
| virtual void CreateAndInsert( sal_Bool bOverwrite ); |
| virtual SvXMLImportContext *CreateChildContext( |
| sal_uInt16 nPrefix, |
| const OUString& rLocalName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList ); |
| |
| // The item set may be empty! |
| SfxItemSet *GetItemSet() { return pItemSet; } |
| const SfxItemSet *GetItemSet() const { return pItemSet; } |
| |
| const OUString& GetMasterPageName() const { return sMasterPageName; } |
| sal_Bool HasMasterPageName() const { return bHasMasterPageName; } |
| |
| sal_Bool IsPageDescConnected() const { return bPageDescConnected; } |
| void ConnectPageDesc(); |
| |
| sal_Bool ResolveDataStyleName(); |
| }; |
| |
| void SwXMLItemSetStyleContext_Impl::SetAttribute( sal_uInt16 nPrefixKey, |
| const OUString& rLocalName, |
| const OUString& rValue ) |
| { |
| if( XML_NAMESPACE_STYLE == nPrefixKey ) |
| { |
| if ( IsXMLToken( rLocalName, XML_MASTER_PAGE_NAME ) ) |
| { |
| sMasterPageName = rValue; |
| bHasMasterPageName = sal_True; |
| } |
| else if ( IsXMLToken( rLocalName, XML_DATA_STYLE_NAME ) ) |
| { |
| // if we have a valid data style name |
| if (rValue.getLength() > 0) |
| { |
| sDataStyleName = rValue; |
| bDataStyleIsResolved = sal_False; // needs to be resolved |
| } |
| } |
| else |
| { |
| SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue ); |
| } |
| } |
| else |
| { |
| SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue ); |
| } |
| } |
| |
| SvXMLImportContext *SwXMLItemSetStyleContext_Impl::CreateItemSetContext( |
| sal_uInt16 nPrefix, const OUString& rLName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList ) |
| { |
| ASSERT( !pItemSet, |
| "SwXMLItemSetStyleContext_Impl::CreateItemSetContext: item set exists" ); |
| |
| SvXMLImportContext *pContext = 0; |
| |
| SwDoc* pDoc = SwImport::GetDocFromXMLImport( GetSwImport() ); |
| |
| SfxItemPool& rItemPool = pDoc->GetAttrPool(); |
| 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 ); |
| 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 uno::Reference< xml::sax::XAttributeList > & xAttrList, |
| SvXMLStylesContext& rStylesC, |
| sal_uInt16 nFamily ) : |
| SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, nFamily ), |
| pItemSet( 0 ), |
| pTextStyle( 0 ), |
| rStyles( rStylesC ), |
| bHasMasterPageName( sal_False ), |
| bPageDescConnected( sal_False ), |
| bDataStyleIsResolved( sal_True ) |
| { |
| } |
| |
| SwXMLItemSetStyleContext_Impl::~SwXMLItemSetStyleContext_Impl() |
| { |
| delete pItemSet; |
| } |
| |
| void SwXMLItemSetStyleContext_Impl::CreateAndInsert( sal_Bool bOverwrite ) |
| { |
| if( pTextStyle ) |
| pTextStyle->CreateAndInsert( bOverwrite ); |
| } |
| |
| SvXMLImportContext *SwXMLItemSetStyleContext_Impl::CreateChildContext( |
| sal_uInt16 nPrefix, |
| const OUString& rLocalName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList ) |
| { |
| SvXMLImportContext *pContext = 0; |
| |
| if( XML_NAMESPACE_STYLE == nPrefix ) |
| { |
| if( IsXMLToken( rLocalName, XML_TABLE_PROPERTIES ) || |
| IsXMLToken( rLocalName, XML_TABLE_COLUMN_PROPERTIES ) || |
| IsXMLToken( rLocalName, XML_TABLE_ROW_PROPERTIES ) || |
| IsXMLToken( rLocalName, XML_TABLE_CELL_PROPERTIES ) ) |
| { |
| pContext = CreateItemSetContext( nPrefix, rLocalName, xAttrList ); |
| } |
| else if( IsXMLToken( rLocalName, XML_TEXT_PROPERTIES ) || |
| IsXMLToken( rLocalName, XML_PARAGRAPH_PROPERTIES )) |
| { |
| if( !pTextStyle ) |
| { |
| SvXMLAttributeList *pTmp = new SvXMLAttributeList; |
| OUString aStr = GetImport().GetNamespaceMap().GetQNameByKey( nPrefix, GetXMLToken(XML_NAME) ); |
| pTmp->AddAttribute( aStr, GetName() ); |
| uno::Reference <xml::sax::XAttributeList> xTmpAttrList = pTmp; |
| pTextStyle = new SwXMLTextStyleContext_Impl( GetSwImport(), nPrefix, |
| rLocalName, xTmpAttrList, XML_STYLE_FAMILY_TEXT_PARAGRAPH, rStyles ); |
| pTextStyle->StartElement( xTmpAttrList ); |
| rStyles.AddStyle( *pTextStyle ); |
| } |
| pContext = pTextStyle->CreateChildContext( nPrefix, rLocalName, xAttrList ); |
| } |
| } |
| |
| if( !pContext ) |
| pContext = SvXMLStyleContext::CreateChildContext( nPrefix, rLocalName, |
| xAttrList ); |
| |
| return pContext; |
| } |
| |
| void SwXMLItemSetStyleContext_Impl::ConnectPageDesc() |
| { |
| if( bPageDescConnected || !HasMasterPageName() ) |
| return; |
| bPageDescConnected = sal_True; |
| |
| SwDoc *pDoc = SwImport::GetDocFromXMLImport( GetSwImport() ); |
| |
| String sName; |
| // --> OD 2005-02-01 #i40788# - first determine the display name of the |
| // page style, then map this name to the corresponding user interface name. |
| sName = GetImport().GetStyleDisplayName( XML_STYLE_FAMILY_MASTER_PAGE, |
| GetMasterPageName() ); |
| SwStyleNameMapper::FillUIName( sName, |
| sName, |
| nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, |
| sal_True); |
| // <-- |
| SwPageDesc *pPageDesc = pDoc->FindPageDescByName( sName ); |
| if( !pPageDesc ) |
| { |
| // If the page style is a pool style, then we maybe have to create it |
| // first if it hasn't been used by now. |
| sal_uInt16 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( sName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC ); |
| if( USHRT_MAX != nPoolId ) |
| pPageDesc = pDoc->GetPageDescFromPool( nPoolId, false ); |
| } |
| |
| if( !pPageDesc ) |
| return; |
| |
| if( !pItemSet ) |
| { |
| SfxItemPool& rItemPool = pDoc->GetAttrPool(); |
| pItemSet = new SfxItemSet( rItemPool, aTableSetRange ); |
| } |
| |
| const SfxPoolItem *pItem; |
| SwFmtPageDesc *pFmtPageDesc = 0; |
| if( SFX_ITEM_SET == pItemSet->GetItemState( RES_PAGEDESC, sal_False, |
| &pItem ) ) |
| { |
| if( ((SwFmtPageDesc *)pItem)->GetPageDesc() != pPageDesc ) |
| pFmtPageDesc = new SwFmtPageDesc( *(SwFmtPageDesc *)pItem ); |
| } |
| else |
| pFmtPageDesc = new SwFmtPageDesc(); |
| |
| if( pFmtPageDesc ) |
| { |
| pFmtPageDesc->RegisterToPageDesc( *pPageDesc ); |
| pItemSet->Put( *pFmtPageDesc ); |
| delete pFmtPageDesc; |
| } |
| } |
| |
| sal_Bool SwXMLItemSetStyleContext_Impl::ResolveDataStyleName() |
| { |
| // resolve, if not already done |
| if (! bDataStyleIsResolved) |
| { |
| // get the format key |
| sal_Int32 nFormat = |
| GetImport().GetTextImport()->GetDataStyleKey(sDataStyleName); |
| |
| // if the key is valid, insert Item into ItemSet |
| if( -1 != nFormat ) |
| { |
| if( !pItemSet ) |
| { |
| SwDoc *pDoc = SwImport::GetDocFromXMLImport( GetSwImport() ); |
| |
| SfxItemPool& rItemPool = pDoc->GetAttrPool(); |
| pItemSet = new SfxItemSet( rItemPool, aTableBoxSetRange ); |
| } |
| SwTblBoxNumFormat aNumFormatItem(nFormat); |
| pItemSet->Put(aNumFormatItem); |
| } |
| |
| // now resolved |
| bDataStyleIsResolved = sal_True; |
| return sal_True; |
| } |
| else |
| { |
| // was already resolved; nothing to do |
| return sal_False; |
| } |
| } |
| |
| // --------------------------------------------------------------------- |
| // |
| class SwXMLStylesContext_Impl : public SvXMLStylesContext |
| { |
| SwXMLItemSetStyleContext_Impl *GetSwStyle( sal_uInt16 i ) const; |
| |
| SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); } |
| const SwXMLImport& GetSwImport() const |
| { return (const SwXMLImport&)GetImport(); } |
| |
| protected: |
| |
| virtual SvXMLStyleContext *CreateStyleStyleChildContext( sal_uInt16 nFamily, |
| sal_uInt16 nPrefix, const OUString& rLocalName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList ); |
| virtual SvXMLStyleContext *CreateDefaultStyleStyleChildContext( |
| sal_uInt16 nFamily, sal_uInt16 nPrefix, const OUString& rLocalName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList ); |
| // HACK |
| virtual UniReference < SvXMLImportPropertyMapper > GetImportPropertyMapper( |
| sal_uInt16 nFamily ) const; |
| |
| virtual uno::Reference < container::XNameContainer > |
| GetStylesContainer( sal_uInt16 nFamily ) const; |
| virtual ::rtl::OUString GetServiceName( sal_uInt16 nFamily ) const; |
| // HACK |
| |
| public: |
| |
| TYPEINFO(); |
| |
| SwXMLStylesContext_Impl( |
| SwXMLImport& rImport, sal_uInt16 nPrfx, |
| const OUString& rLName , |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList, |
| sal_Bool bAuto ); |
| virtual ~SwXMLStylesContext_Impl(); |
| |
| virtual sal_Bool InsertStyleFamily( sal_uInt16 nFamily ) const; |
| |
| virtual void EndElement(); |
| }; |
| |
| TYPEINIT1( SwXMLStylesContext_Impl, SvXMLStylesContext ); |
| |
| inline SwXMLItemSetStyleContext_Impl *SwXMLStylesContext_Impl::GetSwStyle( |
| sal_uInt16 i ) const |
| { |
| return PTR_CAST( SwXMLItemSetStyleContext_Impl, GetStyle( i ) ); |
| } |
| |
| SvXMLStyleContext *SwXMLStylesContext_Impl::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: |
| 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, *this, nFamily ); |
| break; |
| case XML_STYLE_FAMILY_SD_GRAPHICS_ID: |
| // As long as there are no element items, we can use the text |
| // style class. |
| pStyle = new XMLTextShapeStyleContext( GetImport(), nPrefix, |
| rLocalName, xAttrList, *this, nFamily ); |
| break; |
| default: |
| pStyle = SvXMLStylesContext::CreateStyleStyleChildContext( nFamily, |
| nPrefix, |
| rLocalName, |
| xAttrList ); |
| break; |
| } |
| |
| return pStyle; |
| } |
| |
| SvXMLStyleContext *SwXMLStylesContext_Impl::CreateDefaultStyleStyleChildContext( |
| 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_TABLE_TABLE: |
| case XML_STYLE_FAMILY_TABLE_ROW: |
| pStyle = new XMLTextStyleContext( GetImport(), nPrefix, rLocalName, |
| xAttrList, *this, nFamily, |
| sal_True ); |
| break; |
| case XML_STYLE_FAMILY_SD_GRAPHICS_ID: |
| // There are no writer specific defaults for graphic styles! |
| pStyle = new XMLGraphicsDefaultStyle( GetImport(), nPrefix, |
| rLocalName, xAttrList, *this ); |
| break; |
| default: |
| pStyle = SvXMLStylesContext::CreateDefaultStyleStyleChildContext( nFamily, |
| nPrefix, |
| rLocalName, |
| xAttrList ); |
| break; |
| } |
| |
| return pStyle; |
| } |
| |
| |
| SwXMLStylesContext_Impl::SwXMLStylesContext_Impl( |
| SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList, |
| sal_Bool bAuto ) : |
| SvXMLStylesContext( rImport, nPrfx, rLName, xAttrList, bAuto ) |
| { |
| } |
| |
| SwXMLStylesContext_Impl::~SwXMLStylesContext_Impl() |
| { |
| } |
| |
| 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: |
| case XML_STYLE_FAMILY_TEXT_FOOTNOTECONFIG: |
| case XML_STYLE_FAMILY_TEXT_ENDNOTECONFIG: |
| case XML_STYLE_FAMILY_TEXT_LINENUMBERINGCONFIG: |
| case XML_STYLE_FAMILY_TEXT_BIBLIOGRAPHYCONFIG: |
| bIns = !(rSwImport.IsInsertMode() || rSwImport.IsStylesOnlyMode() || |
| rSwImport.IsBlockMode()); |
| break; |
| default: |
| bIns = SvXMLStylesContext::InsertStyleFamily( nFamily ); |
| break; |
| } |
| |
| return bIns; |
| } |
| |
| UniReference < SvXMLImportPropertyMapper > SwXMLStylesContext_Impl::GetImportPropertyMapper( |
| sal_uInt16 nFamily ) const |
| { |
| UniReference < SvXMLImportPropertyMapper > xMapper; |
| if( nFamily == XML_STYLE_FAMILY_TABLE_TABLE ) |
| xMapper = XMLTextImportHelper::CreateTableDefaultExtPropMapper( |
| const_cast<SwXMLStylesContext_Impl*>( this )->GetImport() ); |
| else if( nFamily == XML_STYLE_FAMILY_TABLE_ROW ) |
| xMapper = XMLTextImportHelper::CreateTableRowDefaultExtPropMapper( |
| const_cast<SwXMLStylesContext_Impl*>( this )->GetImport() ); |
| else |
| xMapper = SvXMLStylesContext::GetImportPropertyMapper( nFamily ); |
| return xMapper; |
| } |
| |
| uno::Reference < container::XNameContainer > SwXMLStylesContext_Impl::GetStylesContainer( |
| sal_uInt16 nFamily ) const |
| { |
| uno::Reference < container::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; |
| } |
| |
| void SwXMLStylesContext_Impl::EndElement() |
| { |
| GetSwImport().InsertStyles( IsAutomaticStyle() ); |
| // --> OD 2006-10-11 #i69629# |
| // assign paragraph styles to list levels of outline style after all styles |
| // are imported and finished. |
| // if( !bAutoStyles ) |
| // GetImport().GetTextImport()->SetOutlineStyles( sal_True ); |
| // <-- |
| } |
| |
| // --------------------------------------------------------------------- |
| // |
| class SwXMLMasterStylesContext_Impl : public XMLTextMasterStylesContext |
| { |
| protected: |
| virtual sal_Bool InsertStyleFamily( sal_uInt16 nFamily ) const; |
| |
| SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); } |
| const SwXMLImport& GetSwImport() const |
| { return (const SwXMLImport&)GetImport(); } |
| |
| public: |
| |
| TYPEINFO(); |
| |
| SwXMLMasterStylesContext_Impl( |
| SwXMLImport& rImport, sal_uInt16 nPrfx, |
| const OUString& rLName , |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList ); |
| virtual ~SwXMLMasterStylesContext_Impl(); |
| virtual void EndElement(); |
| }; |
| |
| TYPEINIT1( SwXMLMasterStylesContext_Impl, XMLTextMasterStylesContext ); |
| |
| SwXMLMasterStylesContext_Impl::SwXMLMasterStylesContext_Impl( |
| SwXMLImport& rImport, sal_uInt16 nPrfx, |
| const OUString& rLName , |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList ) : |
| XMLTextMasterStylesContext( rImport, nPrfx, rLName, xAttrList ) |
| { |
| } |
| |
| SwXMLMasterStylesContext_Impl::~SwXMLMasterStylesContext_Impl() |
| { |
| } |
| |
| sal_Bool SwXMLMasterStylesContext_Impl::InsertStyleFamily( sal_uInt16 nFamily ) const |
| { |
| sal_Bool bIns; |
| |
| const SwXMLImport& rSwImport = GetSwImport(); |
| sal_uInt16 nStyleFamilyMask = rSwImport.GetStyleFamilyMask(); |
| if( XML_STYLE_FAMILY_MASTER_PAGE == nFamily ) |
| bIns = (nStyleFamilyMask & SFX_STYLE_FAMILY_PAGE) != 0; |
| else |
| bIns = XMLTextMasterStylesContext::InsertStyleFamily( nFamily ); |
| |
| return bIns; |
| } |
| |
| void SwXMLMasterStylesContext_Impl::EndElement() |
| { |
| FinishStyles( !GetSwImport().IsInsertMode() ); |
| GetSwImport().FinishStyles(); |
| } |
| // --------------------------------------------------------------------- |
| |
| SvXMLImportContext *SwXMLImport::CreateStylesContext( |
| const OUString& rLocalName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList, |
| sal_Bool bAuto ) |
| { |
| SvXMLStylesContext *pContext = |
| new SwXMLStylesContext_Impl( *this, XML_NAMESPACE_OFFICE, rLocalName, |
| xAttrList, bAuto ); |
| if( bAuto ) |
| SetAutoStyles( pContext ); |
| else |
| SetStyles( pContext ); |
| |
| return pContext; |
| } |
| |
| SvXMLImportContext *SwXMLImport::CreateMasterStylesContext( |
| const OUString& rLocalName, |
| const uno::Reference< xml::sax::XAttributeList > & xAttrList ) |
| { |
| SvXMLStylesContext *pContext = |
| new SwXMLMasterStylesContext_Impl( *this, XML_NAMESPACE_OFFICE, rLocalName, |
| xAttrList ); |
| SetMasterStyles( pContext ); |
| |
| return pContext; |
| } |
| |
| void SwXMLImport::InsertStyles( sal_Bool bAuto ) |
| { |
| if( bAuto && GetAutoStyles() ) |
| GetAutoStyles()->CopyAutoStylesToDoc(); |
| if( !bAuto && GetStyles() ) |
| GetStyles()->CopyStylesToDoc( !IsInsertMode(), sal_False ); |
| } |
| |
| void SwXMLImport::FinishStyles() |
| { |
| if( GetStyles() ) |
| GetStyles()->FinishStyles( !IsInsertMode() ); |
| } |
| |
| void SwXMLImport::UpdateTxtCollConditions( SwDoc *pDoc ) |
| { |
| if( !pDoc ) |
| pDoc = SwImport::GetDocFromXMLImport( *this ); |
| |
| const SwTxtFmtColls& rColls = *pDoc->GetTxtFmtColls(); |
| sal_uInt16 nCount = rColls.Count(); |
| for( sal_uInt16 i=0; i < nCount; i++ ) |
| { |
| SwTxtFmtColl *pColl = rColls[i]; |
| if( pColl && RES_CONDTXTFMTCOLL == pColl->Which() ) |
| { |
| const SwFmtCollConditions& rConditions = |
| ((const SwConditionTxtFmtColl *)pColl)->GetCondColls(); |
| sal_Bool bSendModify = sal_False; |
| for( sal_uInt16 j=0; j < rConditions.Count() && !bSendModify; j++ ) |
| { |
| const SwCollCondition& rCond = *rConditions[j]; |
| switch( rCond.GetCondition() ) |
| { |
| case PARA_IN_TABLEHEAD: |
| case PARA_IN_TABLEBODY: |
| case PARA_IN_FOOTER: |
| case PARA_IN_HEADER: |
| bSendModify = sal_True; |
| break; |
| } |
| } |
| if( bSendModify ) |
| { |
| SwCondCollCondChg aMsg( pColl ); |
| pColl->ModifyNotification( &aMsg, &aMsg ); |
| } |
| } |
| } |
| } |
| |
| sal_Bool SwXMLImport::FindAutomaticStyle( |
| sal_uInt16 nFamily, |
| const OUString& rName, |
| const SfxItemSet **ppItemSet, |
| OUString *pParent ) const |
| { |
| SwXMLItemSetStyleContext_Impl *pStyle = 0; |
| if( GetAutoStyles() ) |
| { |
| pStyle = PTR_CAST( SwXMLItemSetStyleContext_Impl, |
| GetAutoStyles()-> |
| FindStyleChildContext( nFamily, rName, |
| sal_True ) ); |
| if( pStyle ) |
| { |
| if( ppItemSet ) |
| { |
| if( XML_STYLE_FAMILY_TABLE_TABLE == pStyle->GetFamily() && |
| pStyle->HasMasterPageName() && |
| !pStyle->IsPageDescConnected() ) |
| pStyle->ConnectPageDesc(); |
| (*ppItemSet) = pStyle->GetItemSet(); |
| |
| // resolve data style name late |
| if( XML_STYLE_FAMILY_TABLE_CELL == pStyle->GetFamily() && |
| pStyle->ResolveDataStyleName() ) |
| { |
| (*ppItemSet) = pStyle->GetItemSet(); |
| } |
| |
| } |
| |
| if( pParent ) |
| *pParent = pStyle->GetParentName(); |
| } |
| } |
| |
| return pStyle != 0; |
| } |