xref: /AOO41X/main/xmloff/source/text/txtlists.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
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