summaryrefslogtreecommitdiff
path: root/sw/source/core
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core')
-rw-r--r--sw/source/core/doc/doc.cxx5
-rw-r--r--sw/source/core/doc/doctxm.cxx157
-rw-r--r--sw/source/core/edit/edtox.cxx6
-rw-r--r--sw/source/core/fields/reffld.cxx21
-rw-r--r--sw/source/core/inc/doctxm.hxx22
-rw-r--r--sw/source/core/inc/txmsrt.hxx54
-rw-r--r--sw/source/core/inc/txtfrm.hxx3
-rw-r--r--sw/source/core/tox/ToxTextGenerator.cxx149
-rw-r--r--sw/source/core/tox/tox.cxx4
-rw-r--r--sw/source/core/tox/txmsrt.cxx147
-rw-r--r--sw/source/core/unocore/unoidx.cxx5
11 files changed, 403 insertions, 170 deletions
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index 9561462349f4..1e223e8b64a9 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -1726,7 +1726,8 @@ void SwDoc::AppendUndoForInsertFromDB( const SwPaM& rPam, bool bIsTable )
}
}
-void SwDoc::ChgTOX(SwTOXBase & rTOX, const SwTOXBase & rNew)
+void SwDoc::ChangeTOX(SwTOXBase & rTOX, const SwTOXBase & rNew,
+ SwRootFrame const& rLayout)
{
if (GetIDocumentUndoRedo().DoesUndo())
{
@@ -1740,7 +1741,7 @@ void SwDoc::ChgTOX(SwTOXBase & rTOX, const SwTOXBase & rNew)
if (dynamic_cast<const SwTOXBaseSection*>( &rTOX) != nullptr)
{
- static_cast<SwTOXBaseSection &>(rTOX).Update();
+ static_cast<SwTOXBaseSection &>(rTOX).Update(nullptr, &rLayout);
static_cast<SwTOXBaseSection &>(rTOX).UpdatePageNum();
}
}
diff --git a/sw/source/core/doc/doctxm.cxx b/sw/source/core/doc/doctxm.cxx
index 52652fbab564..3f0576073262 100644
--- a/sw/source/core/doc/doctxm.cxx
+++ b/sw/source/core/doc/doctxm.cxx
@@ -79,8 +79,17 @@
using namespace ::com::sun::star;
+template<typename T, typename... Args> static
+typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type
+MakeSwTOXSortTabBase(SwRootFrame const*const pLayout, Args&& ... args)
+{
+ std::unique_ptr<T> pRet(new T(std::forward<Args>(args)...));
+ pRet->InitText(pLayout); // ensure it's expanded with the layout
+ return pRet;
+}
-void SwDoc::GetTOIKeys( SwTOIKeyType eTyp, std::vector<OUString>& rArr ) const
+void SwDoc::GetTOIKeys(SwTOIKeyType eTyp, std::vector<OUString>& rArr,
+ SwRootFrame const& rLayout) const
{
rArr.clear();
@@ -96,7 +105,9 @@ void SwDoc::GetTOIKeys( SwTOIKeyType eTyp, std::vector<OUString>& rArr ) const
continue;
const SwTextTOXMark* pMark = pItem->GetTextTOXMark();
if ( pMark && pMark->GetpTextNd() &&
- pMark->GetpTextNd()->GetNodes().IsDocNodes() )
+ pMark->GetpTextNd()->GetNodes().IsDocNodes() &&
+ (!rLayout.IsHideRedlines()
+ || !sw::IsMarkHintHidden(rLayout, *pMark->GetpTextNd(), *pMark)))
{
const OUString sStr = TOI_PRIMARY == eTyp
? pItem->GetPrimaryKey()
@@ -268,7 +279,7 @@ const SwTOXMark& SwDoc::GotoTOXMark( const SwTOXMark& rCurTOXMark,
// possible to also travel across Entries on the same (!)
// position. If someone has time, please feel free to optimize.
case TOX_SAME_PRV:
- if( pTOXMark->GetText() != rCurTOXMark.GetText() )
+ if (pTOXMark->GetText(nullptr) != rCurTOXMark.GetText(nullptr))
break;
SAL_FALLTHROUGH;
case TOX_PRV:
@@ -290,7 +301,7 @@ const SwTOXMark& SwDoc::GotoTOXMark( const SwTOXMark& rCurTOXMark,
break;
case TOX_SAME_NXT:
- if( pTOXMark->GetText() != rCurTOXMark.GetText() )
+ if (pTOXMark->GetText(nullptr) != rCurTOXMark.GetText(nullptr))
break;
SAL_FALLTHROUGH;
case TOX_NXT:
@@ -338,7 +349,8 @@ const SwTOXMark& SwDoc::GotoTOXMark( const SwTOXMark& rCurTOXMark,
SwTOXBaseSection* SwDoc::InsertTableOf( const SwPosition& rPos,
const SwTOXBase& rTOX,
const SfxItemSet* pSet,
- bool bExpand )
+ bool bExpand,
+ SwRootFrame const*const pLayout)
{
GetIDocumentUndoRedo().StartUndo( SwUndoId::INSTOX, nullptr );
@@ -357,7 +369,7 @@ SwTOXBaseSection* SwDoc::InsertTableOf( const SwPosition& rPos,
// add value for 2nd parameter = true to
// indicate, that a creation of a new table of content has to be performed.
// Value of 1st parameter = default value.
- pNewSection->Update( nullptr, true );
+ pNewSection->Update( nullptr, pLayout, true );
}
else if( rTOX.GetTitle().getLength()==1 && IsInReading() )
// insert title of TOX
@@ -694,7 +706,8 @@ bool SwDoc::SetTOXBaseName(const SwTOXBase& rTOXBase, const OUString& rName)
return false;
}
-static const SwTextNode* lcl_FindChapterNode( const SwNode& rNd, sal_uInt8 nLvl = 0 )
+static const SwTextNode* lcl_FindChapterNode( const SwNode& rNd,
+ SwRootFrame const*const pLayout, sal_uInt8 const nLvl = 0 )
{
const SwNode* pNd = &rNd;
if( pNd->GetNodes().GetEndOfExtras().GetIndex() > pNd->GetIndex() )
@@ -711,7 +724,7 @@ static const SwTextNode* lcl_FindChapterNode( const SwNode& rNd, sal_uInt8 nLvl
OSL_ENSURE( pNd, "Where's the paragraph?" );
}
}
- return pNd ? pNd->FindOutlineNodeOfLevel( nLvl ) : nullptr;
+ return pNd ? pNd->FindOutlineNodeOfLevel(nLvl, pLayout) : nullptr;
}
// Table of contents class
@@ -743,7 +756,8 @@ bool SwTOXBaseSection::SetPosAtStartEnd( SwPosition& rPos ) const
/// Collect table of contents content
void SwTOXBaseSection::Update(const SfxItemSet* pAttr,
- const bool _bNewTOX )
+ SwRootFrame const*const pLayout,
+ const bool _bNewTOX)
{
if (!SwTOXBase::GetRegisteredIn()->HasWriterListeners() ||
!GetFormat())
@@ -753,7 +767,8 @@ void SwTOXBaseSection::Update(const SfxItemSet* pAttr,
SwSectionNode const*const pSectNd(GetFormat()->GetSectionNode());
if (nullptr == pSectNd ||
!pSectNd->GetNodes().IsDocNodes() ||
- IsHiddenFlag() )
+ IsHiddenFlag() ||
+ (pLayout->IsHideRedlines() && pSectNd->GetRedlineMergeFlag() == SwNode::Merge::Hidden))
{
return;
}
@@ -837,7 +852,7 @@ void SwTOXBaseSection::Update(const SfxItemSet* pAttr,
// find the first layout node for this TOX, if it only find the content
// in his own chapter
const SwTextNode* pOwnChapterNode = IsFromChapter()
- ? ::lcl_FindChapterNode( *pSectNd )
+ ? ::lcl_FindChapterNode( *pSectNd, pLayout )
: nullptr;
SwNode2LayoutSaveUpperFrames aN2L(*pSectNd);
@@ -901,36 +916,36 @@ void SwTOXBaseSection::Update(const SfxItemSet* pAttr,
pDoc->UpdateNumRule();
if( GetCreateType() & SwTOXElement::Mark )
- UpdateMarks( aIntl, pOwnChapterNode );
+ UpdateMarks( aIntl, pOwnChapterNode, pLayout );
if( GetCreateType() & SwTOXElement::OutlineLevel )
- UpdateOutline( pOwnChapterNode );
+ UpdateOutline( pOwnChapterNode, pLayout );
if( GetCreateType() & SwTOXElement::Template )
- UpdateTemplate( pOwnChapterNode );
+ UpdateTemplate( pOwnChapterNode, pLayout );
if( GetCreateType() & SwTOXElement::Ole ||
TOX_OBJECTS == SwTOXBase::GetType())
- UpdateContent( SwTOXElement::Ole, pOwnChapterNode );
+ UpdateContent( SwTOXElement::Ole, pOwnChapterNode, pLayout );
if( GetCreateType() & SwTOXElement::Table ||
(TOX_TABLES == SwTOXBase::GetType() && IsFromObjectNames()) )
- UpdateTable( pOwnChapterNode );
+ UpdateTable( pOwnChapterNode, pLayout );
if( GetCreateType() & SwTOXElement::Graphic ||
(TOX_ILLUSTRATIONS == SwTOXBase::GetType() && IsFromObjectNames()))
- UpdateContent( SwTOXElement::Graphic, pOwnChapterNode );
+ UpdateContent( SwTOXElement::Graphic, pOwnChapterNode, pLayout );
if( !GetSequenceName().isEmpty() && !IsFromObjectNames() &&
(TOX_TABLES == SwTOXBase::GetType() ||
TOX_ILLUSTRATIONS == SwTOXBase::GetType() ) )
- UpdateSequence( pOwnChapterNode );
+ UpdateSequence( pOwnChapterNode, pLayout );
if( GetCreateType() & SwTOXElement::Frame )
- UpdateContent( SwTOXElement::Frame, pOwnChapterNode );
+ UpdateContent( SwTOXElement::Frame, pOwnChapterNode, pLayout );
if(TOX_AUTHORITIES == SwTOXBase::GetType())
- UpdateAuthorities( aIntl );
+ UpdateAuthorities( aIntl, pLayout );
// Insert AlphaDelimitters if needed (just for keywords)
if( TOX_INDEX == SwTOXBase::GetType() &&
@@ -987,7 +1002,7 @@ void SwTOXBaseSection::Update(const SfxItemSet* pAttr,
sw::DefaultToxTabStopTokenHandler::TABSTOPS_RELATIVE_TO_INDENT :
sw::DefaultToxTabStopTokenHandler::TABSTOPS_RELATIVE_TO_PAGE);
sw::ToxTextGenerator ttgn(GetTOXForm(), tabStopTokenHandler);
- ttgn.GenerateText(GetFormat()->GetDoc(), m_aSortArr, nCnt, nRange);
+ ttgn.GenerateText(GetFormat()->GetDoc(), m_aSortArr, nCnt, nRange, pLayout);
nCnt += nRange - 1;
}
@@ -1054,7 +1069,9 @@ void SwTOXBaseSection::InsertAlphaDelimitter( const SwTOXInternational& rIntl )
// We skip all that are less than a small Blank (these are special characters)
if( ' ' <= sDeli[0] )
{
- std::unique_ptr<SwTOXCustom> pCst(new SwTOXCustom( TextAndReading(sDeli, OUString()),
+ std::unique_ptr<SwTOXCustom> pCst(
+ MakeSwTOXSortTabBase<SwTOXCustom>(nullptr,
+ TextAndReading(sDeli, OUString()),
FORM_ALPHA_DELIMITTER,
rIntl, m_aSortArr[i]->GetLocale() ));
m_aSortArr.insert( m_aSortArr.begin() + i, std::move(pCst));
@@ -1122,7 +1139,8 @@ SwTextFormatColl* SwTOXBaseSection::GetTextFormatColl( sal_uInt16 nLevel )
/// Create from Marks
void SwTOXBaseSection::UpdateMarks( const SwTOXInternational& rIntl,
- const SwTextNode* pOwnChapterNode )
+ const SwTextNode* pOwnChapterNode,
+ SwRootFrame const*const pLayout)
{
const SwTOXType* pType = static_cast<SwTOXType*>( SwTOXBase::GetRegisteredIn() );
if( !pType->HasWriterListeners() )
@@ -1149,9 +1167,11 @@ void SwTOXBaseSection::UpdateMarks( const SwTOXInternational& rIntl,
if( pTOXSrc->GetNodes().IsDocNodes() &&
pTOXSrc->GetText().getLength() && pTOXSrc->HasWriterListeners() &&
pTOXSrc->getLayoutFrame( pDoc->getIDocumentLayoutAccess().GetCurrentLayout() ) &&
- (!IsFromChapter() || ::lcl_FindChapterNode( *pTOXSrc ) == pOwnChapterNode ) &&
+ (!IsFromChapter() || ::lcl_FindChapterNode(*pTOXSrc, pLayout) == pOwnChapterNode) &&
!pTOXSrc->IsHiddenByParaField() &&
- !SwScriptInfo::IsInHiddenRange( *pTOXSrc, pTextMark->GetStart() ) )
+ !SwScriptInfo::IsInHiddenRange(*pTOXSrc, pTextMark->GetStart()) &&
+ (!pLayout || !pLayout->IsHideRedlines()
+ || !sw::IsMarkHintHidden(*pLayout, *pTOXSrc, *pTextMark)))
{
if(TOX_INDEX == eTOXTyp)
{
@@ -1159,16 +1179,16 @@ void SwTOXBaseSection::UpdateMarks( const SwTOXInternational& rIntl,
assert(g_pBreakIt);
lang::Locale aLocale = g_pBreakIt->GetLocale(pTOXSrc->GetLang(pTextMark->GetStart()));
- InsertSorted(o3tl::make_unique<SwTOXIndex>( *pTOXSrc, pTextMark,
+ InsertSorted(MakeSwTOXSortTabBase<SwTOXIndex>(pLayout, *pTOXSrc, pTextMark,
GetOptions(), FORM_ENTRY, rIntl, aLocale ));
if(GetOptions() & SwTOIOptions::KeyAsEntry &&
!pTextMark->GetTOXMark().GetPrimaryKey().isEmpty())
{
- InsertSorted(o3tl::make_unique<SwTOXIndex>( *pTOXSrc, pTextMark,
+ InsertSorted(MakeSwTOXSortTabBase<SwTOXIndex>(pLayout, *pTOXSrc, pTextMark,
GetOptions(), FORM_PRIMARY_KEY, rIntl, aLocale ));
if (!pTextMark->GetTOXMark().GetSecondaryKey().isEmpty())
{
- InsertSorted(o3tl::make_unique<SwTOXIndex>( *pTOXSrc, pTextMark,
+ InsertSorted(MakeSwTOXSortTabBase<SwTOXIndex>(pLayout, *pTOXSrc, pTextMark,
GetOptions(), FORM_SECONDARY_KEY, rIntl, aLocale ));
}
}
@@ -1177,7 +1197,7 @@ void SwTOXBaseSection::UpdateMarks( const SwTOXInternational& rIntl,
pMark->GetLevel() <= GetLevel())
{ // table of content mark
// also used for user marks
- InsertSorted(o3tl::make_unique<SwTOXContent>( *pTOXSrc, pTextMark, rIntl ));
+ InsertSorted(MakeSwTOXSortTabBase<SwTOXContent>(pLayout, *pTOXSrc, pTextMark, rIntl));
}
}
}
@@ -1185,7 +1205,8 @@ void SwTOXBaseSection::UpdateMarks( const SwTOXInternational& rIntl,
}
/// Generate table of contents from outline
-void SwTOXBaseSection::UpdateOutline( const SwTextNode* pOwnChapterNode )
+void SwTOXBaseSection::UpdateOutline( const SwTextNode* pOwnChapterNode,
+ SwRootFrame const*const pLayout)
{
SwDoc* pDoc = GetFormat()->GetDoc();
SwNodes& rNds = pDoc->GetNodes();
@@ -1197,19 +1218,22 @@ void SwTOXBaseSection::UpdateOutline( const SwTextNode* pOwnChapterNode )
SwTextNode* pTextNd = pOutlineNode->GetTextNode();
if( pTextNd && pTextNd->Len() && pTextNd->HasWriterListeners() &&
sal_uInt16( pTextNd->GetAttrOutlineLevel()) <= GetLevel() &&
- pTextNd->getLayoutFrame( pDoc->getIDocumentLayoutAccess().GetCurrentLayout() ) &&
+ pTextNd->getLayoutFrame(pLayout) &&
!pTextNd->IsHiddenByParaField() &&
!pTextNd->HasHiddenCharAttribute( true ) &&
+ (!pLayout || !pLayout->IsHideRedlines()
+ || static_cast<SwTextFrame*>(pTextNd->getLayoutFrame(pLayout))->GetTextNodeForParaProps() == pTextNd) &&
( !IsFromChapter() ||
- ::lcl_FindChapterNode( *pTextNd ) == pOwnChapterNode ))
+ ::lcl_FindChapterNode(*pTextNd, pLayout) == pOwnChapterNode ))
{
- InsertSorted( o3tl::make_unique<SwTOXPara>( *pTextNd, SwTOXElement::OutlineLevel ) );
+ InsertSorted(MakeSwTOXSortTabBase<SwTOXPara>(pLayout, *pTextNd, SwTOXElement::OutlineLevel));
}
}
}
/// Generate table of contents from template areas
-void SwTOXBaseSection::UpdateTemplate( const SwTextNode* pOwnChapterNode )
+void SwTOXBaseSection::UpdateTemplate(const SwTextNode* pOwnChapterNode,
+ SwRootFrame const*const pLayout)
{
SwDoc* pDoc = GetFormat()->GetDoc();
for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
@@ -1236,12 +1260,14 @@ void SwTOXBaseSection::UpdateTemplate( const SwTextNode* pOwnChapterNode )
::SetProgressState( 0, pDoc->GetDocShell() );
if (pTextNd->GetText().getLength() &&
- pTextNd->getLayoutFrame(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()) &&
+ pTextNd->getLayoutFrame(pLayout) &&
pTextNd->GetNodes().IsDocNodes() &&
- ( !IsFromChapter() || pOwnChapterNode ==
- ::lcl_FindChapterNode( *pTextNd ) ) )
+ (!pLayout || !pLayout->IsHideRedlines()
+ || static_cast<SwTextFrame*>(pTextNd->getLayoutFrame(pLayout))->GetTextNodeForParaProps() == pTextNd) &&
+ (!IsFromChapter() || pOwnChapterNode ==
+ ::lcl_FindChapterNode(*pTextNd, pLayout)))
{
- InsertSorted( o3tl::make_unique<SwTOXPara>( *pTextNd, SwTOXElement::Template, i + 1 ) );
+ InsertSorted(MakeSwTOXSortTabBase<SwTOXPara>(pLayout, *pTextNd, SwTOXElement::Template, i + 1));
}
}
}
@@ -1249,7 +1275,8 @@ void SwTOXBaseSection::UpdateTemplate( const SwTextNode* pOwnChapterNode )
}
/// Generate content from sequence fields
-void SwTOXBaseSection::UpdateSequence( const SwTextNode* pOwnChapterNode )
+void SwTOXBaseSection::UpdateSequence(const SwTextNode* pOwnChapterNode,
+ SwRootFrame const*const pLayout)
{
SwDoc* pDoc = GetFormat()->GetDoc();
SwFieldType* pSeqField = pDoc->getIDocumentFieldsAccess().GetFieldType(SwFieldIds::SetExp, GetSequenceName(), false);
@@ -1266,10 +1293,12 @@ void SwTOXBaseSection::UpdateSequence( const SwTextNode* pOwnChapterNode )
::SetProgressState( 0, pDoc->GetDocShell() );
if (rTextNode.GetText().getLength() &&
- rTextNode.getLayoutFrame(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()) &&
+ rTextNode.getLayoutFrame(pLayout) &&
rTextNode.GetNodes().IsDocNodes() &&
( !IsFromChapter() ||
- ::lcl_FindChapterNode( rTextNode ) == pOwnChapterNode ) )
+ ::lcl_FindChapterNode(rTextNode, pLayout) == pOwnChapterNode)
+ && (!pLayout || !pLayout->IsHideRedlines()
+ || !sw::IsFieldDeletedInModel(pDoc->getIDocumentRedlineAccess(), *pTextField)))
{
const SwSetExpField& rSeqField = dynamic_cast<const SwSetExpField&>(*(pFormatField->GetField()));
const OUString sName = GetSequenceName()
@@ -1286,12 +1315,14 @@ void SwTOXBaseSection::UpdateSequence( const SwTextNode* pOwnChapterNode )
{
pNew->SetEndIndex(pTextField->GetStart() + 1);
}
+ pNew->InitText(pLayout);
InsertSorted(std::move(pNew));
}
}
}
-void SwTOXBaseSection::UpdateAuthorities( const SwTOXInternational& rIntl )
+void SwTOXBaseSection::UpdateAuthorities(const SwTOXInternational& rIntl,
+ SwRootFrame const*const pLayout)
{
SwDoc* pDoc = GetFormat()->GetDoc();
SwFieldType* pAuthField = pDoc->getIDocumentFieldsAccess().GetFieldType(SwFieldIds::TableOfAuthorities, OUString(), false);
@@ -1309,11 +1340,13 @@ void SwTOXBaseSection::UpdateAuthorities( const SwTOXInternational& rIntl )
::SetProgressState( 0, pDoc->GetDocShell() );
if (rTextNode.GetText().getLength() &&
- rTextNode.getLayoutFrame(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()) &&
- rTextNode.GetNodes().IsDocNodes() )
+ rTextNode.getLayoutFrame(pLayout) &&
+ rTextNode.GetNodes().IsDocNodes()
+ && (!pLayout || !pLayout->IsHideRedlines()
+ || !sw::IsFieldDeletedInModel(pDoc->getIDocumentRedlineAccess(), *pTextField)))
{
//#106485# the body node has to be used!
- SwContentFrame *pFrame = rTextNode.getLayoutFrame( pDoc->getIDocumentLayoutAccess().GetCurrentLayout() );
+ SwContentFrame *const pFrame = rTextNode.getLayoutFrame(pLayout);
SwPosition aFieldPos(rTextNode);
const SwTextNode* pTextNode = nullptr;
if(pFrame && !pFrame->IsInDocBody())
@@ -1321,7 +1354,7 @@ void SwTOXBaseSection::UpdateAuthorities( const SwTOXInternational& rIntl )
if(!pTextNode)
pTextNode = &rTextNode;
- InsertSorted(o3tl::make_unique<SwTOXAuthority>( *pTextNode, *pFormatField, rIntl ));
+ InsertSorted(MakeSwTOXSortTabBase<SwTOXAuthority>(pLayout, *pTextNode, *pFormatField, rIntl));
}
}
}
@@ -1371,7 +1404,8 @@ static SwTOOElements lcl_IsSOObject( const SvGlobalName& rFactoryNm )
}
void SwTOXBaseSection::UpdateContent( SwTOXElement eMyType,
- const SwTextNode* pOwnChapterNode )
+ const SwTextNode* pOwnChapterNode,
+ SwRootFrame const*const pLayout)
{
SwDoc* pDoc = GetFormat()->GetDoc();
SwNodes& rNds = pDoc->GetNodes();
@@ -1445,7 +1479,7 @@ void SwTOXBaseSection::UpdateContent( SwTOXElement eMyType,
TOX_OBJECTS != SwTOXBase::GetType() )
{
const SwTextNode* pOutlNd = ::lcl_FindChapterNode( *pCNd,
- MAXLEVEL - 1 );
+ pLayout, MAXLEVEL - 1);
if( pOutlNd )
{
if( pOutlNd->GetTextColl()->IsAssignedToListLevelOfOutlineStyle())
@@ -1455,10 +1489,14 @@ void SwTOXBaseSection::UpdateContent( SwTOXElement eMyType,
}
}
- if( pCNd->getLayoutFrame( pDoc->getIDocumentLayoutAccess().GetCurrentLayout() ) && ( !IsFromChapter() ||
- ::lcl_FindChapterNode( *pCNd ) == pOwnChapterNode ))
+ if (pCNd->getLayoutFrame(pLayout)
+ && (!pLayout || !pLayout->IsHideRedlines()
+ || pCNd->GetRedlineMergeFlag() != SwNode::Merge::Hidden)
+ && ( !IsFromChapter() ||
+ ::lcl_FindChapterNode(*pCNd, pLayout) == pOwnChapterNode ))
{
- std::unique_ptr<SwTOXPara> pNew( new SwTOXPara( *pCNd, eMyType,
+ std::unique_ptr<SwTOXPara> pNew( MakeSwTOXSortTabBase<SwTOXPara>(
+ pLayout, *pCNd, eMyType,
( USHRT_MAX != nSetLevel )
? static_cast<sal_uInt16>(nSetLevel)
: FORM_ALPHA_DELIMITTER ) );
@@ -1471,7 +1509,8 @@ void SwTOXBaseSection::UpdateContent( SwTOXElement eMyType,
}
/// Collect table entries
-void SwTOXBaseSection::UpdateTable( const SwTextNode* pOwnChapterNode )
+void SwTOXBaseSection::UpdateTable(const SwTextNode* pOwnChapterNode,
+ SwRootFrame const*const pLayout)
{
SwDoc* pDoc = GetFormat()->GetDoc();
SwNodes& rNds = pDoc->GetNodes();
@@ -1493,14 +1532,17 @@ void SwTOXBaseSection::UpdateTable( const SwTextNode* pOwnChapterNode )
while( nullptr != ( pCNd = rNds.GoNext( &aContentIdx ) ) &&
aContentIdx.GetIndex() < pTableNd->EndOfSectionIndex() )
{
- if( pCNd->getLayoutFrame( pDoc->getIDocumentLayoutAccess().GetCurrentLayout() ) && (!IsFromChapter() ||
- ::lcl_FindChapterNode( *pCNd ) == pOwnChapterNode ))
+ if (pCNd->getLayoutFrame(pLayout)
+ && (!pLayout || !pLayout->IsHideRedlines()
+ || pCNd->GetRedlineMergeFlag() != SwNode::Merge::Hidden)
+ && (!IsFromChapter()
+ || ::lcl_FindChapterNode(*pCNd, pLayout) == pOwnChapterNode))
{
std::unique_ptr<SwTOXTable> pNew(new SwTOXTable( *pCNd ));
if( IsLevelFromChapter() && TOX_TABLES != SwTOXBase::GetType())
{
const SwTextNode* pOutlNd =
- ::lcl_FindChapterNode( *pCNd, MAXLEVEL - 1 );
+ ::lcl_FindChapterNode(*pCNd, pLayout, MAXLEVEL - 1);
if( pOutlNd )
{
if( pOutlNd->GetTextColl()->IsAssignedToListLevelOfOutlineStyle())
@@ -1510,6 +1552,7 @@ void SwTOXBaseSection::UpdateTable( const SwTextNode* pOwnChapterNode )
}
}
}
+ pNew->InitText(pLayout);
InsertSorted(std::move(pNew));
break;
}
@@ -1917,8 +1960,8 @@ Range SwTOXBaseSection::GetKeyRange(const OUString& rStr, const OUString& rStrRe
}
if(i == nMax)
{ // If not already present, create and insert
- std::unique_ptr<SwTOXCustom> pKey(new SwTOXCustom( aToCompare, nLevel, rIntl,
- rNew.GetLocale() ));
+ std::unique_ptr<SwTOXCustom> pKey(MakeSwTOXSortTabBase<SwTOXCustom>(
+ nullptr, aToCompare, nLevel, rIntl, rNew.GetLocale() ));
for(i = nMin; i < nMax; ++i)
{
if (nLevel == m_aSortArr[i]->GetLevel() && pKey->sort_lt(*m_aSortArr[i]))
diff --git a/sw/source/core/edit/edtox.cxx b/sw/source/core/edit/edtox.cxx
index 39b9fedc2ed6..b31e0cdf07a5 100644
--- a/sw/source/core/edit/edtox.cxx
+++ b/sw/source/core/edit/edtox.cxx
@@ -136,7 +136,7 @@ void SwEditShell::InsertTableOf( const SwTOXBase& rTOX, const SfxItemSet* pSet )
// Insert listing
const SwTOXBaseSection* pTOX = mxDoc->InsertTableOf(
- *GetCursor()->GetPoint(), rTOX, pSet, true );
+ *GetCursor()->GetPoint(), rTOX, pSet, true, GetLayout() );
OSL_ENSURE(pTOX, "No current TOx");
// start formatting
@@ -173,7 +173,7 @@ void SwEditShell::UpdateTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet)
pMyDoc->GetIDocumentUndoRedo().StartUndo(SwUndoId::TOXCHANGE, nullptr);
// create listing stub
- rTOXSect.Update(pSet);
+ rTOXSect.Update(pSet, GetLayout());
// correct Cursor
if( bInIndex )
@@ -214,7 +214,7 @@ const SwTOXType* SwEditShell::GetTOXType(TOXTypes eTyp, sal_uInt16 nId) const
void SwEditShell::GetTOIKeys( SwTOIKeyType eTyp, std::vector<OUString>& rArr ) const
{
- GetDoc()->GetTOIKeys( eTyp, rArr );
+ GetDoc()->GetTOIKeys( eTyp, rArr, *GetLayout() );
}
sal_uInt16 SwEditShell::GetTOXCount() const
diff --git a/sw/source/core/fields/reffld.cxx b/sw/source/core/fields/reffld.cxx
index a9e47360dc89..c0ce2d7894fc 100644
--- a/sw/source/core/fields/reffld.cxx
+++ b/sw/source/core/fields/reffld.cxx
@@ -1104,33 +1104,37 @@ void SwGetRefFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew
NotifyClients( pOld, pNew );
}
-static bool
-IsRefMarkHidden(SwRootFrame const& rLayout, SwTextRefMark const& rRefMark)
+namespace sw {
+
+bool IsMarkHintHidden(SwRootFrame const& rLayout,
+ SwTextNode const& rNode, SwTextAttrEnd const& rHint)
{
if (!rLayout.IsHideRedlines())
{
return false;
}
- SwTextNode const& rNode(rRefMark.GetTextNode());
SwTextFrame const*const pFrame(static_cast<SwTextFrame const*>(
rNode.getLayoutFrame(&rLayout)));
if (!pFrame)
{
return true;
}
- sal_Int32 const*const pEnd(const_cast<SwTextRefMark&>(rRefMark).GetEnd());
+ sal_Int32 const*const pEnd(const_cast<SwTextAttrEnd &>(rHint).GetEnd());
if (pEnd)
{
- return pFrame->MapModelToView(&rNode, rRefMark.GetStart())
+ return pFrame->MapModelToView(&rNode, rHint.GetStart())
== pFrame->MapModelToView(&rNode, *pEnd);
}
else
{
- return pFrame->MapModelToView(&rNode, rRefMark.GetStart())
- == pFrame->MapModelToView(&rNode, rRefMark.GetStart() + 1);
+ assert(rHint.HasDummyChar());
+ return pFrame->MapModelToView(&rNode, rHint.GetStart())
+ == pFrame->MapModelToView(&rNode, rHint.GetStart() + 1);
}
}
+} // namespace sw
+
SwTextNode* SwGetRefFieldType::FindAnchor( SwDoc* pDoc, const OUString& rRefMark,
sal_uInt16 nSubType, sal_uInt16 nSeqNo,
sal_Int32* pStt, sal_Int32* pEnd,
@@ -1146,7 +1150,8 @@ SwTextNode* SwGetRefFieldType::FindAnchor( SwDoc* pDoc, const OUString& rRefMark
{
const SwFormatRefMark *pRef = pDoc->GetRefMark( rRefMark );
SwTextRefMark const*const pRefMark(pRef ? pRef->GetTextRefMark() : nullptr);
- if (pRefMark && (!pLayout || !IsRefMarkHidden(*pLayout, *pRefMark)))
+ if (pRefMark && (!pLayout || !sw::IsMarkHintHidden(*pLayout,
+ pRefMark->GetTextNode(), *pRefMark)))
{
pTextNd = const_cast<SwTextNode*>(&pRef->GetTextRefMark()->GetTextNode());
*pStt = pRef->GetTextRefMark()->GetStart();
diff --git a/sw/source/core/inc/doctxm.hxx b/sw/source/core/inc/doctxm.hxx
index a23771fd70f1..59875566fa8f 100644
--- a/sw/source/core/inc/doctxm.hxx
+++ b/sw/source/core/inc/doctxm.hxx
@@ -36,14 +36,21 @@ class SwTOXBaseSection : public SwTOXBase, public SwSection
std::vector<std::unique_ptr<SwTOXSortTabBase>> m_aSortArr;
void UpdateMarks( const SwTOXInternational& rIntl,
- const SwTextNode* pOwnChapterNode );
- void UpdateOutline( const SwTextNode* pOwnChapterNode );
- void UpdateTemplate( const SwTextNode* pOwnChapterNode );
+ const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateOutline( const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateTemplate( const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
void UpdateContent( SwTOXElement eType,
- const SwTextNode* pOwnChapterNode );
- void UpdateTable( const SwTextNode* pOwnChapterNode );
- void UpdateSequence( const SwTextNode* pOwnChapterNode );
- void UpdateAuthorities( const SwTOXInternational& rIntl );
+ const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateTable( const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateSequence( const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateAuthorities( const SwTOXInternational& rIntl,
+ SwRootFrame const* pLayout );
// insert sorted into array for creation
void InsertSorted(std::unique_ptr<SwTOXSortTabBase> pBase);
@@ -73,6 +80,7 @@ public:
// <_bNewTOX> : distinguish between the creation of a new table-of-content
// (true) or an update of a table-of-content (false)
void Update( const SfxItemSet* pAttr = nullptr,
+ SwRootFrame const* pLayout = nullptr,
const bool _bNewTOX = false );
void UpdatePageNum(); // insert page numbering
diff --git a/sw/source/core/inc/txmsrt.hxx b/sw/source/core/inc/txmsrt.hxx
index 548852698309..887d987da85c 100644
--- a/sw/source/core/inc/txmsrt.hxx
+++ b/sw/source/core/inc/txmsrt.hxx
@@ -30,6 +30,7 @@ class SwTextNode;
class SwTextTOXMark;
class SwIndex;
class SwFormatField;
+class SwRootFrame;
class IndexEntrySupplierWrapper;
enum TOXSortType
@@ -141,32 +142,40 @@ struct SwTOXSortTabBase
sal_uInt16 GetType() const { return nType; }
static SwTOIOptions GetOptions() { return nOpt; }
- virtual void FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 nAuthField ) const;
+ virtual void FillText(SwTextNode& rNd, const SwIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const;
virtual sal_uInt16 GetLevel() const = 0;
virtual bool equivalent( const SwTOXSortTabBase& );
virtual bool sort_lt( const SwTOXSortTabBase& );
virtual OUString GetURL() const;
+ virtual bool IsFullPara() const;
+
+ // must be called
+ inline void InitText(SwRootFrame const*const pLayout);
inline TextAndReading const & GetText() const;
inline const css::lang::Locale& GetLocale() const;
private:
- mutable bool bValidText;
- mutable TextAndReading m_aSort;
+ bool m_bValidText;
+ TextAndReading m_aSort;
- virtual TextAndReading GetText_Impl() const = 0;
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const = 0;
};
-inline TextAndReading const & SwTOXSortTabBase::GetText() const
+inline void SwTOXSortTabBase::InitText(SwRootFrame const*const pLayout)
{
- if( !bValidText )
- {
// 'this' is 'SwTOXSortTabBase const*', so the virtual
// mechanism will call the derived class' GetText_Impl
- m_aSort = GetText_Impl();
- bValidText = true;
- }
+ assert(!m_bValidText);
+ m_aSort = GetText_Impl(pLayout);
+ m_bValidText = true;
+}
+
+inline TextAndReading const & SwTOXSortTabBase::GetText() const
+{
+ assert(m_bValidText);
return m_aSort;
}
@@ -184,13 +193,14 @@ struct SwTOXIndex : public SwTOXSortTabBase
const SwTOXInternational& rIntl,
const css::lang::Locale& rLocale );
- virtual void FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 nAuthField ) const override;
+ virtual void FillText(SwTextNode& rNd, const SwIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const override;
virtual sal_uInt16 GetLevel() const override;
virtual bool equivalent( const SwTOXSortTabBase& ) override;
virtual bool sort_lt( const SwTOXSortTabBase& ) override;
private:
- virtual TextAndReading GetText_Impl() const override;
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
sal_uInt8 const nKeyLevel;
};
@@ -206,7 +216,7 @@ struct SwTOXCustom : public SwTOXSortTabBase
virtual bool sort_lt( const SwTOXSortTabBase& ) override;
private:
- virtual TextAndReading GetText_Impl() const override;
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
TextAndReading const m_aKey;
sal_uInt16 const nLev;
@@ -220,10 +230,11 @@ struct SwTOXContent : public SwTOXSortTabBase
SwTOXContent( const SwTextNode&, const SwTextTOXMark*,
const SwTOXInternational& rIntl );
- virtual void FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 nAuthField ) const override;
+ virtual void FillText(SwTextNode& rNd, const SwIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const override;
virtual sal_uInt16 GetLevel() const override;
private:
- virtual TextAndReading GetText_Impl() const override;
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
};
@@ -234,12 +245,14 @@ struct SwTOXPara : public SwTOXSortTabBase
void SetStartIndex(sal_Int32 nSet) { nStartIndex = nSet; }
void SetEndIndex(sal_Int32 nSet) { nEndIndex = nSet; }
- virtual void FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 nAuthField ) const override;
+ virtual void FillText(SwTextNode& rNd, const SwIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const override;
virtual sal_uInt16 GetLevel() const override;
virtual OUString GetURL() const override;
+ virtual bool IsFullPara() const override;
private:
- virtual TextAndReading GetText_Impl() const override;
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
SwTOXElement const eType;
sal_uInt16 const m_nLevel;
@@ -258,7 +271,7 @@ struct SwTOXTable : public SwTOXSortTabBase
virtual OUString GetURL() const override;
private:
- virtual TextAndReading GetText_Impl() const override;
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
sal_uInt16 nLevel;
};
@@ -267,8 +280,9 @@ struct SwTOXAuthority : public SwTOXSortTabBase
{
private:
SwFormatField& m_rField;
- virtual void FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 nAuthField ) const override;
- virtual TextAndReading GetText_Impl() const override;
+ virtual void FillText(SwTextNode& rNd, const SwIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const override;
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
public:
SwTOXAuthority( const SwContentNode& rNd, SwFormatField& rField, const SwTOXInternational& rIntl );
diff --git a/sw/source/core/inc/txtfrm.hxx b/sw/source/core/inc/txtfrm.hxx
index b9bb1b498496..9af04de107a5 100644
--- a/sw/source/core/inc/txtfrm.hxx
+++ b/sw/source/core/inc/txtfrm.hxx
@@ -29,6 +29,7 @@ namespace com { namespace sun { namespace star { namespace linguistic2 { class X
namespace sw { namespace mark { class IMark; } }
class SwCharRange;
class SwTextNode;
+class SwTextAttrEnd;
class SwTextFormatter;
class SwTextFormatInfo;
class SwParaPortion;
@@ -137,6 +138,8 @@ OUString GetExpandTextMerged(SwRootFrame const* pLayout,
bool bWithSpacesForLevel, ExpandMode i_mode);
bool IsMarkHidden(SwRootFrame const& rLayout, ::sw::mark::IMark const& rMark);
+bool IsMarkHintHidden(SwRootFrame const& rLayout,
+ SwTextNode const& rNode, SwTextAttrEnd const& rHint);
} // namespace sw
diff --git a/sw/source/core/tox/ToxTextGenerator.cxx b/sw/source/core/tox/ToxTextGenerator.cxx
index 31dab3d5b2fe..7c29f0e7c979 100644
--- a/sw/source/core/tox/ToxTextGenerator.cxx
+++ b/sw/source/core/tox/ToxTextGenerator.cxx
@@ -21,6 +21,9 @@
#include <chpfld.hxx>
#include <cntfrm.hxx>
+#include <txtfrm.hxx>
+#include <rootfrm.hxx>
+#include <ndindex.hxx>
#include <fchrfmt.hxx>
#include <doc.hxx>
#include <IDocumentLayoutAccess.hxx>
@@ -63,7 +66,9 @@ bool sortTabHasNoToxSourcesOrFirstToxSourceHasNoNode(const SwTOXSortTabBase& sor
namespace sw {
OUString
-ToxTextGenerator::GetNumStringOfFirstNode( const SwTOXSortTabBase& rBase, bool bUsePrefix, sal_uInt8 nLevel )
+ToxTextGenerator::GetNumStringOfFirstNode(const SwTOXSortTabBase& rBase,
+ bool bUsePrefix, sal_uInt8 nLevel,
+ SwRootFrame const*const pLayout)
{
if (sortTabHasNoToxSourcesOrFirstToxSourceHasNoNode(rBase)) {
return OUString();
@@ -78,6 +83,10 @@ ToxTextGenerator::GetNumStringOfFirstNode( const SwTOXSortTabBase& rBase, bool b
if (!pNd) {
return sRet;
}
+ if (pLayout && pLayout->IsHideRedlines())
+ { // note: pNd could be any node, since it could be Sequence etc.
+ pNd = sw::GetParaPropsNode(*pLayout, SwNodeIndex(*pNd));
+ }
const SwNumRule* pRule = pNd->GetNumRule();
if (!pRule) {
@@ -85,7 +94,7 @@ ToxTextGenerator::GetNumStringOfFirstNode( const SwTOXSortTabBase& rBase, bool b
}
if (pNd->GetActualListLevel() < MAXLEVEL) {
- sRet = pNd->GetNumString(bUsePrefix, nLevel);
+ sRet = pNd->GetNumString(bUsePrefix, nLevel, pLayout);
}
if (!sRet.isEmpty()) {
@@ -107,8 +116,8 @@ ToxTextGenerator::~ToxTextGenerator()
{}
OUString
-ToxTextGenerator::HandleChapterToken(const SwTOXSortTabBase& rBase, const SwFormToken& aToken,
- SwDoc* pDoc) const
+ToxTextGenerator::HandleChapterToken(const SwTOXSortTabBase& rBase,
+ const SwFormToken& aToken, SwRootFrame const*const pLayout) const
{
if (sortTabHasNoToxSourcesOrFirstToxSourceHasNoNode(rBase)) {
return OUString();
@@ -121,17 +130,18 @@ ToxTextGenerator::HandleChapterToken(const SwTOXSortTabBase& rBase, const SwForm
}
// #i53420#
- const SwContentFrame* contentFrame = contentNode->getLayoutFrame(pDoc->getIDocumentLayoutAccess().GetCurrentLayout());
+ const SwContentFrame* contentFrame = contentNode->getLayoutFrame(pLayout);
if (!contentFrame) {
return OUString();
}
- return GenerateTextForChapterToken(aToken, contentFrame, contentNode);
+ return GenerateTextForChapterToken(aToken, contentFrame, contentNode, pLayout);
}
OUString
ToxTextGenerator::GenerateTextForChapterToken(const SwFormToken& chapterToken, const SwContentFrame* contentFrame,
- const SwContentNode *contentNode) const
+ const SwContentNode *contentNode,
+ SwRootFrame const*const pLayout) const
{
OUString retval;
@@ -142,14 +152,14 @@ ToxTextGenerator::GenerateTextForChapterToken(const SwFormToken& chapterToken, c
// continue to support CF_NUMBER and CF_NUM_TITLE in order to handle ODF 1.0/1.1 written by OOo 3.x
// in the same way as OOo 2.x would handle them.
if (CF_NUM_NOPREPST_TITLE == chapterToken.nChapterFormat || CF_NUMBER == chapterToken.nChapterFormat) {
- retval += aField.GetNumber(); // get the string number without pre/postfix
+ retval += aField.GetNumber(pLayout); // get the string number without pre/postfix
}
else if (CF_NUMBER_NOPREPST == chapterToken.nChapterFormat || CF_NUM_TITLE == chapterToken.nChapterFormat) {
- retval += aField.GetNumber();
+ retval += aField.GetNumber(pLayout);
retval += " ";
- retval += aField.GetTitle();
+ retval += aField.GetTitle(pLayout);
} else if (CF_TITLE == chapterToken.nChapterFormat) {
- retval += aField.GetTitle();
+ retval += aField.GetTitle(pLayout);
}
return retval;
}
@@ -158,7 +168,8 @@ ToxTextGenerator::GenerateTextForChapterToken(const SwFormToken& chapterToken, c
// which page description is used, no appropriate one is found.
void
ToxTextGenerator::GenerateText(SwDoc* pDoc, const std::vector<std::unique_ptr<SwTOXSortTabBase>> &entries,
- sal_uInt16 indexOfEntryToProcess, sal_uInt16 numberOfEntriesToProcess)
+ sal_uInt16 indexOfEntryToProcess, sal_uInt16 numberOfEntriesToProcess,
+ SwRootFrame const*const pLayout)
{
// pTOXNd is only set at the first mark
SwTextNode* pTOXNd = const_cast<SwTextNode*>(entries.at(indexOfEntryToProcess)->pTOXNd);
@@ -186,11 +197,13 @@ ToxTextGenerator::GenerateText(SwDoc* pDoc, const std::vector<std::unique_ptr<Sw
{
case TOKEN_ENTRY_NO:
// for TOC numbering
- rText += GetNumStringOfFirstNode( rBase, aToken.nChapterFormat == CF_NUMBER, static_cast<sal_uInt8>(aToken.nOutlineLevel - 1) ) ;
+ rText += GetNumStringOfFirstNode(rBase,
+ aToken.nChapterFormat == CF_NUMBER,
+ static_cast<sal_uInt8>(aToken.nOutlineLevel - 1), pLayout);
break;
case TOKEN_ENTRY_TEXT: {
- HandledTextToken htt = HandleTextToken(rBase, pDoc->GetAttrPool());
+ HandledTextToken htt = HandleTextToken(rBase, pDoc->GetAttrPool(), pLayout);
ApplyHandledTextToken(htt, *pTOXNd);
}
break;
@@ -198,8 +211,8 @@ ToxTextGenerator::GenerateText(SwDoc* pDoc, const std::vector<std::unique_ptr<Sw
case TOKEN_ENTRY:
{
// for TOC numbering
- rText += GetNumStringOfFirstNode( rBase, true, MAXLEVEL );
- HandledTextToken htt = HandleTextToken(rBase, pDoc->GetAttrPool() );
+ rText += GetNumStringOfFirstNode(rBase, true, MAXLEVEL, pLayout);
+ HandledTextToken htt = HandleTextToken(rBase, pDoc->GetAttrPool(), pLayout);
ApplyHandledTextToken(htt, *pTOXNd);
}
break;
@@ -221,7 +234,7 @@ ToxTextGenerator::GenerateText(SwDoc* pDoc, const std::vector<std::unique_ptr<Sw
break;
case TOKEN_CHAPTER_INFO:
- rText += HandleChapterToken(rBase, aToken, pDoc);
+ rText += HandleChapterToken(rBase, aToken, pLayout);
break;
case TOKEN_LINK_START:
@@ -236,7 +249,7 @@ ToxTextGenerator::GenerateText(SwDoc* pDoc, const std::vector<std::unique_ptr<Sw
{
ToxAuthorityField eField = static_cast<ToxAuthorityField>(aToken.nAuthorityField);
SwIndex aIdx( pTOXNd, rText.getLength() );
- rBase.FillText( *pTOXNd, aIdx, static_cast<sal_uInt16>(eField) );
+ rBase.FillText( *pTOXNd, aIdx, static_cast<sal_uInt16>(eField), pLayout );
}
break;
case TOKEN_END: break;
@@ -290,40 +303,98 @@ ToxTextGenerator::CollectAttributesForTox(const SwTextAttr& hint, SwAttrPool& po
return retval;
}
+void ToxTextGenerator::GetAttributesForNode(
+ ToxTextGenerator::HandledTextToken & rResult,
+ sal_Int32 & rOffset,
+ SwTextNode const& rNode,
+ ToxWhitespaceStripper const& rStripper,
+ SwAttrPool & rPool,
+ SwRootFrame const*const pLayout)
+{
+ // note: this *must* use the same flags as SwTextNode::GetExpandText()
+ // or indexes will be off!
+ ExpandMode eMode = ExpandMode::ExpandFields;
+ if (pLayout && pLayout->IsHideRedlines())
+ {
+ eMode |= ExpandMode::HideDeletions;
+ }
+ ModelToViewHelper aConversionMap(rNode, pLayout, eMode);
+ if (SwpHints const*const pHints = rNode.GetpSwpHints())
+ {
+ for (size_t i = 0; i < pHints->Count(); ++i)
+ {
+ const SwTextAttr* pHint = pHints->Get(i);
+ std::shared_ptr<SfxItemSet> attributesToClone =
+ CollectAttributesForTox(*pHint, rPool);
+ if (attributesToClone->Count() <= 0) {
+ continue;
+ }
+
+ // sw_redlinehide: due to the ... interesting ... multi-level index
+ // mapping going on here, can't use the usual merged attr iterators :(
+
+ sal_Int32 const nStart(aConversionMap.ConvertToViewPosition(pHint->GetStart()));
+ sal_Int32 const nEnd(aConversionMap.ConvertToViewPosition(*pHint->GetAnyEnd()));
+ if (nStart != nEnd) // might be in delete redline, and useless anyway
+ {
+ std::unique_ptr<SwFormatAutoFormat> pClone(
+ static_cast<SwFormatAutoFormat*>(pHint->GetAutoFormat().Clone()));
+ pClone->SetStyleHandle(attributesToClone);
+ rResult.autoFormats.push_back(std::move(pClone));
+ // note the rStripper is on the whole merged text, so need rOffset
+ rResult.startPositions.push_back(
+ rStripper.GetPositionInStrippedString(rOffset + nStart));
+ rResult.endPositions.push_back(
+ rStripper.GetPositionInStrippedString(rOffset + nEnd));
+ }
+ }
+ }
+ rOffset += aConversionMap.getViewText().getLength();
+}
+
ToxTextGenerator::HandledTextToken
-ToxTextGenerator::HandleTextToken(const SwTOXSortTabBase& source, SwAttrPool& pool)
+ToxTextGenerator::HandleTextToken(const SwTOXSortTabBase& source,
+ SwAttrPool& pool, SwRootFrame const*const pLayout)
{
HandledTextToken result;
ToxWhitespaceStripper stripper(source.GetText().sText);
result.text = stripper.GetStrippedString();
- if( source.aTOXSources.empty() )
+ // FIXME: there is a pre-existing problem that the index mapping of the
+ // attributes only works if the paragraph is fully selected
+ if (!source.IsFullPara() || source.aTOXSources.empty())
return result;
const SwTextNode* pSrc = source.aTOXSources.front().pNd->GetTextNode();
- if (!pSrc || !pSrc->HasHints()) {
+ if (!pSrc)
+ {
return result;
}
- const SwpHints& hints = pSrc->GetSwpHints();
- for (size_t i = 0; i < hints.Count(); ++i) {
- const SwTextAttr* hint = hints.Get(i);
- std::shared_ptr<SfxItemSet> attributesToClone = CollectAttributesForTox(*hint, pool);
- if (attributesToClone->Count() <= 0) {
- continue;
+
+ sal_Int32 nOffset(0);
+ GetAttributesForNode(result, nOffset, *pSrc, stripper, pool, pLayout);
+ if (pLayout && pLayout->IsHideRedlines())
+ {
+ if (SwTextFrame const*const pFrame = static_cast<SwTextFrame*>(pSrc->getLayoutFrame(pLayout)))
+ {
+ if (sw::MergedPara const*const pMerged = pFrame->GetMergedPara())
+ {
+ // pSrc already copied above
+ assert(pSrc == pMerged->pParaPropsNode);
+ for (sal_uLong i = pSrc->GetIndex() + 1;
+ i <= pMerged->pLastNode->GetIndex(); ++i)
+ {
+ SwNode *const pTmp(pSrc->GetNodes()[i]);
+ if (pTmp->GetRedlineMergeFlag() == SwNode::Merge::NonFirst)
+ {
+ GetAttributesForNode(result, nOffset,
+ *pTmp->GetTextNode(), stripper, pool, pLayout);
+ }
+ }
+ }
}
- std::unique_ptr<SwFormatAutoFormat> clone(static_cast<SwFormatAutoFormat*>(hint->GetAutoFormat().Clone()));
- clone->SetStyleHandle(attributesToClone);
-
- result.autoFormats.push_back(std::move(clone));
-
- ModelToViewHelper aConversionMap(*pSrc, nullptr, ExpandMode::ExpandFields);
- result.startPositions.push_back(
- stripper.GetPositionInStrippedString(aConversionMap.ConvertToViewPosition(
- hint->GetStart() )));
- result.endPositions.push_back(
- stripper.GetPositionInStrippedString(aConversionMap.ConvertToViewPosition(
- *hint->GetAnyEnd() )));
}
+
return result;
}
diff --git a/sw/source/core/tox/tox.cxx b/sw/source/core/tox/tox.cxx
index 5219bbb3f551..6a5cebb92bf0 100644
--- a/sw/source/core/tox/tox.cxx
+++ b/sw/source/core/tox/tox.cxx
@@ -166,7 +166,7 @@ void SwTOXMark::InvalidateTOXMark()
NotifyClients(&aMsgHint, &aMsgHint);
}
-OUString SwTOXMark::GetText() const
+OUString SwTOXMark::GetText(SwRootFrame const*const pLayout) const
{
if( !m_aAltText.isEmpty() )
return m_aAltText;
@@ -178,7 +178,7 @@ OUString SwTOXMark::GetText() const
if( pEndIdx )
{
const sal_Int32 nStt = m_pTextAttr->GetStart();
- return m_pTextAttr->GetpTextNd()->GetExpandText(nullptr, nStt, *pEndIdx-nStt);
+ return m_pTextAttr->GetpTextNd()->GetExpandText(pLayout, nStt, *pEndIdx-nStt);
}
}
diff --git a/sw/source/core/tox/txmsrt.cxx b/sw/source/core/tox/txmsrt.cxx
index f335f13460a3..61ec0aad10f0 100644
--- a/sw/source/core/tox/txmsrt.cxx
+++ b/sw/source/core/tox/txmsrt.cxx
@@ -26,6 +26,9 @@
#include <IDocumentMarkAccess.hxx>
#include <docary.hxx>
#include <cntfrm.hxx>
+#include <txtfrm.hxx>
+#include <rootfrm.hxx>
+#include <modeltoviewhelper.hxx>
#include <node.hxx>
#include <frmatr.hxx>
#include <pam.hxx>
@@ -132,7 +135,8 @@ SwTOXSortTabBase::SwTOXSortTabBase( TOXSortType nTyp, const SwContentNode* pNd,
const SwTOXInternational* pInter,
const lang::Locale* pLocale )
: pTOXNd( nullptr ), pTextMark( pMark ), pTOXIntl( pInter ),
- nPos( 0 ), nCntPos( 0 ), nType( static_cast<sal_uInt16>(nTyp) ), bValidText( false )
+ nPos( 0 ), nCntPos( 0 ), nType( static_cast<sal_uInt16>(nTyp) )
+ , m_bValidText( false )
{
if ( pLocale )
aLocale = *pLocale;
@@ -185,8 +189,13 @@ OUString SwTOXSortTabBase::GetURL() const
return OUString();
}
+bool SwTOXSortTabBase::IsFullPara() const
+{
+ return false;
+}
+
void SwTOXSortTabBase::FillText( SwTextNode& rNd, const SwIndex& rInsPos,
- sal_uInt16 ) const
+ sal_uInt16, SwRootFrame const*const) const
{
rNd.InsertText( GetText().sText, rInsPos );
}
@@ -328,7 +337,7 @@ bool SwTOXIndex::sort_lt(const SwTOXSortTabBase& rCmpBase)
// The keyword itself
-TextAndReading SwTOXIndex::GetText_Impl() const
+TextAndReading SwTOXIndex::GetText_Impl(SwRootFrame const*const pLayout) const
{
OSL_ENSURE(pTextMark, "pTextMark == 0, No keyword");
const SwTOXMark& rTOXMark = pTextMark->GetTOXMark();
@@ -350,7 +359,7 @@ TextAndReading SwTOXIndex::GetText_Impl() const
break;
case FORM_ENTRY :
{
- aRet.sText = rTOXMark.GetText();
+ aRet.sText = rTOXMark.GetText(pLayout);
aRet.sReading = rTOXMark.GetTextReading();
}
break;
@@ -364,8 +373,10 @@ TextAndReading SwTOXIndex::GetText_Impl() const
return aRet;
}
-void SwTOXIndex::FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 ) const
+void SwTOXIndex::FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16,
+ SwRootFrame const*const pLayout) const
{
+ assert(!"sw_redlinehide: this is dead code, Bibliography only has SwTOXAuthority");
const sal_Int32* pEnd = pTextMark->End();
TextAndReading aRet;
@@ -373,9 +384,13 @@ void SwTOXIndex::FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 )
!(GetOptions() & SwTOIOptions::KeyAsEntry))
{
aRet.sText = static_cast<const SwTextNode*>(aTOXSources[0].pNd)->GetExpandText(
- nullptr,
+ pLayout,
pTextMark->GetStart(),
- *pEnd - pTextMark->GetStart());
+ *pEnd - pTextMark->GetStart(),
+ false, false, false,
+ pLayout && pLayout->IsHideRedlines()
+ ? ExpandMode::HideDeletions
+ : ExpandMode(0));
if(SwTOIOptions::InitialCaps & nOpt && pTOXIntl && !aRet.sText.isEmpty())
{
aRet.sText = pTOXIntl->ToUpper( aRet.sText, 0 ) + aRet.sText.copy(1);
@@ -432,7 +447,7 @@ sal_uInt16 SwTOXCustom::GetLevel() const
return nLev;
}
-TextAndReading SwTOXCustom::GetText_Impl() const
+TextAndReading SwTOXCustom::GetText_Impl(SwRootFrame const*const) const
{
return m_aKey;
}
@@ -446,29 +461,36 @@ SwTOXContent::SwTOXContent( const SwTextNode& rNd, const SwTextTOXMark* pMark,
// The content's text
-TextAndReading SwTOXContent::GetText_Impl() const
+TextAndReading SwTOXContent::GetText_Impl(SwRootFrame const*const pLayout) const
{
const sal_Int32* pEnd = pTextMark->End();
if( pEnd && !pTextMark->GetTOXMark().IsAlternativeText() )
{
return TextAndReading(
static_cast<const SwTextNode*>(aTOXSources[0].pNd)->GetExpandText(
- nullptr,
+ pLayout,
pTextMark->GetStart(),
- *pEnd - pTextMark->GetStart() ),
+ *pEnd - pTextMark->GetStart(),
+ false, false, false,
+ pLayout && pLayout->IsHideRedlines()
+ ? ExpandMode::HideDeletions
+ : ExpandMode(0)),
pTextMark->GetTOXMark().GetTextReading());
}
return TextAndReading(pTextMark->GetTOXMark().GetAlternativeText(), OUString());
}
-void SwTOXContent::FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 ) const
+void SwTOXContent::FillText(SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16,
+ SwRootFrame const*const pLayout) const
{
+ assert(!"sw_redlinehide: this is dead code, Bibliography only has SwTOXAuthority");
const sal_Int32* pEnd = pTextMark->End();
if( pEnd && !pTextMark->GetTOXMark().IsAlternativeText() )
+ // sw_redlinehide: this probably won't HideDeletions
static_cast<const SwTextNode*>(aTOXSources[0].pNd)->CopyExpandText(
rNd, &rInsPos, pTextMark->GetStart(),
- *pEnd - pTextMark->GetStart(), nullptr );
+ *pEnd - pTextMark->GetStart(), pLayout);
else
{
rNd.InsertText( GetText().sText, rInsPos );
@@ -495,20 +517,34 @@ SwTOXPara::SwTOXPara( const SwContentNode& rNd, SwTOXElement eT, sal_uInt16 nLev
{
}
-TextAndReading SwTOXPara::GetText_Impl() const
+TextAndReading SwTOXPara::GetText_Impl(SwRootFrame const*const pLayout) const
{
const SwContentNode* pNd = aTOXSources[0].pNd;
switch( eType )
{
case SwTOXElement::Sequence:
+ if (nStartIndex != 0 || nEndIndex != -1)
+ {
+ // sw_redlinehide: "captions" are a rather fuzzily defined concept anyway
+ return TextAndReading(static_cast<const SwTextNode*>(pNd)->GetExpandText(
+ pLayout,
+ nStartIndex,
+ nEndIndex == -1 ? -1 : nEndIndex - nStartIndex,
+ false, false, false,
+ pLayout && pLayout->IsHideRedlines()
+ ? ExpandMode::HideDeletions
+ : ExpandMode(0)),
+ OUString());
+ }
+ BOOST_FALLTHROUGH;
case SwTOXElement::Template:
case SwTOXElement::OutlineLevel:
{
- return TextAndReading(static_cast<const SwTextNode*>(pNd)->GetExpandText(
- nullptr,
- nStartIndex,
- nEndIndex == -1 ? -1 : nEndIndex - nStartIndex,
- false, false, false),
+ assert(nStartIndex == 0);
+ assert(nEndIndex == -1);
+ return TextAndReading(sw::GetExpandTextMerged(
+ pLayout, *static_cast<const SwTextNode*>(pNd),
+ false, false, ExpandMode(0)),
OUString());
}
break;
@@ -536,14 +572,51 @@ TextAndReading SwTOXPara::GetText_Impl() const
return TextAndReading();
}
-void SwTOXPara::FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16 ) const
+void SwTOXPara::FillText( SwTextNode& rNd, const SwIndex& rInsPos, sal_uInt16,
+ SwRootFrame const*const pLayout) const
{
+ assert(!"sw_redlinehide: this is dead code, Bibliography only has SwTOXAuthority");
if( SwTOXElement::Template == eType || SwTOXElement::Sequence == eType || SwTOXElement::OutlineLevel == eType)
{
const SwTextNode* pSrc = static_cast<const SwTextNode*>(aTOXSources[0].pNd);
- pSrc->CopyExpandText( rNd, &rInsPos, nStartIndex,
- nEndIndex == -1 ? -1 : nEndIndex - nStartIndex,
- nullptr, false, false, true );
+ if (SwTOXElement::Sequence == eType
+ && (nStartIndex != 0 || nEndIndex != -1))
+ {
+ pSrc->CopyExpandText( rNd, &rInsPos, nStartIndex,
+ nEndIndex == -1 ? -1 : nEndIndex - nStartIndex,
+ pLayout, false, false, true );
+ }
+ else
+ {
+ assert(nStartIndex == 0);
+ assert(nEndIndex == -1);
+ // sw_redlinehide: this probably won't HideDeletions
+ pSrc->CopyExpandText( rNd, &rInsPos, 0, -1,
+ pLayout, false, false, true );
+ if (pLayout && pLayout->IsHideRedlines())
+ {
+ if (SwTextFrame const*const pFrame = static_cast<SwTextFrame*>(pSrc->getLayoutFrame(pLayout)))
+ {
+ if (sw::MergedPara const*const pMerged = pFrame->GetMergedPara())
+ {
+ // pSrc already copied above
+ assert(pSrc == pMerged->pParaPropsNode);
+ for (sal_uLong i = pSrc->GetIndex() + 1;
+ i <= pMerged->pLastNode->GetIndex(); ++i)
+ {
+ SwNode *const pTmp(pSrc->GetNodes()[i]);
+ if (pTmp->GetRedlineMergeFlag() == SwNode::Merge::NonFirst)
+ {
+
+ pTmp->GetTextNode()->CopyExpandText(
+ rNd, &rInsPos, 0, -1,
+ pLayout, false, false, false );
+ }
+ }
+ }
+ }
+ }
+ }
}
else
{
@@ -617,6 +690,19 @@ OUString SwTOXPara::GetURL() const
return aText;
}
+bool SwTOXPara::IsFullPara() const
+{
+ switch (eType)
+ {
+ case SwTOXElement::Sequence:
+ case SwTOXElement::Template:
+ case SwTOXElement::OutlineLevel:
+ return nStartIndex == 0 && nEndIndex == -1;
+ default:
+ return false;
+ }
+}
+
// Table
SwTOXTable::SwTOXTable( const SwContentNode& rNd )
: SwTOXSortTabBase( TOX_SORT_TABLE, &rNd, nullptr, nullptr ),
@@ -624,7 +710,7 @@ SwTOXTable::SwTOXTable( const SwContentNode& rNd )
{
}
-TextAndReading SwTOXTable::GetText_Impl() const
+TextAndReading SwTOXTable::GetText_Impl(SwRootFrame const*const) const
{
const SwNode* pNd = aTOXSources[0].pNd;
if( pNd )
@@ -688,24 +774,25 @@ sal_uInt16 SwTOXAuthority::GetLevel() const
return nRet;
}
-static OUString lcl_GetText(SwFormatField const& rField)
+static OUString lcl_GetText(SwFormatField const& rField, SwRootFrame const*const pLayout)
{
- return rField.GetField()->ExpandField(true, nullptr);
+ return rField.GetField()->ExpandField(true, pLayout);
}
-TextAndReading SwTOXAuthority::GetText_Impl() const
+TextAndReading SwTOXAuthority::GetText_Impl(SwRootFrame const*const pLayout) const
{
- return TextAndReading(lcl_GetText(m_rField), OUString());
+ return TextAndReading(lcl_GetText(m_rField, pLayout), OUString());
}
void SwTOXAuthority::FillText( SwTextNode& rNd,
- const SwIndex& rInsPos, sal_uInt16 nAuthField ) const
+ const SwIndex& rInsPos, sal_uInt16 nAuthField,
+ SwRootFrame const*const pLayout) const
{
SwAuthorityField* pField = static_cast<SwAuthorityField*>(m_rField.GetField());
OUString sText;
if(AUTH_FIELD_IDENTIFIER == nAuthField)
{
- sText = lcl_GetText(m_rField);
+ sText = lcl_GetText(m_rField, pLayout);
const SwAuthorityFieldType* pType = static_cast<const SwAuthorityFieldType*>(pField->GetTyp());
sal_Unicode cChar = pType->GetPrefix();
if(cChar && cChar != ' ')
diff --git a/sw/source/core/unocore/unoidx.cxx b/sw/source/core/unocore/unoidx.cxx
index ab2bae1d8aeb..59b51520dd1a 100644
--- a/sw/source/core/unocore/unoidx.cxx
+++ b/sw/source/core/unocore/unoidx.cxx
@@ -1271,7 +1271,7 @@ void SAL_CALL SwXDocumentIndex::refresh()
"SwXDocumentIndex::refresh: must be in attached state",
static_cast< ::cppu::OWeakObject*>(this));
}
- pTOXBase->Update();
+ pTOXBase->Update(nullptr, m_pImpl->m_pDoc->getIDocumentLayoutAccess().GetCurrentLayout());
// the insertion of TOC will affect the document layout
lcl_CalcLayout(m_pImpl->m_pDoc);
@@ -1353,7 +1353,8 @@ SwXDocumentIndex::attach(const uno::Reference< text::XTextRange > & xTextRange)
}
//TODO: apply Section attributes (columns and background)
SwTOXBaseSection *const pTOX =
- pDoc->InsertTableOf( *aPam.GetPoint(), rTOXBase );
+ pDoc->InsertTableOf( *aPam.GetPoint(), rTOXBase, nullptr, false,
+ m_pImpl->m_pDoc->getIDocumentLayoutAccess().GetCurrentLayout());
pDoc->SetTOXBaseName(*pTOX, m_pImpl->m_pProps->GetTOXBase().GetTOXName());