[Libreoffice-commits] core.git: Branch 'private/mst/sw_redlinehide_4b' - 2 commits - sw/inc sw/qa sw/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Fri Dec 21 11:25:47 UTC 2018
sw/inc/ToxTextGenerator.hxx | 25 ++++-
sw/inc/doc.hxx | 8 +
sw/inc/tox.hxx | 3
sw/qa/core/test_ToxTextGenerator.cxx | 14 +-
sw/source/core/doc/doc.cxx | 5 -
sw/source/core/doc/doctxm.cxx | 157 ++++++++++++++++++++------------
sw/source/core/edit/edtox.cxx | 6 -
sw/source/core/fields/reffld.cxx | 21 ++--
sw/source/core/inc/doctxm.hxx | 22 +++-
sw/source/core/inc/txmsrt.hxx | 51 ++++++----
sw/source/core/inc/txtfrm.hxx | 3
sw/source/core/tox/ToxTextGenerator.cxx | 145 +++++++++++++++++++++--------
sw/source/core/tox/tox.cxx | 4
sw/source/core/tox/txmsrt.cxx | 126 +++++++++++++++++++------
sw/source/core/txtnode/ndtxt.cxx | 4
sw/source/core/unocore/unoidx.cxx | 5 -
sw/source/ui/index/multmrk.cxx | 3
sw/source/ui/index/swuiidxmrk.cxx | 9 +
sw/source/uibase/inc/toxmgr.hxx | 1
sw/source/uibase/index/toxmgr.cxx | 2
20 files changed, 423 insertions(+), 191 deletions(-)
New commits:
commit f7791a50eea40249930e66ac0572270c8050c156
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Fri Dec 21 11:56:30 2018 +0100
Commit: Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Fri Dec 21 12:24:17 2018 +0100
sw_redlinehide: ToX Update
Change-Id: Ibf5ec092632cf3a5f513965afdb840fd8239a7fd
diff --git a/sw/inc/ToxTextGenerator.hxx b/sw/inc/ToxTextGenerator.hxx
index 6540843f086b..91eac53d3c36 100644
--- a/sw/inc/ToxTextGenerator.hxx
+++ b/sw/inc/ToxTextGenerator.hxx
@@ -32,6 +32,7 @@ class SwFormatAutoFormat;
class SwChapterField;
class SwChapterFieldType;
class SwContentFrame;
+class SwRootFrame;
class SwContentNode;
class SwDoc;
class SwForm;
@@ -45,6 +46,7 @@ namespace sw {
class ToxLinkProcessor;
class ToxTabStopTokenHandler;
+class ToxWhitespaceStripper;
/** This class generates text for the entries of a table of x.
*
@@ -64,7 +66,8 @@ public:
*/
void
GenerateText(SwDoc *doc, const std::vector<std::unique_ptr<SwTOXSortTabBase>>& entries,
- sal_uInt16 indexOfEntryToProcess, sal_uInt16 numberOfEntriesToProcess);
+ sal_uInt16 indexOfEntryToProcess, sal_uInt16 numberOfEntriesToProcess,
+ SwRootFrame const* pLayout);
private:
const SwForm& mToxForm;
@@ -80,13 +83,23 @@ private:
std::vector<sal_Int32> startPositions;
std::vector<sal_Int32> endPositions;
};
+
+ static void GetAttributesForNode(
+ HandledTextToken & rResult,
+ sal_Int32 & rOffset,
+ SwTextNode const& rNode,
+ ToxWhitespaceStripper const& rStripper,
+ SwAttrPool & rPool,
+ SwRootFrame const*const pLayout);
+
/** Append text (and selected attributes) to a target node.
*
* Will take the text of @p source, and return the text and the attributes which should be added to the
* target text node. @see CollectAttributesForTox() for the criteria of the attributes which are taken.
*/
static HandledTextToken
- HandleTextToken(const SwTOXSortTabBase& source, SwAttrPool& attrPool);
+ HandleTextToken(const SwTOXSortTabBase& source, SwAttrPool& attrPool,
+ SwRootFrame const*const pLayout);
/** Applies the result of a handled text token to a target node. */
static void
@@ -124,18 +137,20 @@ private:
* for details.
*/
static OUString
- GetNumStringOfFirstNode(const SwTOXSortTabBase& rBase, bool bUsePrefix, sal_uInt8 nLevel);
+ GetNumStringOfFirstNode(const SwTOXSortTabBase& rBase, bool bUsePrefix,
+ sal_uInt8 nLevel, SwRootFrame const* pLayout);
/** Handle a chapter token.
*/
OUString
- HandleChapterToken(const SwTOXSortTabBase& rBase, const SwFormToken& aToken, SwDoc* pDoc) const;
+ HandleChapterToken(const SwTOXSortTabBase& rBase, const SwFormToken& aToken,
+ SwRootFrame const* pLayout) const;
/** Generate the text for a chapter token.
*/
OUString
GenerateTextForChapterToken(const SwFormToken& chapterToken, const SwContentFrame* contentFrame,
- const SwContentNode *contentNode) const;
+ const SwContentNode *contentNode, SwRootFrame const* pLayout) const;
/** Obtain a ChapterField to use for the text generation.
* @internal
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index a12024ffbd36..1017db388298 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -914,7 +914,8 @@ public:
SwTOXBaseSection* InsertTableOf( const SwPosition& rPos,
const SwTOXBase& rTOX,
const SfxItemSet* pSet = nullptr,
- bool bExpand = false );
+ bool bExpand = false,
+ SwRootFrame const* pLayout = nullptr);
void InsertTableOf( sal_uLong nSttNd, sal_uLong nEndNd,
const SwTOXBase& rTOX,
const SfxItemSet* pSet );
@@ -960,7 +961,8 @@ public:
void SetDefaultTOXBase(const SwTOXBase& rBase);
// Key for management of index.
- void GetTOIKeys( SwTOIKeyType eTyp, std::vector<OUString>& rArr ) const;
+ void GetTOIKeys(SwTOIKeyType eTyp, std::vector<OUString>& rArr,
+ SwRootFrame const& rLayout) const;
// Sort table text.
bool SortTable(const SwSelBoxes& rBoxes, const SwSortOptions&);
@@ -1536,7 +1538,7 @@ public:
bool bBroadcast = false);
// Change a TOX undoable.
- void ChgTOX(SwTOXBase & rTOX, const SwTOXBase & rNew);
+ void ChangeTOX(SwTOXBase & rTOX, const SwTOXBase & rNew, SwRootFrame const& rLayout);
/**
Returns a textual description of a PaM.
diff --git a/sw/inc/tox.hxx b/sw/inc/tox.hxx
index e5c938e4e34e..ae5a75df26d6 100644
--- a/sw/inc/tox.hxx
+++ b/sw/inc/tox.hxx
@@ -41,6 +41,7 @@ class SwTOXType;
class SwTOXMark;
class SwTextTOXMark;
class SwDoc;
+class SwRootFrame;
typedef std::vector<SwTOXMark*> SwTOXMarks;
@@ -98,7 +99,7 @@ public:
void InvalidateTOXMark();
- OUString GetText() const;
+ OUString GetText(SwRootFrame const* pLayout) const;
inline bool IsAlternativeText() const;
inline const OUString& GetAlternativeText() const;
diff --git a/sw/qa/core/test_ToxTextGenerator.cxx b/sw/qa/core/test_ToxTextGenerator.cxx
index 3ddc9fef6f80..25304a382ed3 100644
--- a/sw/qa/core/test_ToxTextGenerator.cxx
+++ b/sw/qa/core/test_ToxTextGenerator.cxx
@@ -50,7 +50,7 @@ struct MockedSortTab : public SwTOXSortTabBase {
MockedSortTab()
: SwTOXSortTabBase(TOX_SORT_INDEX,nullptr,nullptr,nullptr) {}
- virtual TextAndReading GetText_Impl() const override {
+ virtual TextAndReading GetText_Impl(SwRootFrame const*) const override {
return TextAndReading();
}
virtual sal_uInt16 GetLevel() const override {
@@ -89,7 +89,7 @@ ToxTextGeneratorTest::EmptyStringIsReturnedAsNumStringIfNoTextMarkIsSet()
sortTab.pTextMark = nullptr;
OUString const expected("");
- OUString actual = ToxTextGenerator::GetNumStringOfFirstNode(sortTab, false, 0);
+ OUString actual = ToxTextGenerator::GetNumStringOfFirstNode(sortTab, false, 0, nullptr);
CPPUNIT_ASSERT_EQUAL(expected, actual);
}
@@ -100,7 +100,7 @@ ToxTextGeneratorTest::EmptyStringIsReturnedAsNumStringIfToxSourcesIsEmpty()
sortTab.pTextMark = reinterpret_cast<SwTextTOXMark*>(1);
OUString const expected("");
- OUString actual = ToxTextGenerator::GetNumStringOfFirstNode(sortTab, false, 0);
+ OUString actual = ToxTextGenerator::GetNumStringOfFirstNode(sortTab, false, 0, nullptr);
CPPUNIT_ASSERT_EQUAL(expected, actual);
}
@@ -150,13 +150,13 @@ ToxTextGeneratorTest::ChapterNumberWithoutTextIsGeneratedForNoprepstTitle()
token.nChapterFormat = CF_NUM_NOPREPST_TITLE;
OUString expected("1");
- OUString actual = ttg.GenerateTextForChapterToken(token, nullptr, nullptr);
+ OUString actual = ttg.GenerateTextForChapterToken(token, nullptr, nullptr, nullptr);
CPPUNIT_ASSERT_EQUAL(expected, actual);
// we cannot mock the pre- and suffix generation in the chapterfield. We just test that sNumber and
// sTitle are used and hope that the pre- and suffix addition works.
token.nChapterFormat = CF_NUMBER;
- expected = ttg.GenerateTextForChapterToken(token, nullptr, nullptr);
+ expected = ttg.GenerateTextForChapterToken(token, nullptr, nullptr, nullptr);
CPPUNIT_ASSERT_EQUAL(expected, actual);
}
@@ -176,13 +176,13 @@ ToxTextGeneratorTest::ChapterNumberWithTitleIsGeneratedForNumberNoPrepst()
token.nChapterFormat = CF_NUMBER_NOPREPST;
OUString expected("5 myTitle");
- OUString actual = ttg.GenerateTextForChapterToken(token, nullptr, nullptr);
+ OUString actual = ttg.GenerateTextForChapterToken(token, nullptr, nullptr, nullptr);
CPPUNIT_ASSERT_EQUAL(expected, actual);
// we cannot mock the pre- and suffix generation in the chapterfield. We just test that sNumber and
// sTitle are used and hope that the pre- and suffix addition works.
token.nChapterFormat = CF_NUM_TITLE;
- expected = ttg.GenerateTextForChapterToken(token, nullptr, nullptr);
+ expected = ttg.GenerateTextForChapterToken(token, nullptr, nullptr, nullptr);
CPPUNIT_ASSERT_EQUAL(expected, actual);
}
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..64e227a0f06d 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>
+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..275365623975 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,38 @@ 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;
+ // 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 +191,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 +214,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 +228,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 +243,13 @@ 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;
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 +268,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 +277,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..e93f163981ac 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,8 +303,58 @@ 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);
@@ -301,29 +364,35 @@ ToxTextGenerator::HandleTextToken(const SwTOXSortTabBase& source, SwAttrPool& po
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..69088e796c27 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;
@@ -186,7 +190,7 @@ OUString SwTOXSortTabBase::GetURL() const
}
void SwTOXSortTabBase::FillText( SwTextNode& rNd, const SwIndex& rInsPos,
- sal_uInt16 ) const
+ sal_uInt16, SwRootFrame const*const) const
{
rNd.InsertText( GetText().sText, rInsPos );
}
@@ -328,7 +332,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 +354,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,7 +368,8 @@ 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
{
const sal_Int32* pEnd = pTextMark->End();
@@ -373,9 +378,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 +441,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 +455,35 @@ 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
{
const sal_Int32* pEnd = pTextMark->End();
if( pEnd && !pTextMark->GetTOXMark().IsAlternativeText() )
+ // FIXME does this actually hide redlines?
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 +510,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());
+ }
+ SAL_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 +565,50 @@ 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
{
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);
+ // FIXME as above? mode?
+ 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
{
@@ -624,7 +689,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 +753,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());
diff --git a/sw/source/ui/index/multmrk.cxx b/sw/source/ui/index/multmrk.cxx
index 735927a58ff5..7cc876e1f004 100644
--- a/sw/source/ui/index/multmrk.cxx
+++ b/sw/source/ui/index/multmrk.cxx
@@ -20,6 +20,7 @@
#include <swtypes.hxx>
#include <multmrk.hxx>
#include <toxmgr.hxx>
+#include <wrtsh.hxx>
SwMultiTOXMarkDlg::SwMultiTOXMarkDlg(weld::Window* pParent, SwTOXMgr& rTOXMgr)
: GenericDialogController(pParent, "modules/swriter/ui/selectindexdialog.ui", "SelectIndexDialog")
@@ -35,7 +36,7 @@ SwMultiTOXMarkDlg::SwMultiTOXMarkDlg(weld::Window* pParent, SwTOXMgr& rTOXMgr)
sal_uInt16 nSize = m_rMgr.GetTOXMarkCount();
for(sal_uInt16 i=0; i < nSize; ++i)
- m_xTOXLB->append_text(m_rMgr.GetTOXMark(i)->GetText());
+ m_xTOXLB->append_text(m_rMgr.GetTOXMark(i)->GetText(m_rMgr.GetShell()->GetLayout()));
m_xTOXLB->select(0);
m_xTextFT->set_label(m_rMgr.GetTOXMark(0)->GetTOXType()->GetTypeName());
diff --git a/sw/source/ui/index/swuiidxmrk.cxx b/sw/source/ui/index/swuiidxmrk.cxx
index db0a9f85e6d7..b30f5769710d 100644
--- a/sw/source/ui/index/swuiidxmrk.cxx
+++ b/sw/source/ui/index/swuiidxmrk.cxx
@@ -397,13 +397,14 @@ void SwIndexMarkPane::InsertUpdate()
InsertMark();
if ( m_pTOXMgr->GetCurTOXMark())
- aRewriter.AddRule(UndoArg1, m_pTOXMgr->GetCurTOXMark()->GetText());
+ aRewriter.AddRule(UndoArg1,
+ m_pTOXMgr->GetCurTOXMark()->GetText(m_pSh->GetLayout()));
}
else if( !m_pSh->HasReadonlySel() )
{
if ( m_pTOXMgr->GetCurTOXMark())
aRewriter.AddRule(UndoArg1,
- m_pTOXMgr->GetCurTOXMark()->GetText());
+ m_pTOXMgr->GetCurTOXMark()->GetText(m_pSh->GetLayout()));
if( m_bDel )
m_pTOXMgr->DeleteTOXMark();
@@ -761,7 +762,7 @@ void SwIndexMarkPane::UpdateDialog()
SwViewShell::SetCareDialog(m_xDialog);
- m_aOrgStr = pMark->GetText();
+ m_aOrgStr = pMark->GetText(m_pSh->GetLayout());
m_xEntryED->set_text(m_aOrgStr);
// set index type
@@ -779,7 +780,7 @@ void SwIndexMarkPane::UpdateDialog()
bKeyEnable = true;
bKey1HasText = bKey2Enable = !pMark->GetPrimaryKey().isEmpty();
bKey2HasText = !pMark->GetSecondaryKey().isEmpty();
- bEntryHasText = !pMark->GetText().isEmpty();
+ bEntryHasText = !pMark->GetText(m_pSh->GetLayout()).isEmpty();
m_xKey1DCB->set_entry_text( pMark->GetPrimaryKey() );
m_xKey2DCB->set_entry_text( pMark->GetSecondaryKey() );
m_xPhoneticED0->set_text( pMark->GetTextReading() );
diff --git a/sw/source/uibase/inc/toxmgr.hxx b/sw/source/uibase/inc/toxmgr.hxx
index 6f0ccc290721..12cad3c88fe8 100644
--- a/sw/source/uibase/inc/toxmgr.hxx
+++ b/sw/source/uibase/inc/toxmgr.hxx
@@ -256,6 +256,7 @@ public:
bool UpdateOrInsertTOX(const SwTOXDescription& rDesc, SwTOXBase** ppBase, const SfxItemSet* pSet);
const SwTOXType* GetTOXType(TOXTypes eTyp) const;
+ SwWrtShell * GetShell() { return pSh; }
};
// inlines
diff --git a/sw/source/uibase/index/toxmgr.cxx b/sw/source/uibase/index/toxmgr.cxx
index d1b78368a7c3..91309932115c 100644
--- a/sw/source/uibase/index/toxmgr.cxx
+++ b/sw/source/uibase/index/toxmgr.cxx
@@ -440,7 +440,7 @@ bool SwTOXMgr::UpdateOrInsertTOX(const SwTOXDescription& rDesc,
pDoc->GetIDocumentUndoRedo().StartUndo(SwUndoId::TOXCHANGE, nullptr);
}
- pDoc->ChgTOX(*pTOX, *pNewTOX);
+ pDoc->ChangeTOX(*pTOX, *pNewTOX, *pSh->GetLayout());
pTOX->DisableKeepExpression();
pSh->UpdateTableOf(*pTOX, pSet);
commit 0d8170edda471767ce3024dbfc6f93ac0fd87514
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Thu Dec 20 15:00:41 2018 +0100
Commit: Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Thu Dec 20 15:00:41 2018 +0100
sw_redlinehide: SwTextNode::GetExpandText() HideDeletions
Always enable this when the layout hides redlines (not sure why it
wasn't done like this before...).
Change-Id: Icddf8a23352565c0091a79eb64628054d0028928
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 2db52f511bbc..e12765a292f9 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -3399,6 +3399,10 @@ OUString SwTextNode::GetExpandText(SwRootFrame const*const pLayout,
{
ExpandMode eMode = ExpandMode::ExpandFields | eAdditionalMode;
+ if (pLayout && pLayout->IsHideRedlines())
+ {
+ eMode |= ExpandMode::HideDeletions;
+ }
ModelToViewHelper aConversionMap(*this, pLayout, eMode);
const OUString aExpandText = aConversionMap.getViewText();
More information about the Libreoffice-commits
mailing list