/* -*- 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 #include #include #include #include #include SwNodeNum::SwNodeNum( SwTxtNode* pTxtNode ) : SwNumberTreeNode(), mpTxtNode( pTxtNode ), mpNumRule( 0 ) { } SwNodeNum::SwNodeNum( SwNumRule* pNumRule ) : SwNumberTreeNode(), mpTxtNode( 0 ), mpNumRule( pNumRule ) { } SwNodeNum::~SwNodeNum() { } void SwNodeNum::ChangeNumRule( SwNumRule& rNumRule ) { OSL_ENSURE( GetNumRule() && GetTxtNode(), " - missing list style and/or text node. Serious defect -> please informm OD." ); if ( GetNumRule() && GetTxtNode() ) { GetNumRule()->RemoveTxtNode( *(GetTxtNode()) ); } mpNumRule = &rNumRule; if ( GetNumRule() && GetTxtNode() ) { GetNumRule()->AddTxtNode( *(GetTxtNode()) ); } } SwPosition SwNodeNum::GetPosition() const { OSL_ENSURE( GetTxtNode(), " - no text node set at instance" ); return SwPosition(*mpTxtNode); } SwNumberTreeNode * SwNodeNum::Create() const { SwNodeNum * pResult = new SwNodeNum( GetNumRule() ); return pResult; } void SwNodeNum::PreAdd() { OSL_ENSURE( GetTxtNode(), " - no text node set at instance" ); if ( !GetNumRule() && GetTxtNode() ) { mpNumRule = GetTxtNode()->GetNumRule(); } OSL_ENSURE( GetNumRule(), " - no list style set at instance" ); if ( GetNumRule() && GetTxtNode() ) { GetNumRule()->AddTxtNode( *(GetTxtNode()) ); } { if ( GetTxtNode() && GetTxtNode()->GetNodes().IsDocNodes() ) { GetTxtNode()->getIDocumentListItems().addListItem( *this ); } } } void SwNodeNum::PostRemove() { OSL_ENSURE( GetTxtNode(), " - no text node set at instance" ); OSL_ENSURE( GetNumRule(), " - no list style set at instance" ); if ( GetTxtNode() ) { GetTxtNode()->getIDocumentListItems().removeListItem( *this ); } if ( GetNumRule() ) { if ( GetTxtNode() ) { GetNumRule()->RemoveTxtNode( *(GetTxtNode()) ); } mpNumRule = 0; } } bool SwNodeNum::IsNotifiable() const { bool aResult = true; if ( GetTxtNode() ) aResult = GetTxtNode()->IsNotifiable(); return aResult; } bool SwNodeNum::IsNotificationEnabled() const { bool aResult = true; if ( GetTxtNode() ) aResult = GetTxtNode()->IsNotificationEnabled(); return aResult; } bool SwNodeNum::IsContinuous() const { bool aResult = false; // #i64311# if ( GetNumRule() ) { aResult = mpNumRule->IsContinusNum(); } else if ( GetParent() ) { aResult = GetParent()->IsContinuous(); } else { OSL_FAIL( " - OD debug" ); } return aResult; } bool SwNodeNum::IsCounted() const { bool aResult = false; if ( GetTxtNode() ) { // #i59559# // determines, if a text node is counted for numbering aResult = GetTxtNode()->IsCountedInList(); } else aResult = SwNumberTreeNode::IsCounted(); return aResult; } // #i64010# bool SwNodeNum::HasCountedChildren() const { bool bResult = false; tSwNumberTreeChildren::const_iterator aIt; for (aIt = mChildren.begin(); aIt != mChildren.end(); ++aIt) { SwNodeNum* pChild( dynamic_cast(*aIt) ); OSL_ENSURE( pChild, " - unexpected type of child -> please inform OD" ); if ( pChild && ( pChild->IsCountedForNumbering() || pChild->HasCountedChildren() ) ) { bResult = true; break; } } return bResult; } // #i64010# bool SwNodeNum::IsCountedForNumbering() const { return IsCounted() && ( IsPhantom() || // phantoms !GetTxtNode() || // root node GetTxtNode()->HasNumber() || // text node GetTxtNode()->HasBullet() ); // text node } void SwNodeNum::NotifyNode() { ValidateMe(); if (mpTxtNode) { mpTxtNode->NumRuleChgd(); } } bool SwNodeNum::LessThan(const SwNumberTreeNode & rNode) const { bool bResult = false; const SwNodeNum & rTmpNode = static_cast(rNode); if (mpTxtNode == NULL && rTmpNode.mpTxtNode != NULL) bResult = true; else if (mpTxtNode != NULL && rTmpNode.mpTxtNode != NULL) { // #i83479# - refactoring // simplify comparison by comparing the indexes of the text nodes bResult = ( mpTxtNode->GetIndex() < rTmpNode.mpTxtNode->GetIndex() ); } return bResult; } bool SwNodeNum::IsRestart() const { bool bIsRestart = false; if ( GetTxtNode() ) { bIsRestart = GetTxtNode()->IsListRestart(); } return bIsRestart; } bool SwNodeNum::IsCountPhantoms() const { bool bResult = true; // #i64311# // phantoms aren't counted in consecutive numbering rules if ( mpNumRule ) bResult = !mpNumRule->IsContinusNum() && mpNumRule->IsCountPhantoms(); else { OSL_FAIL( "GetActualListStartValue(); } else { SwNumRule * pRule = GetNumRule(); if (pRule) { int nLevel = GetParent() ? GetLevelInListTree() : 0; if (nLevel >= 0 && nLevel < MAXLEVEL) { const SwNumFmt * pFmt = pRule->GetNumFmt( static_cast(nLevel)); if (pFmt) aResult = pFmt->GetStart(); } } } return aResult; } void SwNodeNum::HandleNumberTreeRootNodeDelete( SwNodeNum& rNodeNum ) { SwNodeNum* pRootNode = rNodeNum.GetParent() ? dynamic_cast(rNodeNum.GetRoot()) : &rNodeNum; if ( !pRootNode ) { // no root node -> nothing do. return; } // unregister all number tree node entries, which correspond to a text node, // about the deletion of the number tree root node. _UnregisterMeAndChildrenDueToRootDelete( *pRootNode ); } void SwNodeNum::_UnregisterMeAndChildrenDueToRootDelete( SwNodeNum& rNodeNum ) { const bool bIsPhantom( rNodeNum.IsPhantom() ); tSwNumberTreeChildren::size_type nAllowedChildCount( 0 ); bool bDone( false ); while ( !bDone && rNodeNum.GetChildCount() > nAllowedChildCount ) { SwNodeNum* pChildNode( dynamic_cast((*rNodeNum.mChildren.begin())) ); if ( !pChildNode ) { OSL_FAIL( " - unknown number tree node child" ); ++nAllowedChildCount; continue; } // Unregistering the last child of a phantom will destroy the phantom. // Thus will be destroyed and access on has to // be suppressed. if ( bIsPhantom && rNodeNum.GetChildCount() == 1 ) { bDone = true; } _UnregisterMeAndChildrenDueToRootDelete( *pChildNode ); } if ( !bIsPhantom ) { SwTxtNode* pTxtNode( rNodeNum.GetTxtNode() ); if ( pTxtNode ) { pTxtNode->RemoveFromList(); // --> clear all list attributes and the list style std::set aResetAttrsArray; aResetAttrsArray.insert( aResetAttrsArray.end(), RES_PARATR_LIST_ID ); aResetAttrsArray.insert( aResetAttrsArray.end(), RES_PARATR_LIST_LEVEL ); aResetAttrsArray.insert( aResetAttrsArray.end(), RES_PARATR_LIST_ISRESTART ); aResetAttrsArray.insert( aResetAttrsArray.end(), RES_PARATR_LIST_RESTARTVALUE ); aResetAttrsArray.insert( aResetAttrsArray.end(), RES_PARATR_LIST_ISCOUNTED ); aResetAttrsArray.insert( aResetAttrsArray.end(), RES_PARATR_NUMRULE ); SwPaM aPam( *pTxtNode ); pTxtNode->GetDoc()->ResetAttrs( aPam, false, aResetAttrsArray, false ); } } } // #i81002# const SwNodeNum* SwNodeNum::GetPrecedingNodeNumOf( const SwTxtNode& rTxtNode ) const { const SwNodeNum* pPrecedingNodeNum( 0 ); // #i83479# SwNodeNum aNodeNumForTxtNode( const_cast(&rTxtNode) ); pPrecedingNodeNum = dynamic_cast( GetRoot() ? GetRoot()->GetPrecedingNodeOf( aNodeNumForTxtNode ) : GetPrecedingNodeOf( aNodeNumForTxtNode ) ); return pPrecedingNodeNum; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */