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