| /************************************************************** |
| * |
| * 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #include "precompiled_sw.hxx" |
| |
| #include <list.hxx> |
| |
| #include <vector> |
| #include <numrule.hxx> |
| #include <ndarr.hxx> |
| #include <node.hxx> |
| #include <pam.hxx> |
| #include <SwNodeNum.hxx> |
| |
| // ---------------------------------------------------------------------------- |
| // SwListImpl |
| // implementation class for SwList |
| // ---------------------------------------------------------------------------- |
| class SwListImpl |
| { |
| public: |
| SwListImpl( const String sListId, |
| SwNumRule& rDefaultListStyle, |
| const SwNodes& rNodes ); |
| ~SwListImpl(); |
| |
| const String GetListId() const; |
| |
| const String GetDefaultListStyleName() const; |
| |
| void InsertListItem( SwNodeNum& rNodeNum, |
| const int nLevel ); |
| void RemoveListItem( SwNodeNum& rNodeNum ); |
| |
| void InvalidateListTree(); |
| void ValidateListTree(); |
| |
| void MarkListLevel( const int nListLevel, |
| const sal_Bool bValue ); |
| |
| bool IsListLevelMarked( const int nListLevel ) const; |
| |
| private: |
| // unique identifier of the list |
| const String msListId; |
| // default list style for the list items, identified by the list style name |
| String msDefaultListStyleName; |
| |
| // list trees for certain document ranges |
| typedef std::pair<SwNodeNum*, SwPaM*> tListTreeForRange; |
| typedef std::vector<tListTreeForRange> tListTrees; |
| tListTrees maListTrees; |
| |
| int mnMarkedListLevel; |
| |
| void NotifyItemsOnListLevel( const int nLevel ); |
| }; |
| |
| SwListImpl::SwListImpl( const String sListId, |
| SwNumRule& rDefaultListStyle, |
| const SwNodes& rNodes ) |
| : msListId( sListId ), |
| msDefaultListStyleName( rDefaultListStyle.GetName() ), |
| maListTrees(), |
| mnMarkedListLevel( MAXLEVEL ) |
| { |
| // create empty list trees for the document ranges |
| const SwNode* pNode = rNodes[0]; |
| do |
| { |
| SwPaM aPam( *pNode, *pNode->EndOfSectionNode() ); |
| |
| SwNodeNum* pNumberTreeRootNode = new SwNodeNum( &rDefaultListStyle ); |
| SwPaM* pPam = new SwPaM( *(aPam.Start()), *(aPam.End()) ); |
| tListTreeForRange aListTreeForRange( pNumberTreeRootNode, pPam ); |
| maListTrees.push_back( aListTreeForRange ); |
| |
| pNode = pNode->EndOfSectionNode(); |
| if (pNode != &rNodes.GetEndOfContent()) |
| { |
| sal_uLong nIndex = pNode->GetIndex(); |
| nIndex++; |
| pNode = rNodes[nIndex]; |
| } |
| } |
| while ( pNode != &rNodes.GetEndOfContent() ); |
| } |
| |
| SwListImpl::~SwListImpl() |
| { |
| tListTrees::iterator aNumberTreeIter; |
| for ( aNumberTreeIter = maListTrees.begin(); |
| aNumberTreeIter != maListTrees.end(); |
| ++aNumberTreeIter ) |
| { |
| SwNodeNum::HandleNumberTreeRootNodeDelete( *((*aNumberTreeIter).first) ); |
| delete (*aNumberTreeIter).first; |
| delete (*aNumberTreeIter).second; |
| } |
| } |
| |
| const String SwListImpl::GetListId() const |
| { |
| return msListId; |
| } |
| |
| const String SwListImpl::GetDefaultListStyleName() const |
| { |
| return msDefaultListStyleName; |
| } |
| |
| void SwListImpl::InsertListItem( SwNodeNum& rNodeNum, |
| const int nLevel ) |
| { |
| const SwPosition aPosOfNodeNum( rNodeNum.GetPosition() ); |
| const SwNodes* pNodesOfNodeNum = &(aPosOfNodeNum.nNode.GetNode().GetNodes()); |
| |
| tListTrees::const_iterator aNumberTreeIter; |
| for ( aNumberTreeIter = maListTrees.begin(); |
| aNumberTreeIter != maListTrees.end(); |
| ++aNumberTreeIter ) |
| { |
| const SwPosition* pStart = (*aNumberTreeIter).second->Start(); |
| const SwPosition* pEnd = (*aNumberTreeIter).second->End(); |
| const SwNodes* pRangeNodes = &(pStart->nNode.GetNode().GetNodes()); |
| |
| if ( pRangeNodes == pNodesOfNodeNum && |
| *pStart <= aPosOfNodeNum && aPosOfNodeNum <= *pEnd) |
| { |
| (*aNumberTreeIter).first->AddChild( &rNodeNum, nLevel ); |
| |
| break; |
| } |
| } |
| } |
| |
| void SwListImpl::RemoveListItem( SwNodeNum& rNodeNum ) |
| { |
| rNodeNum.RemoveMe(); |
| } |
| |
| void SwListImpl::InvalidateListTree() |
| { |
| tListTrees::iterator aNumberTreeIter; |
| for ( aNumberTreeIter = maListTrees.begin(); |
| aNumberTreeIter != maListTrees.end(); |
| ++aNumberTreeIter ) |
| { |
| (*aNumberTreeIter).first->InvalidateTree(); |
| } |
| } |
| |
| void SwListImpl::ValidateListTree() |
| { |
| tListTrees::iterator aNumberTreeIter; |
| for ( aNumberTreeIter = maListTrees.begin(); |
| aNumberTreeIter != maListTrees.end(); |
| ++aNumberTreeIter ) |
| { |
| (*aNumberTreeIter).first->NotifyInvalidChildren(); |
| } |
| } |
| |
| void SwListImpl::MarkListLevel( const int nListLevel, |
| const sal_Bool bValue ) |
| { |
| if ( bValue ) |
| { |
| if ( nListLevel != mnMarkedListLevel ) |
| { |
| if ( mnMarkedListLevel != MAXLEVEL ) |
| { |
| // notify former marked list nodes |
| NotifyItemsOnListLevel( mnMarkedListLevel ); |
| } |
| |
| mnMarkedListLevel = nListLevel; |
| |
| // notify new marked list nodes |
| NotifyItemsOnListLevel( mnMarkedListLevel ); |
| } |
| } |
| else |
| { |
| if ( mnMarkedListLevel != MAXLEVEL ) |
| { |
| // notify former marked list nodes |
| NotifyItemsOnListLevel( mnMarkedListLevel ); |
| } |
| |
| mnMarkedListLevel = MAXLEVEL; |
| } |
| } |
| |
| bool SwListImpl::IsListLevelMarked( const int nListLevel ) const |
| { |
| return nListLevel == mnMarkedListLevel; |
| } |
| |
| void SwListImpl::NotifyItemsOnListLevel( const int nLevel ) |
| { |
| tListTrees::iterator aNumberTreeIter; |
| for ( aNumberTreeIter = maListTrees.begin(); |
| aNumberTreeIter != maListTrees.end(); |
| ++aNumberTreeIter ) |
| { |
| (*aNumberTreeIter).first->NotifyNodesOnListLevel( nLevel ); |
| } |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // SwList |
| // ---------------------------------------------------------------------------- |
| SwList::SwList( const String sListId, |
| SwNumRule& rDefaultListStyle, |
| const SwNodes& rNodes ) |
| : mpListImpl( new SwListImpl( sListId, rDefaultListStyle, rNodes ) ) |
| { |
| } |
| |
| SwList::~SwList() |
| { |
| delete mpListImpl; |
| } |
| |
| const String SwList::GetListId() const |
| { |
| return mpListImpl->GetListId(); |
| } |
| |
| const String SwList::GetDefaultListStyleName() const |
| { |
| return mpListImpl->GetDefaultListStyleName(); |
| } |
| |
| void SwList::InsertListItem( SwNodeNum& rNodeNum, |
| const int nLevel ) |
| { |
| mpListImpl->InsertListItem( rNodeNum, nLevel ); |
| } |
| |
| void SwList::RemoveListItem( SwNodeNum& rNodeNum ) |
| { |
| mpListImpl->RemoveListItem( rNodeNum ); |
| } |
| |
| void SwList::InvalidateListTree() |
| { |
| mpListImpl->InvalidateListTree(); |
| } |
| |
| void SwList::ValidateListTree() |
| { |
| mpListImpl->ValidateListTree(); |
| } |
| |
| void SwList::MarkListLevel( const int nListLevel, |
| const sal_Bool bValue ) |
| { |
| mpListImpl->MarkListLevel( nListLevel, bValue ); |
| } |
| |
| bool SwList::IsListLevelMarked( const int nListLevel ) const |
| { |
| return mpListImpl->IsListLevelMarked( nListLevel ); |
| } |
| |
| //void SwList::ContinueList( SwList& rList ) |
| //{ |
| // mpListImpl->ContinueList( rList ); |
| //} |
| //const SwList* SwList::GetContinuedList() const |
| //{ |
| // return mpListImpl->GetContinuedList(); |
| //} |
| //void SwList::ClearContinuation() |
| //{ |
| // mpListImpl->ClearContinuation(); |
| //} |