summaryrefslogtreecommitdiff
path: root/sw/source/core/txtnode
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2018-10-19 15:27:09 +0200
committerMichael Stahl <Michael.Stahl@cib.de>2018-11-10 19:47:00 +0100
commit4ece0f8047cc0d3ec9834152adc508bbf9de5557 (patch)
treecc0a8b93e7c6b4e4a1636bd383863c3a273b276a /sw/source/core/txtnode
parentff21c9e264215e550678b36f36fb808acc13508d (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.cxx75
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;