diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2018-10-19 15:27:09 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2018-11-10 19:47:00 +0100 |
commit | 4ece0f8047cc0d3ec9834152adc508bbf9de5557 (patch) | |
tree | cc0a8b93e7c6b4e4a1636bd383863c3a273b276a /sw/source/core/txtnode | |
parent | ff21c9e264215e550678b36f36fb808acc13508d (diff) |
sw_redlinehide_3: add second SwNodeNum to SwTextNode
Change-Id: I62ebdb92ee384905bba9ef3865fcdb306775baf2
Diffstat (limited to 'sw/source/core/txtnode')
-rw-r--r-- | sw/source/core/txtnode/ndtxt.cxx | 75 |
1 files changed, 63 insertions, 12 deletions
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index f66dd2ab7d4e..36e1959740c4 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -201,6 +201,7 @@ SwTextNode *SwNodes::MakeTextNode( const SwNodeIndex & rWhere, SwTextNode::SwTextNode( const SwNodeIndex &rWhere, SwTextFormatColl *pTextColl, const SfxItemSet* pAutoAttr ) : SwContentNode( rWhere, SwNodeType::Text, pTextColl ), mpNodeNum( nullptr ), + mpNodeNumRLHidden(nullptr), m_Text(), m_pParaIdleData_Impl(nullptr), m_bContainsHiddenChars(false), @@ -2865,6 +2866,7 @@ void SwTextNode::NumRuleChgd() if ( pNumRule && pNumRule != GetNum()->GetNumRule() ) { mpNodeNum->ChangeNumRule( *pNumRule ); + mpNodeNumRLHidden->ChangeNumRule( *pNumRule ); } } @@ -3131,14 +3133,15 @@ bool SwTextNode::HasBullet() const // #128041# - introduce parameter <_bInclPrefixAndSuffixStrings> //i53420 added max outline parameter OUString SwTextNode::GetNumString( const bool _bInclPrefixAndSuffixStrings, - const unsigned int _nRestrictToThisLevel ) const + const unsigned int _nRestrictToThisLevel, + SwRootFrame const*const pLayout) const { if (GetDoc()->IsClipBoard() && m_pNumStringCache.get()) { // #i111677# do not expand number strings in clipboard documents return *m_pNumStringCache; } - const SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : nullptr; + const SwNumRule* pRule = GetNum(pLayout) ? GetNum(pLayout)->GetNumRule() : nullptr; if ( pRule && IsCountedInList() ) { @@ -3148,7 +3151,7 @@ OUString SwTextNode::GetNumString( const bool _bInclPrefixAndSuffixStrings, (style::NumberingType::NUMBER_NONE == rNumberType.GetNumberingType())) { - return pRule->MakeNumString( GetNum()->GetNumberVector(), + return pRule->MakeNumString( GetNum(pLayout)->GetNumberVector(), _bInclPrefixAndSuffixStrings, false, _nRestrictToThisLevel, @@ -3957,20 +3960,19 @@ SwFormatColl* SwTextNode::ChgFormatColl( SwFormatColl *pNewColl ) return pOldColl; } -SwNodeNum* SwTextNode::CreateNum() const +const SwNodeNum* SwTextNode::GetNum(SwRootFrame const*const pLayout) const { - if ( !mpNodeNum ) - { - mpNodeNum = new SwNodeNum( const_cast<SwTextNode*>(this), false ); - } - return mpNodeNum; + // invariant: it's only in list in Hide mode if it's in list in normal mode + assert(mpNodeNum || !mpNodeNumRLHidden); + return pLayout && pLayout->IsHideRedlines() ? mpNodeNumRLHidden : mpNodeNum; } -SwNumberTree::tNumberVector SwTextNode::GetNumberVector() const +SwNumberTree::tNumberVector +SwTextNode::GetNumberVector(SwRootFrame const*const pLayout) const { - if ( GetNum() ) + if (SwNodeNum const*const pNum = GetNum(pLayout)) { - return GetNum()->GetNumberVector(); + return pNum->GetNumberVector(); } else { @@ -4076,6 +4078,8 @@ int SwTextNode::GetAttrListLevel() const int SwTextNode::GetActualListLevel() const { + assert(!GetNum() || !mpNodeNumRLHidden || // must be in sync + GetNum()->GetLevelInListTree() == mpNodeNumRLHidden->GetLevelInListTree()); return GetNum() ? GetNum()->GetLevelInListTree() : -1; } @@ -4260,11 +4264,45 @@ void SwTextNode::AddToList() assert(!mpNodeNum); mpNodeNum = new SwNodeNum(this, false); pList->InsertListItem(*mpNodeNum, false, GetAttrListLevel()); + // iterate all frames & if there's one with hidden layout... + SwIterator<SwTextFrame, SwTextNode, sw::IteratorMode::UnwrapMulti> iter(*this); + for (SwTextFrame* pFrame = iter.First(); pFrame; pFrame = iter.Next()) + { + if (pFrame->getRootFrame()->IsHideRedlines()) + { + sw::MergedPara const*const pMerged = pFrame->GetMergedPara(); + if (!pMerged || this == pMerged->pParaPropsNode) + { + AddToListRLHidden(); + } + break; // assume it's consistent, need to check only once + } + } + } +} + +void SwTextNode::AddToListRLHidden() +{ + if (mpNodeNumRLHidden) + { + assert(false); + OSL_FAIL( "<SwTextNode::AddToListRLHidden()> - the text node is already added to a list. Serious defect" ); + return; + } + + SwList *const pList(FindList(this)); + if (pList) + { + assert(!mpNodeNumRLHidden); + mpNodeNumRLHidden = new SwNodeNum(this, true); + pList->InsertListItem(*mpNodeNumRLHidden, true, GetAttrListLevel()); } } void SwTextNode::RemoveFromList() { + // sw_redlinehide: ensure it's removed from the other half too! + RemoveFromListRLHidden(); if ( IsInList() ) { SwList::RemoveListItem( *mpNodeNum ); @@ -4275,6 +4313,19 @@ void SwTextNode::RemoveFromList() } } +void SwTextNode::RemoveFromListRLHidden() +{ + if (mpNodeNumRLHidden) // direct access because RemoveFromList doesn't have layout + { + assert(mpNodeNumRLHidden->GetParent() || !GetNodes().IsDocNodes()); + SwList::RemoveListItem(*mpNodeNumRLHidden); + delete mpNodeNumRLHidden; + mpNodeNumRLHidden = nullptr; + + SetWordCountDirty( true ); + } +} + bool SwTextNode::IsInList() const { return GetNum() != nullptr && GetNum()->GetParent() != nullptr; |