update credits
[LibreOffice.git] / editeng / source / outliner / paralist.cxx
blobcbe10764790fdbd22acf8593d4e40592c2ac339c
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
21 #include <paralist.hxx>
23 #include <editeng/outliner.hxx> // only because of Paragraph, this must be changed!
24 #include <editeng/numdef.hxx>
26 #include <osl/diagnose.h>
27 #include <tools/debug.hxx>
29 DBG_NAME(Paragraph)
31 ParagraphData::ParagraphData()
32 : nDepth( -1 )
33 , mnNumberingStartValue( -1 )
34 , mbParaIsNumberingRestart( sal_False )
38 ParagraphData::ParagraphData( const ParagraphData& r )
39 : nDepth( r.nDepth )
40 , mnNumberingStartValue( r.mnNumberingStartValue )
41 , mbParaIsNumberingRestart( r.mbParaIsNumberingRestart )
45 ParagraphData& ParagraphData::operator=( const ParagraphData& r)
47 nDepth = r.nDepth;
48 mnNumberingStartValue = r.mnNumberingStartValue;
49 mbParaIsNumberingRestart = r.mbParaIsNumberingRestart;
50 return *this;
53 bool ParagraphData::operator==(const ParagraphData& rCandidate) const
55 return (nDepth == rCandidate.nDepth
56 && mnNumberingStartValue == rCandidate.mnNumberingStartValue
57 && mbParaIsNumberingRestart == rCandidate.mbParaIsNumberingRestart);
60 Paragraph::Paragraph( sal_Int16 nDDepth )
61 : aBulSize( -1, -1)
63 DBG_CTOR( Paragraph, 0 );
65 DBG_ASSERT( ( nDDepth >= -1 ) && ( nDDepth < SVX_MAX_NUM ), "Paragraph-CTOR: nDepth invalid!" );
67 nDepth = nDDepth;
68 nFlags = 0;
69 bVisible = sal_True;
72 Paragraph::Paragraph( const Paragraph& rPara )
73 : ParagraphData( rPara )
74 , aBulText( rPara.aBulText )
75 , aBulSize( rPara.aBulSize )
77 DBG_CTOR( Paragraph, 0 );
79 nDepth = rPara.nDepth;
80 nFlags = rPara.nFlags;
81 bVisible = rPara.bVisible;
84 Paragraph::Paragraph( const ParagraphData& rData )
85 : nFlags( 0 )
86 , aBulSize( -1, -1)
87 , bVisible( sal_True )
89 DBG_CTOR( Paragraph, 0 );
91 nDepth = rData.nDepth;
92 mnNumberingStartValue = rData.mnNumberingStartValue;
93 mbParaIsNumberingRestart = rData.mbParaIsNumberingRestart;
96 Paragraph::~Paragraph()
98 DBG_DTOR( Paragraph, 0 );
101 void Paragraph::SetNumberingStartValue( sal_Int16 nNumberingStartValue )
103 mnNumberingStartValue = nNumberingStartValue;
104 if( mnNumberingStartValue != -1 )
105 mbParaIsNumberingRestart = true;
108 void Paragraph::SetParaIsNumberingRestart( sal_Bool bParaIsNumberingRestart )
110 mbParaIsNumberingRestart = bParaIsNumberingRestart;
111 if( !mbParaIsNumberingRestart )
112 mnNumberingStartValue = -1;
115 void ParagraphList::Clear( sal_Bool bDestroyParagraphs )
117 if ( bDestroyParagraphs )
119 std::vector<Paragraph*>::iterator iter;
120 for (iter = maEntries.begin(); iter != maEntries.end(); ++iter)
121 delete *iter;
124 maEntries.clear();
127 void ParagraphList::Append( Paragraph* pPara)
129 SAL_WARN_IF( maEntries.size() >= EE_PARA_MAX_COUNT, "editeng", "ParagraphList::Append - overflow");
130 maEntries.push_back(pPara);
133 void ParagraphList::Insert( Paragraph* pPara, sal_Int32 nAbsPos)
135 SAL_WARN_IF( nAbsPos < 0 || (maEntries.size() < static_cast<size_t>(nAbsPos) && nAbsPos != EE_PARA_APPEND),
136 "editeng", "ParagraphList::Insert - bad insert position " << nAbsPos);
137 SAL_WARN_IF( maEntries.size() >= EE_PARA_MAX_COUNT, "editeng", "ParagraphList::Insert - overflow");
139 if (nAbsPos < 0 || maEntries.size() <= static_cast<size_t>(nAbsPos))
140 Append( pPara);
141 else
142 maEntries.insert(maEntries.begin()+nAbsPos,pPara);
145 void ParagraphList::Remove( sal_Int32 nPara )
147 if (nPara < 0 || maEntries.size() <= static_cast<size_t>(nPara))
149 SAL_WARN( "editeng", "ParagraphList::Remove - out of bounds " << nPara);
150 return;
153 maEntries.erase(maEntries.begin() + nPara );
156 void ParagraphList::MoveParagraphs( sal_Int32 nStart, sal_Int32 nDest, sal_Int32 _nCount )
158 OSL_ASSERT(static_cast<size_t>(nStart) < maEntries.size() && static_cast<size_t>(nDest) < maEntries.size());
160 if ( (( nDest < nStart ) || ( nDest >= ( nStart + _nCount ) )) && nStart >= 0 && nDest >= 0 && _nCount >= 0 )
162 std::vector<Paragraph*> aParas;
163 std::vector<Paragraph*>::iterator iterBeg = maEntries.begin() + nStart;
164 std::vector<Paragraph*>::iterator iterEnd = iterBeg + _nCount;
166 std::copy(iterBeg,iterEnd,std::back_inserter(aParas));
168 maEntries.erase(iterBeg,iterEnd);
170 if ( nDest > nStart )
171 nDest -= _nCount;
173 std::vector<Paragraph*>::iterator iterIns = maEntries.begin() + nDest;
175 std::copy(aParas.begin(),aParas.end(),std::inserter(maEntries,iterIns));
177 else
179 OSL_FAIL( "MoveParagraphs: Invalid Parameters" );
183 sal_Bool ParagraphList::HasChildren( Paragraph* pParagraph ) const
185 sal_Int32 n = GetAbsPos( pParagraph );
186 Paragraph* pNext = GetParagraph( ++n );
187 return ( pNext && ( pNext->GetDepth() > pParagraph->GetDepth() ) ) ? sal_True : sal_False;
190 sal_Bool ParagraphList::HasHiddenChildren( Paragraph* pParagraph ) const
192 sal_Int32 n = GetAbsPos( pParagraph );
193 Paragraph* pNext = GetParagraph( ++n );
194 return ( pNext && ( pNext->GetDepth() > pParagraph->GetDepth() ) && !pNext->IsVisible() ) ? sal_True : sal_False;
197 sal_Bool ParagraphList::HasVisibleChildren( Paragraph* pParagraph ) const
199 sal_Int32 n = GetAbsPos( pParagraph );
200 Paragraph* pNext = GetParagraph( ++n );
201 return ( pNext && ( pNext->GetDepth() > pParagraph->GetDepth() ) && pNext->IsVisible() ) ? sal_True : sal_False;
204 sal_Int32 ParagraphList::GetChildCount( Paragraph* pParent ) const
206 sal_Int32 nChildCount = 0;
207 sal_Int32 n = GetAbsPos( pParent );
208 Paragraph* pPara = GetParagraph( ++n );
209 while ( pPara && ( pPara->GetDepth() > pParent->GetDepth() ) )
211 nChildCount++;
212 pPara = GetParagraph( ++n );
214 return nChildCount;
217 Paragraph* ParagraphList::GetParent( Paragraph* pParagraph /*, sal_uInt16& rRelPos */ ) const
219 /* rRelPos = 0 */;
220 sal_Int32 n = GetAbsPos( pParagraph );
221 Paragraph* pPrev = GetParagraph( --n );
222 while ( pPrev && ( pPrev->GetDepth() >= pParagraph->GetDepth() ) )
224 // if ( pPrev->GetDepth() == pParagraph->GetDepth() )
225 // rRelPos++;
226 pPrev = GetParagraph( --n );
229 return pPrev;
232 void ParagraphList::Expand( Paragraph* pParent )
234 sal_Int32 nChildCount = GetChildCount( pParent );
235 sal_Int32 nPos = GetAbsPos( pParent );
237 for ( sal_Int32 n = 1; n <= nChildCount; n++ )
239 Paragraph* pPara = GetParagraph( nPos+n );
240 if ( !( pPara->IsVisible() ) )
242 pPara->bVisible = sal_True;
243 aVisibleStateChangedHdl.Call( pPara );
248 void ParagraphList::Collapse( Paragraph* pParent )
250 sal_Int32 nChildCount = GetChildCount( pParent );
251 sal_Int32 nPos = GetAbsPos( pParent );
253 for ( sal_Int32 n = 1; n <= nChildCount; n++ )
255 Paragraph* pPara = GetParagraph( nPos+n );
256 if ( pPara->IsVisible() )
258 pPara->bVisible = sal_False;
259 aVisibleStateChangedHdl.Call( pPara );
264 sal_Int32 ParagraphList::GetAbsPos( Paragraph* pParent ) const
266 sal_Int32 pos = 0;
267 std::vector<Paragraph*>::const_iterator iter;
268 for (iter = maEntries.begin(); iter != maEntries.end(); ++iter, ++pos)
270 if (*iter == pParent)
271 return pos;
274 return EE_PARA_NOT_FOUND;
277 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */