/************************************************************** * * 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_xmloff.hxx" #include #include #include #include #include #include #include #include #include "xmloff/xmlnmspe.hxx" #include #include "XMLTextListItemContext.hxx" #include "XMLTextListBlockContext.hxx" #include "txtlists.hxx" using ::rtl::OUString; using ::rtl::OUStringBuffer; 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 ::com::sun::star::beans; using namespace ::xmloff::token; TYPEINIT1( XMLTextListBlockContext, SvXMLImportContext ); // OD 2008-05-07 #refactorlists# // add optional parameter and its handling XMLTextListBlockContext::XMLTextListBlockContext( SvXMLImport& rImport, XMLTextImportHelper& rTxtImp, sal_uInt16 nPrfx, const OUString& rLName, const Reference< xml::sax::XAttributeList > & xAttrList, const sal_Bool bRestartNumberingAtSubList ) : SvXMLImportContext( rImport, nPrfx, rLName ) , mrTxtImport( rTxtImp ) // --> OD 2008-04-22 #refactorlists# , msListStyleName() // <-- , mxParentListBlock( ) , mnLevel( 0 ) // --> OD 2008-05-07 #refactorlists# //, mbRestartNumbering( sal_True ) , mbRestartNumbering( sal_False ) // <-- , mbSetDefaults( sal_False ) // --> OD 2008-04-22 #refactorlists# , msListId() , msContinueListId() // <-- { static ::rtl::OUString s_PropNameDefaultListId( RTL_CONSTASCII_USTRINGPARAM("DefaultListId")); { // get the parent list block context (if any); this is a bit ugly... XMLTextListBlockContext * pLB(0); XMLTextListItemContext * pLI(0); XMLNumberedParaContext * pNP(0); rTxtImp.GetTextListHelper().ListContextTop(pLB, pLI, pNP); mxParentListBlock = pLB; } // Inherit style name from parent list, as well as the flags whether // numbering must be restarted and formats have to be created. OUString sParentListStyleName; // --> OD 2008-11-27 #158694# sal_Bool bParentRestartNumbering( sal_False ); // <-- if( mxParentListBlock.Is() ) { XMLTextListBlockContext *pParent = (XMLTextListBlockContext *)&mxParentListBlock; msListStyleName = pParent->GetListStyleName(); sParentListStyleName = msListStyleName; mxNumRules = pParent->GetNumRules(); mnLevel = pParent->GetLevel() + 1; // --> OD 2008-05-07 #refactorlists# // mbRestartNumbering = pParent->IsRestartNumbering(); mbRestartNumbering = pParent->IsRestartNumbering() || bRestartNumberingAtSubList; // <-- // --> OD 2008-11-27 #158694# bParentRestartNumbering = pParent->IsRestartNumbering(); // <-- mbSetDefaults = pParent->mbSetDefaults; // --> OD 2008-04-22 #refactorlists# msListId = pParent->GetListId(); msContinueListId = pParent->GetContinueListId(); // <-- } const SvXMLTokenMap& rTokenMap = mrTxtImport.GetTextListBlockAttrTokenMap(); // --> OD 2008-05-07 #refactorlists# bool bIsContinueNumberingAttributePresent( false ); // <-- sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; for( sal_Int16 i=0; i < nAttrCount; i++ ) { const OUString& rAttrName = xAttrList->getNameByIndex( i ); const OUString& rValue = xAttrList->getValueByIndex( i ); OUString aLocalName; sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName ); switch( rTokenMap.Get( nPrefix, aLocalName ) ) { case XML_TOK_TEXT_LIST_BLOCK_XMLID: sXmlId = rValue; //FIXME: there is no UNO API for lists // --> OD 2008-07-31 #i92221# - xml:id is also the list ID if ( mnLevel == 0 ) // root element { msListId = rValue; } // <-- break; case XML_TOK_TEXT_LIST_BLOCK_CONTINUE_NUMBERING: mbRestartNumbering = !IsXMLToken(rValue, XML_TRUE); // --> OD 2008-05-07 #refactorlists# bIsContinueNumberingAttributePresent = true; // <-- break; case XML_TOK_TEXT_LIST_BLOCK_STYLE_NAME: msListStyleName = rValue; break; // --> OD 2008-04-22 #refactorlists# case XML_TOK_TEXT_LIST_BLOCK_CONTINUE_LIST: if ( mnLevel == 0 ) // root element { msContinueListId = rValue; } break; } } mxNumRules = XMLTextListsHelper::MakeNumRule(GetImport(), mxNumRules, sParentListStyleName, msListStyleName, mnLevel, &mbRestartNumbering, &mbSetDefaults ); if( !mxNumRules.is() ) return; // --> OD 2008-04-23 #refactorlists# if ( mnLevel == 0 ) // root element { XMLTextListsHelper& rTextListsHelper( mrTxtImport.GetTextListHelper() ); // --> OD 2008-08-15 #i92811# ::rtl::OUString sListStyleDefaultListId; { uno::Reference< beans::XPropertySet > xNumRuleProps( mxNumRules, UNO_QUERY ); if ( xNumRuleProps.is() ) { uno::Reference< beans::XPropertySetInfo > xNumRulePropSetInfo( xNumRuleProps->getPropertySetInfo()); if (xNumRulePropSetInfo.is() && xNumRulePropSetInfo->hasPropertyByName( s_PropNameDefaultListId)) { xNumRuleProps->getPropertyValue(s_PropNameDefaultListId) >>= sListStyleDefaultListId; DBG_ASSERT( sListStyleDefaultListId.getLength() != 0, "no default list id found at numbering rules instance. Serious defect -> please inform OD." ); } } } // <-- if ( msListId.getLength() == 0 ) // no text:id property found { sal_Int32 nUPD( 0 ); sal_Int32 nBuild( 0 ); const bool bBuildIdFound = GetImport().getBuildIds( nUPD, nBuild ); if ( rImport.IsTextDocInOOoFileFormat() || ( bBuildIdFound && nUPD == 680 ) ) { // handling former documents written by OpenOffice.org: // use default list id of numbering rules instance, if existing // --> OD 2008-08-15 #i92811# if ( sListStyleDefaultListId.getLength() != 0 ) { msListId = sListStyleDefaultListId; if ( !bIsContinueNumberingAttributePresent && !mbRestartNumbering && rTextListsHelper.IsListProcessed( msListId ) ) { mbRestartNumbering = sal_True; } } // <-- } if ( msListId.getLength() == 0 ) { // generate a new list id for the list msListId = rTextListsHelper.GenerateNewListId(); } } if ( bIsContinueNumberingAttributePresent && !mbRestartNumbering && msContinueListId.getLength() == 0 ) { ::rtl::OUString Last( rTextListsHelper.GetLastProcessedListId() ); if ( rTextListsHelper.GetListStyleOfLastProcessedList() == msListStyleName && Last != msListId ) { msContinueListId = Last; } } if ( msContinueListId.getLength() > 0 ) { if ( !rTextListsHelper.IsListProcessed( msContinueListId ) ) { msContinueListId = ::rtl::OUString(); } else { // search continue list chain for master list and // continue the master list. ::rtl::OUString sTmpStr = rTextListsHelper.GetContinueListIdOfProcessedList( msContinueListId ); while ( sTmpStr.getLength() > 0 ) { msContinueListId = sTmpStr; sTmpStr = rTextListsHelper.GetContinueListIdOfProcessedList( msContinueListId ); } } } if ( !rTextListsHelper.IsListProcessed( msListId ) ) { // --> OD 2008-08-15 #i92811# rTextListsHelper.KeepListAsProcessed( msListId, msListStyleName, msContinueListId, sListStyleDefaultListId ); // <-- } } // <-- // Remember this list block. mrTxtImport.GetTextListHelper().PushListContext( this ); } XMLTextListBlockContext::~XMLTextListBlockContext() { } void XMLTextListBlockContext::EndElement() { // Numbering has not to be restarted if it has been restarted within // a child list. XMLTextListBlockContext *pParent = (XMLTextListBlockContext *)&mxParentListBlock; if( pParent ) { pParent->mbRestartNumbering = mbRestartNumbering; } // Restore current list block. mrTxtImport.GetTextListHelper().PopListContext(); // Any paragraph following the list within the same list item must not // be numbered. mrTxtImport.GetTextListHelper().SetListItem( 0 ); } SvXMLImportContext *XMLTextListBlockContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< xml::sax::XAttributeList > & xAttrList ) { SvXMLImportContext *pContext = 0; const SvXMLTokenMap& rTokenMap = mrTxtImport.GetTextListBlockElemTokenMap(); sal_Bool bHeader = sal_False; switch( rTokenMap.Get( nPrefix, rLocalName ) ) { case XML_TOK_TEXT_LIST_HEADER: bHeader = sal_True; case XML_TOK_TEXT_LIST_ITEM: pContext = new XMLTextListItemContext( GetImport(), mrTxtImport, nPrefix, rLocalName, xAttrList, bHeader ); break; } if( !pContext ) pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); return pContext; } // --> OD 2008-04-22 #refactorlists# const ::rtl::OUString& XMLTextListBlockContext::GetListId() const { return msListId; } const ::rtl::OUString& XMLTextListBlockContext::GetContinueListId() const { return msContinueListId; } // <--