1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #include <txtlists.hxx> 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include <tools/debug.hxx> 33*cdf0e10cSrcweir #include <tools/date.hxx> 34*cdf0e10cSrcweir #include <tools/time.hxx> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <xmloff/txtimp.hxx> 37*cdf0e10cSrcweir #include <xmloff/xmlimp.hxx> 38*cdf0e10cSrcweir #include <xmloff/xmlnumi.hxx> 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir #include <com/sun/star/style/XStyle.hpp> 41*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 42*cdf0e10cSrcweir #include "XMLTextListItemContext.hxx" 43*cdf0e10cSrcweir #include "XMLTextListBlockContext.hxx" 44*cdf0e10cSrcweir #include "txtparai.hxx" 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir using namespace ::com::sun::star; 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir XMLTextListsHelper::XMLTextListsHelper() 51*cdf0e10cSrcweir : mpProcessedLists( 0 ), 52*cdf0e10cSrcweir msLastProcessedListId(), 53*cdf0e10cSrcweir msListStyleOfLastProcessedList(), 54*cdf0e10cSrcweir // --> OD 2008-08-15 #i92811# 55*cdf0e10cSrcweir mpMapListIdToListStyleDefaultListId( 0 ), 56*cdf0e10cSrcweir // <-- 57*cdf0e10cSrcweir mpContinuingLists( 0 ), 58*cdf0e10cSrcweir mpListStack( 0 ) 59*cdf0e10cSrcweir { 60*cdf0e10cSrcweir } 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir XMLTextListsHelper::~XMLTextListsHelper() 63*cdf0e10cSrcweir { 64*cdf0e10cSrcweir if ( mpProcessedLists ) 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir mpProcessedLists->clear(); 67*cdf0e10cSrcweir delete mpProcessedLists; 68*cdf0e10cSrcweir } 69*cdf0e10cSrcweir // --> OD 2008-08-15 #i92811# 70*cdf0e10cSrcweir if ( mpMapListIdToListStyleDefaultListId ) 71*cdf0e10cSrcweir { 72*cdf0e10cSrcweir mpMapListIdToListStyleDefaultListId->clear(); 73*cdf0e10cSrcweir delete mpMapListIdToListStyleDefaultListId; 74*cdf0e10cSrcweir } 75*cdf0e10cSrcweir // <-- 76*cdf0e10cSrcweir if ( mpContinuingLists ) 77*cdf0e10cSrcweir { 78*cdf0e10cSrcweir mpContinuingLists->clear(); 79*cdf0e10cSrcweir delete mpContinuingLists; 80*cdf0e10cSrcweir } 81*cdf0e10cSrcweir if ( mpListStack ) 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir mpListStack->clear(); 84*cdf0e10cSrcweir delete mpListStack; 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir } 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir void XMLTextListsHelper::PushListContext( 89*cdf0e10cSrcweir XMLTextListBlockContext *i_pListBlock) 90*cdf0e10cSrcweir { 91*cdf0e10cSrcweir // fprintf(stderr, "PushListContext\n"); 92*cdf0e10cSrcweir mListStack.push(::boost::make_tuple(i_pListBlock, 93*cdf0e10cSrcweir static_cast<XMLTextListItemContext*>(0), 94*cdf0e10cSrcweir static_cast<XMLNumberedParaContext*>(0))); 95*cdf0e10cSrcweir } 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir void XMLTextListsHelper::PushListContext( 98*cdf0e10cSrcweir XMLNumberedParaContext *i_pNumberedParagraph) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir // fprintf(stderr, "PushListContext(NP)\n"); 101*cdf0e10cSrcweir mListStack.push(::boost::make_tuple( 102*cdf0e10cSrcweir static_cast<XMLTextListBlockContext*>(0), 103*cdf0e10cSrcweir static_cast<XMLTextListItemContext*>(0), i_pNumberedParagraph)); 104*cdf0e10cSrcweir } 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir void XMLTextListsHelper::PopListContext() 107*cdf0e10cSrcweir { 108*cdf0e10cSrcweir OSL_ENSURE(mListStack.size(), 109*cdf0e10cSrcweir "internal error: PopListContext: mListStack empty"); 110*cdf0e10cSrcweir // fprintf(stderr, "PopListContext\n"); 111*cdf0e10cSrcweir if ( !mListStack.empty()) 112*cdf0e10cSrcweir mListStack.pop(); 113*cdf0e10cSrcweir } 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir void XMLTextListsHelper::ListContextTop( 116*cdf0e10cSrcweir XMLTextListBlockContext*& o_pListBlockContext, 117*cdf0e10cSrcweir XMLTextListItemContext*& o_pListItemContext, 118*cdf0e10cSrcweir XMLNumberedParaContext*& o_pNumberedParagraphContext ) 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir if ( !mListStack.empty() ) { 121*cdf0e10cSrcweir o_pListBlockContext = 122*cdf0e10cSrcweir static_cast<XMLTextListBlockContext*>(&mListStack.top().get<0>()); 123*cdf0e10cSrcweir o_pListItemContext = 124*cdf0e10cSrcweir static_cast<XMLTextListItemContext *>(&mListStack.top().get<1>()); 125*cdf0e10cSrcweir o_pNumberedParagraphContext = 126*cdf0e10cSrcweir static_cast<XMLNumberedParaContext *>(&mListStack.top().get<2>()); 127*cdf0e10cSrcweir } 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir void XMLTextListsHelper::SetListItem( XMLTextListItemContext *i_pListItem ) 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir // may be cleared by ListBlockContext for upper list... 133*cdf0e10cSrcweir if (i_pListItem) { 134*cdf0e10cSrcweir OSL_ENSURE(mListStack.size(), 135*cdf0e10cSrcweir "internal error: SetListItem: mListStack empty"); 136*cdf0e10cSrcweir OSL_ENSURE(mListStack.top().get<0>(), 137*cdf0e10cSrcweir "internal error: SetListItem: mListStack has no ListBlock"); 138*cdf0e10cSrcweir OSL_ENSURE(!mListStack.top().get<1>(), 139*cdf0e10cSrcweir "error: SetListItem: list item already exists"); 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir if ( !mListStack.empty() ) { 142*cdf0e10cSrcweir mListStack.top().get<1>() = i_pListItem; 143*cdf0e10cSrcweir } 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir // --> OD 2008-08-15 #i92811# - handling for parameter <sListStyleDefaultListId> 147*cdf0e10cSrcweir void XMLTextListsHelper::KeepListAsProcessed( ::rtl::OUString sListId, 148*cdf0e10cSrcweir ::rtl::OUString sListStyleName, 149*cdf0e10cSrcweir ::rtl::OUString sContinueListId, 150*cdf0e10cSrcweir ::rtl::OUString sListStyleDefaultListId ) 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir if ( IsListProcessed( sListId ) ) 153*cdf0e10cSrcweir { 154*cdf0e10cSrcweir DBG_ASSERT( false, 155*cdf0e10cSrcweir "<XMLTextListsHelper::KeepListAsProcessed(..)> - list id already added" ); 156*cdf0e10cSrcweir return; 157*cdf0e10cSrcweir } 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir if ( mpProcessedLists == 0 ) 160*cdf0e10cSrcweir { 161*cdf0e10cSrcweir mpProcessedLists = new tMapForLists(); 162*cdf0e10cSrcweir } 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir ::std::pair< ::rtl::OUString, ::rtl::OUString > 165*cdf0e10cSrcweir aListData( sListStyleName, sContinueListId ); 166*cdf0e10cSrcweir (*mpProcessedLists)[ sListId ] = aListData; 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir msLastProcessedListId = sListId; 169*cdf0e10cSrcweir msListStyleOfLastProcessedList = sListStyleName; 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir // --> OD 2008-08-15 #i92811# 172*cdf0e10cSrcweir if ( sListStyleDefaultListId.getLength() != 0 ) 173*cdf0e10cSrcweir { 174*cdf0e10cSrcweir if ( mpMapListIdToListStyleDefaultListId == 0 ) 175*cdf0e10cSrcweir { 176*cdf0e10cSrcweir mpMapListIdToListStyleDefaultListId = new tMapForLists(); 177*cdf0e10cSrcweir } 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir if ( mpMapListIdToListStyleDefaultListId->find( sListStyleName ) == 180*cdf0e10cSrcweir mpMapListIdToListStyleDefaultListId->end() ) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir ::std::pair< ::rtl::OUString, ::rtl::OUString > 183*cdf0e10cSrcweir aListIdMapData( sListId, sListStyleDefaultListId ); 184*cdf0e10cSrcweir (*mpMapListIdToListStyleDefaultListId)[ sListStyleName ] = 185*cdf0e10cSrcweir aListIdMapData; 186*cdf0e10cSrcweir } 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir // <-- 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir sal_Bool XMLTextListsHelper::IsListProcessed( const ::rtl::OUString sListId ) const 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir if ( mpProcessedLists == 0 ) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir return sal_False; 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir return mpProcessedLists->find( sListId ) != mpProcessedLists->end(); 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir ::rtl::OUString XMLTextListsHelper::GetListStyleOfProcessedList( 202*cdf0e10cSrcweir const ::rtl::OUString sListId ) const 203*cdf0e10cSrcweir { 204*cdf0e10cSrcweir if ( mpProcessedLists != 0 ) 205*cdf0e10cSrcweir { 206*cdf0e10cSrcweir tMapForLists::const_iterator aIter = mpProcessedLists->find( sListId ); 207*cdf0e10cSrcweir if ( aIter != mpProcessedLists->end() ) 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir return (*aIter).second.first; 210*cdf0e10cSrcweir } 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir return ::rtl::OUString(); 214*cdf0e10cSrcweir } 215*cdf0e10cSrcweir 216*cdf0e10cSrcweir ::rtl::OUString XMLTextListsHelper::GetContinueListIdOfProcessedList( 217*cdf0e10cSrcweir const ::rtl::OUString sListId ) const 218*cdf0e10cSrcweir { 219*cdf0e10cSrcweir if ( mpProcessedLists != 0 ) 220*cdf0e10cSrcweir { 221*cdf0e10cSrcweir tMapForLists::const_iterator aIter = mpProcessedLists->find( sListId ); 222*cdf0e10cSrcweir if ( aIter != mpProcessedLists->end() ) 223*cdf0e10cSrcweir { 224*cdf0e10cSrcweir return (*aIter).second.second; 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir } 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir return ::rtl::OUString(); 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir const ::rtl::OUString& XMLTextListsHelper::GetLastProcessedListId() const 232*cdf0e10cSrcweir { 233*cdf0e10cSrcweir return msLastProcessedListId; 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir const ::rtl::OUString& XMLTextListsHelper::GetListStyleOfLastProcessedList() const 237*cdf0e10cSrcweir { 238*cdf0e10cSrcweir return msListStyleOfLastProcessedList; 239*cdf0e10cSrcweir } 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir ::rtl::OUString XMLTextListsHelper::GenerateNewListId() const 242*cdf0e10cSrcweir { 243*cdf0e10cSrcweir // --> OD 2008-08-06 #i92478# 244*cdf0e10cSrcweir ::rtl::OUString sTmpStr( ::rtl::OUString::createFromAscii( "list" ) ); 245*cdf0e10cSrcweir // <-- 246*cdf0e10cSrcweir sal_Int64 n = Time().GetTime(); 247*cdf0e10cSrcweir n += Date().GetDate(); 248*cdf0e10cSrcweir n += rand(); 249*cdf0e10cSrcweir // --> OD 2008-08-06 #i92478# 250*cdf0e10cSrcweir sTmpStr += ::rtl::OUString::valueOf( n ); 251*cdf0e10cSrcweir // <-- 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir long nHitCount = 0; 254*cdf0e10cSrcweir ::rtl::OUString sNewListId( sTmpStr ); 255*cdf0e10cSrcweir if ( mpProcessedLists != 0 ) 256*cdf0e10cSrcweir { 257*cdf0e10cSrcweir while ( mpProcessedLists->find( sNewListId ) != mpProcessedLists->end() ) 258*cdf0e10cSrcweir { 259*cdf0e10cSrcweir ++nHitCount; 260*cdf0e10cSrcweir sNewListId = sTmpStr; 261*cdf0e10cSrcweir sNewListId += ::rtl::OUString::valueOf( nHitCount ); 262*cdf0e10cSrcweir } 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir 265*cdf0e10cSrcweir return sNewListId; 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir 268*cdf0e10cSrcweir // --> OD 2008-08-15 #i92811# 269*cdf0e10cSrcweir // provide list id for a certain list block for import 270*cdf0e10cSrcweir ::rtl::OUString XMLTextListsHelper::GetListIdForListBlock( XMLTextListBlockContext& rListBlock ) 271*cdf0e10cSrcweir { 272*cdf0e10cSrcweir ::rtl::OUString sListBlockListId( rListBlock.GetContinueListId() ); 273*cdf0e10cSrcweir if ( sListBlockListId.getLength() == 0 ) 274*cdf0e10cSrcweir { 275*cdf0e10cSrcweir sListBlockListId = rListBlock.GetListId(); 276*cdf0e10cSrcweir } 277*cdf0e10cSrcweir 278*cdf0e10cSrcweir if ( mpMapListIdToListStyleDefaultListId != 0 ) 279*cdf0e10cSrcweir { 280*cdf0e10cSrcweir if ( sListBlockListId.getLength() != 0 ) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir const ::rtl::OUString sListStyleName = 283*cdf0e10cSrcweir GetListStyleOfProcessedList( sListBlockListId ); 284*cdf0e10cSrcweir 285*cdf0e10cSrcweir tMapForLists::const_iterator aIter = 286*cdf0e10cSrcweir mpMapListIdToListStyleDefaultListId->find( sListStyleName ); 287*cdf0e10cSrcweir if ( aIter != mpMapListIdToListStyleDefaultListId->end() ) 288*cdf0e10cSrcweir { 289*cdf0e10cSrcweir if ( (*aIter).second.first == sListBlockListId ) 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir sListBlockListId = (*aIter).second.second; 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir } 294*cdf0e10cSrcweir } 295*cdf0e10cSrcweir } 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir return sListBlockListId; 298*cdf0e10cSrcweir } 299*cdf0e10cSrcweir // <-- 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir void XMLTextListsHelper::StoreLastContinuingList( ::rtl::OUString sListId, 302*cdf0e10cSrcweir ::rtl::OUString sContinuingListId ) 303*cdf0e10cSrcweir { 304*cdf0e10cSrcweir if ( mpContinuingLists == 0 ) 305*cdf0e10cSrcweir { 306*cdf0e10cSrcweir mpContinuingLists = new tMapForContinuingLists(); 307*cdf0e10cSrcweir } 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir (*mpContinuingLists)[ sListId ] = sContinuingListId; 310*cdf0e10cSrcweir } 311*cdf0e10cSrcweir 312*cdf0e10cSrcweir ::rtl::OUString XMLTextListsHelper::GetLastContinuingListId( 313*cdf0e10cSrcweir ::rtl::OUString sListId ) const 314*cdf0e10cSrcweir { 315*cdf0e10cSrcweir if ( mpContinuingLists != 0) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir tMapForContinuingLists::const_iterator aIter = 318*cdf0e10cSrcweir mpContinuingLists->find( sListId ); 319*cdf0e10cSrcweir if ( aIter != mpContinuingLists->end() ) 320*cdf0e10cSrcweir { 321*cdf0e10cSrcweir return (*aIter).second; 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir } 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir return sListId; 326*cdf0e10cSrcweir } 327*cdf0e10cSrcweir 328*cdf0e10cSrcweir void XMLTextListsHelper::PushListOnStack( ::rtl::OUString sListId, 329*cdf0e10cSrcweir ::rtl::OUString sListStyleName ) 330*cdf0e10cSrcweir { 331*cdf0e10cSrcweir if ( mpListStack == 0 ) 332*cdf0e10cSrcweir { 333*cdf0e10cSrcweir mpListStack = new tStackForLists(); 334*cdf0e10cSrcweir } 335*cdf0e10cSrcweir ::std::pair< ::rtl::OUString, ::rtl::OUString > 336*cdf0e10cSrcweir aListData( sListId, sListStyleName ); 337*cdf0e10cSrcweir mpListStack->push_back( aListData ); 338*cdf0e10cSrcweir } 339*cdf0e10cSrcweir void XMLTextListsHelper::PopListFromStack() 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir if ( mpListStack != 0 && 342*cdf0e10cSrcweir mpListStack->size() > 0 ) 343*cdf0e10cSrcweir { 344*cdf0e10cSrcweir mpListStack->pop_back(); 345*cdf0e10cSrcweir } 346*cdf0e10cSrcweir } 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir sal_Bool XMLTextListsHelper::EqualsToTopListStyleOnStack( const ::rtl::OUString sListId ) const 349*cdf0e10cSrcweir { 350*cdf0e10cSrcweir return mpListStack != 0 351*cdf0e10cSrcweir ? sListId == mpListStack->back().second 352*cdf0e10cSrcweir : sal_False; 353*cdf0e10cSrcweir } 354*cdf0e10cSrcweir 355*cdf0e10cSrcweir ::rtl::OUString 356*cdf0e10cSrcweir XMLTextListsHelper::GetNumberedParagraphListId( 357*cdf0e10cSrcweir const sal_uInt16 i_Level, 358*cdf0e10cSrcweir const ::rtl::OUString i_StyleName) 359*cdf0e10cSrcweir { 360*cdf0e10cSrcweir if (!i_StyleName.getLength()) { 361*cdf0e10cSrcweir OSL_ENSURE(false, "invalid numbered-paragraph: no style-name"); 362*cdf0e10cSrcweir } 363*cdf0e10cSrcweir if (i_StyleName.getLength() 364*cdf0e10cSrcweir && (i_Level < mLastNumberedParagraphs.size()) 365*cdf0e10cSrcweir && (mLastNumberedParagraphs[i_Level].first == i_StyleName) ) 366*cdf0e10cSrcweir { 367*cdf0e10cSrcweir OSL_ENSURE(mLastNumberedParagraphs[i_Level].second.getLength(), 368*cdf0e10cSrcweir "internal error: numbered-paragraph style-name but no list-id?"); 369*cdf0e10cSrcweir return mLastNumberedParagraphs[i_Level].second; 370*cdf0e10cSrcweir } else { 371*cdf0e10cSrcweir return GenerateNewListId(); 372*cdf0e10cSrcweir } 373*cdf0e10cSrcweir } 374*cdf0e10cSrcweir 375*cdf0e10cSrcweir static void 376*cdf0e10cSrcweir ClampLevel(uno::Reference<container::XIndexReplace> const& i_xNumRules, 377*cdf0e10cSrcweir sal_Int16 & io_rLevel) 378*cdf0e10cSrcweir { 379*cdf0e10cSrcweir OSL_ENSURE(i_xNumRules.is(), "internal error: ClampLevel: NumRules null"); 380*cdf0e10cSrcweir if (i_xNumRules.is()) { 381*cdf0e10cSrcweir const sal_Int32 nLevelCount( i_xNumRules->getCount() ); 382*cdf0e10cSrcweir if ( io_rLevel >= nLevelCount ) { 383*cdf0e10cSrcweir io_rLevel = sal::static_int_cast< sal_Int16 >(nLevelCount-1); 384*cdf0e10cSrcweir } 385*cdf0e10cSrcweir } 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir 388*cdf0e10cSrcweir uno::Reference<container::XIndexReplace> 389*cdf0e10cSrcweir XMLTextListsHelper::EnsureNumberedParagraph( 390*cdf0e10cSrcweir SvXMLImport & i_rImport, 391*cdf0e10cSrcweir const ::rtl::OUString i_ListId, 392*cdf0e10cSrcweir sal_Int16 & io_rLevel, const ::rtl::OUString i_StyleName) 393*cdf0e10cSrcweir { 394*cdf0e10cSrcweir OSL_ENSURE(i_ListId.getLength(), "inavlid ListId"); 395*cdf0e10cSrcweir OSL_ENSURE(io_rLevel >= 0, "inavlid Level"); 396*cdf0e10cSrcweir NumParaList_t & rNPList( mNPLists[i_ListId] ); 397*cdf0e10cSrcweir const ::rtl::OUString none; // default 398*cdf0e10cSrcweir if ( rNPList.empty() && (0 != io_rLevel)) { 399*cdf0e10cSrcweir // create default list style for top level 400*cdf0e10cSrcweir sal_Int16 lev(0); 401*cdf0e10cSrcweir rNPList.push_back(::std::make_pair(none, 402*cdf0e10cSrcweir MakeNumRule(i_rImport, 0, none, none, lev) )); 403*cdf0e10cSrcweir } 404*cdf0e10cSrcweir // create num rule first because this might clamp the level... 405*cdf0e10cSrcweir uno::Reference<container::XIndexReplace> xNumRules; 406*cdf0e10cSrcweir if ((0 == io_rLevel) || rNPList.empty() || i_StyleName.getLength()) { 407*cdf0e10cSrcweir // no parent to inherit from, or explicit style given => new numrules! 408*cdf0e10cSrcweir // index of parent: level - 1, but maybe that does not exist 409*cdf0e10cSrcweir const size_t parent( std::min(static_cast<size_t>(io_rLevel), 410*cdf0e10cSrcweir rNPList.size()) - 1 ); 411*cdf0e10cSrcweir xNumRules = MakeNumRule(i_rImport, 412*cdf0e10cSrcweir io_rLevel > 0 ? rNPList[parent].second : 0, 413*cdf0e10cSrcweir io_rLevel > 0 ? rNPList[parent].first : none, 414*cdf0e10cSrcweir i_StyleName, io_rLevel); 415*cdf0e10cSrcweir } else { 416*cdf0e10cSrcweir // no style given, but has a parent => reuse parent numrules! 417*cdf0e10cSrcweir ClampLevel(rNPList.back().second, io_rLevel); 418*cdf0e10cSrcweir } 419*cdf0e10cSrcweir if (static_cast<sal_uInt16>(io_rLevel) + 1U > rNPList.size()) { 420*cdf0e10cSrcweir // new level: need to enlarge 421*cdf0e10cSrcweir for (size_t i = rNPList.size(); 422*cdf0e10cSrcweir i < static_cast<size_t>(io_rLevel); ++i) { 423*cdf0e10cSrcweir rNPList.push_back(rNPList.back()); 424*cdf0e10cSrcweir } 425*cdf0e10cSrcweir rNPList.push_back(xNumRules.is() 426*cdf0e10cSrcweir ? ::std::make_pair(i_StyleName, xNumRules) 427*cdf0e10cSrcweir : rNPList.back()); 428*cdf0e10cSrcweir } else { 429*cdf0e10cSrcweir // old level: no need to enlarge; possibly shrink 430*cdf0e10cSrcweir if (xNumRules.is()) { 431*cdf0e10cSrcweir rNPList[io_rLevel] = std::make_pair(i_StyleName, xNumRules); 432*cdf0e10cSrcweir } 433*cdf0e10cSrcweir if (static_cast<sal_uInt16>(io_rLevel) + 1U < rNPList.size()) { 434*cdf0e10cSrcweir rNPList.erase(rNPList.begin() + io_rLevel + 1, rNPList.end()); 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir } 437*cdf0e10cSrcweir // remember the list id 438*cdf0e10cSrcweir if (mLastNumberedParagraphs.size() <= static_cast<size_t>(io_rLevel)) { 439*cdf0e10cSrcweir mLastNumberedParagraphs.resize(io_rLevel+1); 440*cdf0e10cSrcweir } 441*cdf0e10cSrcweir mLastNumberedParagraphs[io_rLevel] = std::make_pair(i_StyleName, i_ListId); 442*cdf0e10cSrcweir return rNPList.back().second; 443*cdf0e10cSrcweir } 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir /** extracted from the XMLTextListBlockContext constructor */ 446*cdf0e10cSrcweir uno::Reference<container::XIndexReplace> 447*cdf0e10cSrcweir XMLTextListsHelper::MakeNumRule( 448*cdf0e10cSrcweir SvXMLImport & i_rImport, 449*cdf0e10cSrcweir const uno::Reference<container::XIndexReplace>& i_rNumRule, 450*cdf0e10cSrcweir const ::rtl::OUString i_ParentStyleName, 451*cdf0e10cSrcweir const ::rtl::OUString i_StyleName, 452*cdf0e10cSrcweir sal_Int16 & io_rLevel, 453*cdf0e10cSrcweir sal_Bool* o_pRestartNumbering, 454*cdf0e10cSrcweir sal_Bool* io_pSetDefaults) 455*cdf0e10cSrcweir { 456*cdf0e10cSrcweir static ::rtl::OUString s_NumberingRules( 457*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM("NumberingRules")); 458*cdf0e10cSrcweir uno::Reference<container::XIndexReplace> xNumRules(i_rNumRule); 459*cdf0e10cSrcweir if ( i_StyleName.getLength() && 460*cdf0e10cSrcweir i_StyleName != i_ParentStyleName ) 461*cdf0e10cSrcweir { 462*cdf0e10cSrcweir const ::rtl::OUString sDisplayStyleName( 463*cdf0e10cSrcweir i_rImport.GetStyleDisplayName( XML_STYLE_FAMILY_TEXT_LIST, 464*cdf0e10cSrcweir i_StyleName) ); 465*cdf0e10cSrcweir const uno::Reference < container::XNameContainer >& rNumStyles( 466*cdf0e10cSrcweir i_rImport.GetTextImport()->GetNumberingStyles() ); 467*cdf0e10cSrcweir if( rNumStyles.is() && rNumStyles->hasByName( sDisplayStyleName ) ) 468*cdf0e10cSrcweir { 469*cdf0e10cSrcweir uno::Reference < style::XStyle > xStyle; 470*cdf0e10cSrcweir uno::Any any = rNumStyles->getByName( sDisplayStyleName ); 471*cdf0e10cSrcweir any >>= xStyle; 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir // --> OD 2008-05-07 #refactorlists# - no longer needed 474*cdf0e10cSrcweir // // If the style has not been used, the restart numbering has 475*cdf0e10cSrcweir // // to be set never. 476*cdf0e10cSrcweir // if ( mbRestartNumbering && !xStyle->isInUse() ) 477*cdf0e10cSrcweir // { 478*cdf0e10cSrcweir // mbRestartNumbering = sal_False; 479*cdf0e10cSrcweir // } 480*cdf0e10cSrcweir // <-- 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet( xStyle, 483*cdf0e10cSrcweir uno::UNO_QUERY ); 484*cdf0e10cSrcweir any = xPropSet->getPropertyValue(s_NumberingRules); 485*cdf0e10cSrcweir any >>= xNumRules; 486*cdf0e10cSrcweir } 487*cdf0e10cSrcweir else 488*cdf0e10cSrcweir { 489*cdf0e10cSrcweir const SvxXMLListStyleContext *pListStyle( 490*cdf0e10cSrcweir i_rImport.GetTextImport()->FindAutoListStyle( i_StyleName ) ); 491*cdf0e10cSrcweir if( pListStyle ) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir xNumRules = pListStyle->GetNumRules(); 494*cdf0e10cSrcweir // --> OD 2008-05-07 #refactorlists# - no longer needed 495*cdf0e10cSrcweir // sal_Bool bUsed = mxNumRules.is(); 496*cdf0e10cSrcweir // <-- 497*cdf0e10cSrcweir if( !xNumRules.is() ) 498*cdf0e10cSrcweir { 499*cdf0e10cSrcweir pListStyle->CreateAndInsertAuto(); 500*cdf0e10cSrcweir xNumRules = pListStyle->GetNumRules(); 501*cdf0e10cSrcweir } 502*cdf0e10cSrcweir // --> OD 2008-05-07 #refactorlists# - no longer needed 503*cdf0e10cSrcweir // if( mbRestartNumbering && !bUsed ) 504*cdf0e10cSrcweir // mbRestartNumbering = sal_False; 505*cdf0e10cSrcweir // <-- 506*cdf0e10cSrcweir } 507*cdf0e10cSrcweir } 508*cdf0e10cSrcweir } 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir sal_Bool bSetDefaults(io_pSetDefaults ? *io_pSetDefaults : sal_False); 511*cdf0e10cSrcweir if ( !xNumRules.is() ) 512*cdf0e10cSrcweir { 513*cdf0e10cSrcweir // If no style name has been specified for this style and for any 514*cdf0e10cSrcweir // parent or if no num rule with the specified name exists, 515*cdf0e10cSrcweir // create a new one. 516*cdf0e10cSrcweir 517*cdf0e10cSrcweir xNumRules = 518*cdf0e10cSrcweir SvxXMLListStyleContext::CreateNumRule( i_rImport.GetModel() ); 519*cdf0e10cSrcweir DBG_ASSERT( xNumRules.is(), "got no numbering rule" ); 520*cdf0e10cSrcweir if ( !xNumRules.is() ) 521*cdf0e10cSrcweir return xNumRules; 522*cdf0e10cSrcweir 523*cdf0e10cSrcweir // Because it is a new num rule, numbering must not be restarted. 524*cdf0e10cSrcweir if (o_pRestartNumbering) *o_pRestartNumbering = sal_False; 525*cdf0e10cSrcweir bSetDefaults = sal_True; 526*cdf0e10cSrcweir if (io_pSetDefaults) *io_pSetDefaults = bSetDefaults; 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir ClampLevel(xNumRules, io_rLevel); 530*cdf0e10cSrcweir 531*cdf0e10cSrcweir if ( bSetDefaults ) 532*cdf0e10cSrcweir { 533*cdf0e10cSrcweir // Because there is no list style sheet for this style, a default 534*cdf0e10cSrcweir // format must be set for any level of this num rule. 535*cdf0e10cSrcweir SvxXMLListStyleContext::SetDefaultStyle( xNumRules, io_rLevel, 536*cdf0e10cSrcweir sal_False ); 537*cdf0e10cSrcweir } 538*cdf0e10cSrcweir 539*cdf0e10cSrcweir return xNumRules; 540*cdf0e10cSrcweir } 541*cdf0e10cSrcweir 542