Kaydet (Commit) 26ce48bf authored tarafından Michael Stahl's avatar Michael Stahl

sw_redlinehide_3: add second SwNodeNum tree to SwList

... so it can be used when redlines are hidden in the layout.

Change-Id: I6cb2bca2fb8ba3913bbf6633996341b52639fe41
üst 31f841db
...@@ -44,6 +44,7 @@ class SwList ...@@ -44,6 +44,7 @@ class SwList
void SetDefaultListStyleName(OUString const&); void SetDefaultListStyleName(OUString const&);
void InsertListItem( SwNodeNum& rNodeNum, void InsertListItem( SwNodeNum& rNodeNum,
bool isHiddenRedlines,
const int nLevel ); const int nLevel );
static void RemoveListItem( SwNodeNum& rNodeNum ); static void RemoveListItem( SwNodeNum& rNodeNum );
......
...@@ -39,7 +39,7 @@ class SwListImpl ...@@ -39,7 +39,7 @@ class SwListImpl
const OUString& GetDefaultListStyleName() const { return msDefaultListStyleName;} const OUString& GetDefaultListStyleName() const { return msDefaultListStyleName;}
void InsertListItem( SwNodeNum& rNodeNum, void InsertListItem( SwNodeNum& rNodeNum, bool isHiddenRedlines,
const int nLevel ); const int nLevel );
static void RemoveListItem( SwNodeNum& rNodeNum ); static void RemoveListItem( SwNodeNum& rNodeNum );
...@@ -57,7 +57,24 @@ class SwListImpl ...@@ -57,7 +57,24 @@ class SwListImpl
OUString msDefaultListStyleName; OUString msDefaultListStyleName;
// list trees for certain document ranges // list trees for certain document ranges
typedef std::pair<std::unique_ptr<SwNodeNum>, std::unique_ptr<SwPaM>> tListTreeForRange; struct tListTreeForRange
{
/// tree always corresponds to document model
std::unique_ptr<SwNodeNum> pRoot;
/// Tree that is missing those nodes that are merged or hidden
/// by delete redlines; this is only used if there is a layout
/// that has IsHideRedlines() enabled.
/// A second tree is needed because not only are the numbers in
/// the nodes different, the structure of the tree may be different
/// as well, if a high-level node is hidden its children go under
/// the previous node on the same level.
/// The nodes of pRootRLHidden are a subset of the nodes of pRoot.
std::unique_ptr<SwNodeNum> pRootRLHidden;
/// top-level SwNodes section
std::unique_ptr<SwPaM> pSection;
tListTreeForRange(SwNodeNum *const p1, SwNodeNum *const p2, SwPaM *const p3)
: pRoot(p1), pRootRLHidden(p2), pSection(p3) {}
};
typedef std::vector<tListTreeForRange> tListTrees; typedef std::vector<tListTreeForRange> tListTrees;
tListTrees maListTrees; tListTrees maListTrees;
...@@ -81,8 +98,9 @@ SwListImpl::SwListImpl( const OUString& sListId, ...@@ -81,8 +98,9 @@ SwListImpl::SwListImpl( const OUString& sListId,
SwPaM aPam( *pNode, *pNode->EndOfSectionNode() ); SwPaM aPam( *pNode, *pNode->EndOfSectionNode() );
SwNodeNum* pNumberTreeRootNode = new SwNodeNum( &rDefaultListStyle ); SwNodeNum* pNumberTreeRootNode = new SwNodeNum( &rDefaultListStyle );
SwNodeNum* pNumberTreeRootNodeRL = new SwNodeNum( &rDefaultListStyle );
SwPaM* pPam = new SwPaM( *(aPam.Start()), *(aPam.End()) ); SwPaM* pPam = new SwPaM( *(aPam.Start()), *(aPam.End()) );
maListTrees.emplace_back(pNumberTreeRootNode, pPam); maListTrees.emplace_back(pNumberTreeRootNode, pNumberTreeRootNodeRL, pPam);
pNode = pNode->EndOfSectionNode(); pNode = pNode->EndOfSectionNode();
if (pNode != &rNodes.GetEndOfContent()) if (pNode != &rNodes.GetEndOfContent())
...@@ -102,12 +120,12 @@ SwListImpl::~SwListImpl() COVERITY_NOEXCEPT_FALSE ...@@ -102,12 +120,12 @@ SwListImpl::~SwListImpl() COVERITY_NOEXCEPT_FALSE
aNumberTreeIter != maListTrees.end(); aNumberTreeIter != maListTrees.end();
++aNumberTreeIter ) ++aNumberTreeIter )
{ {
SwNodeNum::HandleNumberTreeRootNodeDelete( *((*aNumberTreeIter).first) ); SwNodeNum::HandleNumberTreeRootNodeDelete(*((*aNumberTreeIter).pRoot));
SwNodeNum::HandleNumberTreeRootNodeDelete(*((*aNumberTreeIter).pRootRLHidden));
} }
} }
void SwListImpl::InsertListItem( SwNodeNum& rNodeNum, bool const isHiddenRedlines,
void SwListImpl::InsertListItem( SwNodeNum& rNodeNum,
const int nLevel ) const int nLevel )
{ {
const SwPosition aPosOfNodeNum( rNodeNum.GetPosition() ); const SwPosition aPosOfNodeNum( rNodeNum.GetPosition() );
...@@ -118,15 +136,17 @@ void SwListImpl::InsertListItem( SwNodeNum& rNodeNum, ...@@ -118,15 +136,17 @@ void SwListImpl::InsertListItem( SwNodeNum& rNodeNum,
aNumberTreeIter != maListTrees.end(); aNumberTreeIter != maListTrees.end();
++aNumberTreeIter ) ++aNumberTreeIter )
{ {
const SwPosition* pStart = (*aNumberTreeIter).second->Start(); const SwPosition* pStart = (*aNumberTreeIter).pSection->Start();
const SwPosition* pEnd = (*aNumberTreeIter).second->End(); const SwPosition* pEnd = (*aNumberTreeIter).pSection->End();
const SwNodes* pRangeNodes = &(pStart->nNode.GetNode().GetNodes()); const SwNodes* pRangeNodes = &(pStart->nNode.GetNode().GetNodes());
if ( pRangeNodes == pNodesOfNodeNum && if ( pRangeNodes == pNodesOfNodeNum &&
*pStart <= aPosOfNodeNum && aPosOfNodeNum <= *pEnd) *pStart <= aPosOfNodeNum && aPosOfNodeNum <= *pEnd)
{ {
(*aNumberTreeIter).first->AddChild( &rNodeNum, nLevel ); auto const& pRoot(isHiddenRedlines
? (*aNumberTreeIter).pRootRLHidden
: (*aNumberTreeIter).pRoot);
pRoot->AddChild(&rNodeNum, nLevel);
break; break;
} }
} }
...@@ -144,7 +164,8 @@ void SwListImpl::InvalidateListTree() ...@@ -144,7 +164,8 @@ void SwListImpl::InvalidateListTree()
aNumberTreeIter != maListTrees.end(); aNumberTreeIter != maListTrees.end();
++aNumberTreeIter ) ++aNumberTreeIter )
{ {
(*aNumberTreeIter).first->InvalidateTree(); (*aNumberTreeIter).pRoot->InvalidateTree();
(*aNumberTreeIter).pRootRLHidden->InvalidateTree();
} }
} }
...@@ -155,7 +176,8 @@ void SwListImpl::ValidateListTree() ...@@ -155,7 +176,8 @@ void SwListImpl::ValidateListTree()
aNumberTreeIter != maListTrees.end(); aNumberTreeIter != maListTrees.end();
++aNumberTreeIter ) ++aNumberTreeIter )
{ {
(*aNumberTreeIter).first->NotifyInvalidChildren(); (*aNumberTreeIter).pRoot->NotifyInvalidChildren();
(*aNumberTreeIter).pRootRLHidden->NotifyInvalidChildren();
} }
} }
...@@ -202,7 +224,8 @@ void SwListImpl::NotifyItemsOnListLevel( const int nLevel ) ...@@ -202,7 +224,8 @@ void SwListImpl::NotifyItemsOnListLevel( const int nLevel )
aNumberTreeIter != maListTrees.end(); aNumberTreeIter != maListTrees.end();
++aNumberTreeIter ) ++aNumberTreeIter )
{ {
(*aNumberTreeIter).first->NotifyNodesOnListLevel( nLevel ); (*aNumberTreeIter).pRoot->NotifyNodesOnListLevel( nLevel );
(*aNumberTreeIter).pRootRLHidden->NotifyNodesOnListLevel( nLevel );
} }
} }
...@@ -232,10 +255,10 @@ void SwList::SetDefaultListStyleName(OUString const& rNew) ...@@ -232,10 +255,10 @@ void SwList::SetDefaultListStyleName(OUString const& rNew)
mpListImpl->msDefaultListStyleName = rNew; mpListImpl->msDefaultListStyleName = rNew;
} }
void SwList::InsertListItem( SwNodeNum& rNodeNum, void SwList::InsertListItem( SwNodeNum& rNodeNum, bool const isHiddenRedlines,
const int nLevel ) const int nLevel )
{ {
mpListImpl->InsertListItem( rNodeNum, nLevel ); mpListImpl->InsertListItem( rNodeNum, isHiddenRedlines, nLevel );
} }
void SwList::RemoveListItem( SwNodeNum& rNodeNum ) void SwList::RemoveListItem( SwNodeNum& rNodeNum )
......
...@@ -4223,33 +4223,43 @@ bool SwTextNode::IsCountedInList() const ...@@ -4223,33 +4223,43 @@ bool SwTextNode::IsCountedInList() const
return aIsCountedInListItem.GetValue(); return aIsCountedInListItem.GetValue();
} }
void SwTextNode::AddToList() static SwList * FindList(SwTextNode *const pNode)
{ {
if ( IsInList() ) const OUString sListId = pNode->GetListId();
{
OSL_FAIL( "<SwTextNode::AddToList()> - the text node is already added to a list. Serious defect" );
return;
}
const OUString sListId = GetListId();
if (!sListId.isEmpty()) if (!sListId.isEmpty())
{ {
SwList* pList = GetDoc()->getIDocumentListsAccess().getListByName( sListId ); auto & rIDLA(pNode->GetDoc()->getIDocumentListsAccess());
SwList* pList = rIDLA.getListByName( sListId );
if ( pList == nullptr ) if ( pList == nullptr )
{ {
// Create corresponding list. // Create corresponding list.
SwNumRule* pNumRule = GetNumRule(); SwNumRule* pNumRule = pNode->GetNumRule();
if ( pNumRule ) if ( pNumRule )
{ {
pList = GetDoc()->getIDocumentListsAccess().createList( sListId, GetNumRule()->GetName() ); pList = rIDLA.createList(sListId, pNode->GetNumRule()->GetName());
} }
} }
OSL_ENSURE( pList != nullptr, OSL_ENSURE( pList != nullptr,
"<SwTextNode::AddToList()> - no list for given list id. Serious defect" ); "<SwTextNode::AddToList()> - no list for given list id. Serious defect" );
if ( pList ) return pList;
{ }
pList->InsertListItem( *CreateNum(), GetAttrListLevel() ); return nullptr;
} }
void SwTextNode::AddToList()
{
if ( IsInList() )
{
OSL_FAIL( "<SwTextNode::AddToList()> - the text node is already added to a list. Serious defect" );
return;
}
SwList *const pList(FindList(this));
if (pList)
{
assert(!mpNodeNum);
mpNodeNum = new SwNodeNum(this);
pList->InsertListItem(*mpNodeNum, false, GetAttrListLevel());
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment