/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ #include #include // only because of Paragraph, this must be changed! #include #include #include DBG_NAME(Paragraph) ParagraphData::ParagraphData() : nDepth( -1 ) , mnNumberingStartValue( -1 ) , mbParaIsNumberingRestart( sal_False ) { } ParagraphData::ParagraphData( const ParagraphData& r ) : nDepth( r.nDepth ) , mnNumberingStartValue( r.mnNumberingStartValue ) , mbParaIsNumberingRestart( r.mbParaIsNumberingRestart ) { } ParagraphData& ParagraphData::operator=( const ParagraphData& r) { nDepth = r.nDepth; mnNumberingStartValue = r.mnNumberingStartValue; mbParaIsNumberingRestart = r.mbParaIsNumberingRestart; return *this; } bool ParagraphData::operator==(const ParagraphData& rCandidate) const { return (nDepth == rCandidate.nDepth && mnNumberingStartValue == rCandidate.mnNumberingStartValue && mbParaIsNumberingRestart == rCandidate.mbParaIsNumberingRestart); } Paragraph::Paragraph( sal_Int16 nDDepth ) : aBulSize( -1, -1) { DBG_CTOR( Paragraph, 0 ); DBG_ASSERT( ( nDDepth >= -1 ) && ( nDDepth < SVX_MAX_NUM ), "Paragraph-CTOR: nDepth invalid!" ); nDepth = nDDepth; nFlags = 0; bVisible = sal_True; } Paragraph::Paragraph( const Paragraph& rPara ) : ParagraphData( rPara ) , aBulText( rPara.aBulText ) , aBulSize( rPara.aBulSize ) { DBG_CTOR( Paragraph, 0 ); nDepth = rPara.nDepth; nFlags = rPara.nFlags; bVisible = rPara.bVisible; } Paragraph::Paragraph( const ParagraphData& rData ) : nFlags( 0 ) , aBulSize( -1, -1) , bVisible( sal_True ) { DBG_CTOR( Paragraph, 0 ); nDepth = rData.nDepth; mnNumberingStartValue = rData.mnNumberingStartValue; mbParaIsNumberingRestart = rData.mbParaIsNumberingRestart; } Paragraph::~Paragraph() { DBG_DTOR( Paragraph, 0 ); } void Paragraph::SetNumberingStartValue( sal_Int16 nNumberingStartValue ) { mnNumberingStartValue = nNumberingStartValue; if( mnNumberingStartValue != -1 ) mbParaIsNumberingRestart = true; } void Paragraph::SetParaIsNumberingRestart( sal_Bool bParaIsNumberingRestart ) { mbParaIsNumberingRestart = bParaIsNumberingRestart; if( !mbParaIsNumberingRestart ) mnNumberingStartValue = -1; } void ParagraphList::Clear( sal_Bool bDestroyParagraphs ) { if ( bDestroyParagraphs ) { std::vector::iterator iter; for (iter = maEntries.begin(); iter != maEntries.end(); ++iter) delete *iter; } maEntries.clear(); } void ParagraphList::Append( Paragraph* pPara) { maEntries.push_back(pPara); } void ParagraphList::Insert( Paragraph* pPara, sal_uLong nAbsPos) { OSL_ASSERT(nAbsPos != ULONG_MAX && nAbsPos <= maEntries.size()); maEntries.insert(maEntries.begin()+nAbsPos,pPara); } void ParagraphList::Remove( sal_uLong nPara ) { OSL_ASSERT(nPara < maEntries.size()); maEntries.erase(maEntries.begin() + nPara ); } void ParagraphList::MoveParagraphs( sal_uLong nStart, sal_uLong nDest, sal_uLong _nCount ) { OSL_ASSERT(nStart < maEntries.size() && nDest < maEntries.size()); if ( ( nDest < nStart ) || ( nDest >= ( nStart + _nCount ) ) ) { std::vector aParas; std::vector::iterator iterBeg = maEntries.begin() + nStart; std::vector::iterator iterEnd = iterBeg + _nCount; std::copy(iterBeg,iterEnd,std::back_inserter(aParas)); maEntries.erase(iterBeg,iterEnd); if ( nDest > nStart ) nDest -= _nCount; std::vector::iterator iterIns = maEntries.begin() + nDest; std::copy(aParas.begin(),aParas.end(),std::inserter(maEntries,iterIns)); } else { OSL_FAIL( "MoveParagraphs: Invalid Parameters" ); } } sal_Bool ParagraphList::HasChildren( Paragraph* pParagraph ) const { sal_uLong n = GetAbsPos( pParagraph ); Paragraph* pNext = GetParagraph( ++n ); return ( pNext && ( pNext->GetDepth() > pParagraph->GetDepth() ) ) ? sal_True : sal_False; } sal_Bool ParagraphList::HasHiddenChildren( Paragraph* pParagraph ) const { sal_uLong n = GetAbsPos( pParagraph ); Paragraph* pNext = GetParagraph( ++n ); return ( pNext && ( pNext->GetDepth() > pParagraph->GetDepth() ) && !pNext->IsVisible() ) ? sal_True : sal_False; } sal_Bool ParagraphList::HasVisibleChildren( Paragraph* pParagraph ) const { sal_uLong n = GetAbsPos( pParagraph ); Paragraph* pNext = GetParagraph( ++n ); return ( pNext && ( pNext->GetDepth() > pParagraph->GetDepth() ) && pNext->IsVisible() ) ? sal_True : sal_False; } sal_uLong ParagraphList::GetChildCount( Paragraph* pParent ) const { sal_uLong nChildCount = 0; sal_uLong n = GetAbsPos( pParent ); Paragraph* pPara = GetParagraph( ++n ); while ( pPara && ( pPara->GetDepth() > pParent->GetDepth() ) ) { nChildCount++; pPara = GetParagraph( ++n ); } return nChildCount; } Paragraph* ParagraphList::GetParent( Paragraph* pParagraph /*, sal_uInt16& rRelPos */ ) const { /* rRelPos = 0 */; sal_uLong n = GetAbsPos( pParagraph ); Paragraph* pPrev = GetParagraph( --n ); while ( pPrev && ( pPrev->GetDepth() >= pParagraph->GetDepth() ) ) { // if ( pPrev->GetDepth() == pParagraph->GetDepth() ) // rRelPos++; pPrev = GetParagraph( --n ); } return pPrev; } void ParagraphList::Expand( Paragraph* pParent ) { sal_uLong nChildCount = GetChildCount( pParent ); sal_uLong nPos = GetAbsPos( pParent ); for ( sal_uLong n = 1; n <= nChildCount; n++ ) { Paragraph* pPara = GetParagraph( nPos+n ); if ( !( pPara->IsVisible() ) ) { pPara->bVisible = sal_True; aVisibleStateChangedHdl.Call( pPara ); } } } void ParagraphList::Collapse( Paragraph* pParent ) { sal_uLong nChildCount = GetChildCount( pParent ); sal_uLong nPos = GetAbsPos( pParent ); for ( sal_uLong n = 1; n <= nChildCount; n++ ) { Paragraph* pPara = GetParagraph( nPos+n ); if ( pPara->IsVisible() ) { pPara->bVisible = sal_False; aVisibleStateChangedHdl.Call( pPara ); } } } sal_uLong ParagraphList::GetAbsPos( Paragraph* pParent ) const { sal_uLong pos = 0; std::vector::const_iterator iter; for (iter = maEntries.begin(); iter != maEntries.end(); ++iter, ++pos) { if (*iter == pParent) return pos; } return ~0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */