sw_redlinehide_3: add second result to SwGetRefField
... and init it in SwGetRefField::UpdateField().
Change-Id: I69af00678e84214d4a122d8b2d940fcdda5f4ccf
diff --git a/sw/inc/reffld.hxx b/sw/inc/reffld.hxx
index a376445..7e02260 100644
--- a/sw/inc/reffld.hxx
+++ b/sw/inc/reffld.hxx
@@ -83,18 +83,15 @@ class SW_DLLPUBLIC SwGetRefField : public SwField
private:
OUString m_sSetRefName;
OUString m_sSetReferenceLanguage;
OUString m_sText;
OUString m_sText; ///< result
OUString m_sTextRLHidden; ///< result for layout with redlines hidden
sal_uInt16 m_nSubType;
/// reference to either a SwTextFootnote::m_nSeqNo or a SwSetExpField::mnSeqNo
sal_uInt16 m_nSeqNo;
virtual OUString Expand() const override;
virtual std::unique_ptr<SwField> Copy() const override;
// #i81002#
static OUString MakeRefNumStr( const SwTextNode& rTextNodeOfField,
const SwTextNode& rTextNodeOfReferencedItem,
const sal_uInt32 nRefNumFormat );
public:
SwGetRefField( SwGetRefFieldType*, const OUString& rSetRef, const OUString& rReferenceLanguage,
sal_uInt16 nSubType, sal_uInt16 nSeqNo, sal_uLong nFormat );
@@ -114,7 +111,7 @@ public:
no update for these reference format types. */
void UpdateField( const SwTextField* pFieldTextAttr );
void SetExpand( const OUString& rStr ) { m_sText = rStr; }
void SetExpand( const OUString& rStr );
/// Get/set sub type.
virtual sal_uInt16 GetSubType() const override;
diff --git a/sw/source/core/fields/reffld.cxx b/sw/source/core/fields/reffld.cxx
index d73494e..fca30c7 100644
--- a/sw/source/core/fields/reffld.cxx
+++ b/sw/source/core/fields/reffld.cxx
@@ -29,6 +29,8 @@
#include <pam.hxx>
#include <cntfrm.hxx>
#include <pagefrm.hxx>
#include <rootfrm.hxx>
#include <modeltoviewhelper.hxx>
#include <docary.hxx>
#include <fmtfld.hxx>
#include <txtfld.hxx>
@@ -69,6 +71,11 @@ using namespace ::com::sun::star;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::lang;
static std::pair<OUString, bool> MakeRefNumStr(SwRootFrame const* pLayout,
const SwTextNode& rTextNodeOfField,
const SwTextNode& rTextNodeOfReferencedItem,
sal_uInt32 nRefNumFormat);
static void lcl_GetLayTree( const SwFrame* pFrame, std::vector<const SwFrame*>& rArr )
{
while( pFrame )
@@ -402,6 +409,12 @@ OUString SwGetRefField::GetExpandedTextOfReferencedTextNode() const
: OUString();
}
void SwGetRefField::SetExpand( const OUString& rStr )
{
m_sText = rStr;
m_sTextRLHidden = rStr;
}
OUString SwGetRefField::Expand() const
{
return m_sText;
@@ -417,10 +430,40 @@ OUString SwGetRefField::GetFieldName() const
return Expand();
}
static void FilterText(OUString & rText, LanguageType const eLang,
OUString const& rSetReferenceLanguage)
{
// remove all special characters (replace them with blanks)
if (!rText.isEmpty())
{
rText = rText.replaceAll(OUStringLiteral1(0xad), "");
OUStringBuffer aBuf(rText);
const sal_Int32 l = aBuf.getLength();
for (sal_Int32 i = 0; i < l; ++i)
{
if (aBuf[i] < ' ')
{
aBuf[i] = ' ';
}
else if (aBuf[i] == 0x2011)
{
aBuf[i] = '-';
}
}
rText = aBuf.makeStringAndClear();
if (!rSetReferenceLanguage.isEmpty())
{
lcl_formatReferenceLanguage(rText, false, eLang, rSetReferenceLanguage);
}
}
}
// #i81002# - parameter <pFieldTextAttr> added
void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
{
m_sText.clear();
m_sTextRLHidden.clear();
SwDoc* pDoc = static_cast<SwGetRefFieldType*>(GetTyp())->GetDoc();
// finding the reference target (the number)
@@ -433,8 +476,24 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
if ( !pTextNd )
{
m_sText = SwViewShell::GetShellRes()->aGetRefField_RefItemNotFound;
m_sTextRLHidden = m_sText;
return ;
}
SwRootFrame const* pLayout(nullptr);
SwRootFrame const* pLayoutRLHidden(nullptr);
for (SwRootFrame const*const pLay : pDoc->GetAllLayouts())
{
if (pLay->IsHideRedlines())
{
pLayoutRLHidden = pLay;
}
else
{
pLayout = pLay;
}
}
// where is the category name (e.g. "Illustration")?
const OUString aText = pTextNd->GetText();
const sal_Int32 nCatStart = aText.indexOf(m_sSetRefName);
@@ -497,8 +556,10 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
nEnd = std::min(nStart + 1, nLen);
break;
// "Reference" (whole Text)
default:
assert(false); // fall through to appease MSVC C4701
// "Reference" (whole Text)
case REF_CONTENT:
nStart = 0;
nEnd = nLen;
break;
@@ -524,15 +585,21 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
SwTextFootnote* const pFootnoteIdx = pDoc->GetFootnoteIdxs()[i];
if( m_nSeqNo == pFootnoteIdx->GetSeqRefNo() )
{
m_sText = pFootnoteIdx->GetFootnote().GetViewNumStr(*pDoc, nullptr/*TODO?*/);
m_sText = pFootnoteIdx->GetFootnote().GetViewNumStr(*pDoc, nullptr);
m_sTextRLHidden = pFootnoteIdx->GetFootnote().GetViewNumStr(*pDoc, pLayoutRLHidden);
if (!m_sSetReferenceLanguage.isEmpty())
{
lcl_formatReferenceLanguage(m_sText, false, GetLanguage(), m_sSetReferenceLanguage);
lcl_formatReferenceLanguage(m_sTextRLHidden, false, GetLanguage(), m_sSetReferenceLanguage);
}
break;
}
}
return;
default:
assert(false); // fall through to appease MSVC C4701
case REF_SETREFATTR:
nStart = nNumStart;
nEnd = nNumEnd;
break;
@@ -541,28 +608,19 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
if( nStart != nEnd ) // a section?
{
m_sText = pTextNd->GetExpandText(nStart, nEnd - nStart, false, false, false);
// remove all special characters (replace them with blanks)
if( !m_sText.isEmpty() )
if (m_nSubType == REF_OUTLINE
|| (m_nSubType == REF_SEQUENCEFLD && REF_CONTENT == GetFormat()))
{
m_sText = m_sText.replaceAll(OUStringLiteral1(0xad), "");
OUStringBuffer aBuf(m_sText);
const sal_Int32 l = aBuf.getLength();
for (sal_Int32 i=0; i<l; ++i)
{
if (aBuf[i]<' ')
{
aBuf[i]=' ';
}
else if (aBuf[i]==0x2011)
{
aBuf[i]='-';
}
}
m_sText = aBuf.makeStringAndClear();
if (!m_sSetReferenceLanguage.isEmpty())
lcl_formatReferenceLanguage(m_sText, false, GetLanguage(), m_sSetReferenceLanguage);
m_sTextRLHidden = sw::GetExpandTextMerged(
pLayoutRLHidden, *pTextNd, false, false, ExpandMode(0));
}
else
{
m_sTextRLHidden = pTextNd->GetExpandText(
nStart, nEnd - nStart, false, false, false, ExpandMode::HideDeletions);
}
FilterText(m_sText, GetLanguage(), m_sSetReferenceLanguage);
FilterText(m_sTextRLHidden, GetLanguage(), m_sSetReferenceLanguage);
}
}
break;
@@ -570,8 +628,11 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
case REF_PAGE:
case REF_PAGE_PGDESC:
{
const SwTextFrame* pFrame = static_cast<SwTextFrame*>(pTextNd->getLayoutFrame( pDoc->getIDocumentLayoutAccess().GetCurrentLayout(), nullptr, nullptr)),
*pSave = pFrame;
auto const func =
[this, pTextNd, nNumStart](OUString & rText, SwRootFrame const*const pLay)
{
SwTextFrame const* pFrame = static_cast<SwTextFrame*>(pTextNd->getLayoutFrame(pLay, nullptr, nullptr));
SwTextFrame const*const pSave = pFrame;
if (pFrame)
{
TextFrameIndex const nNumStartIndex(pFrame->MapModelToView(pTextNd, nNumStart));
@@ -586,31 +647,46 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
if( REF_PAGE_PGDESC == GetFormat() &&
nullptr != ( pPage = pFrame->FindPageFrame() ) &&
pPage->GetPageDesc() )
m_sText = pPage->GetPageDesc()->GetNumType().GetNumStr( nPageNo );
{
rText = pPage->GetPageDesc()->GetNumType().GetNumStr(nPageNo);
}
else
m_sText = OUString::number(nPageNo);
{
rText = OUString::number(nPageNo);
}
if (!m_sSetReferenceLanguage.isEmpty())
lcl_formatReferenceLanguage(m_sText, false, GetLanguage(), m_sSetReferenceLanguage);
lcl_formatReferenceLanguage(rText, false, GetLanguage(), m_sSetReferenceLanguage);
}
};
// sw_redlinehide: currently only one of these layouts will exist,
// so the getLayoutFrame will use the same frame in both cases
func(m_sText, pLayout);
func(m_sTextRLHidden, pLayoutRLHidden);
}
break;
case REF_CHAPTER:
{
auto const func =
[this, pTextNd](OUString & rText, SwRootFrame const*const pLay)
{
// a bit tricky: search any frame
const SwFrame* pFrame = pTextNd->getLayoutFrame( pDoc->getIDocumentLayoutAccess().GetCurrentLayout() );
SwFrame const*const pFrame = pTextNd->getLayoutFrame(pLay);
if( pFrame )
{
SwChapterFieldType aFieldTyp;
SwChapterField aField( &aFieldTyp, 0 );
aField.SetLevel( MAXLEVEL - 1 );
aField.ChangeExpansion( *pFrame, pTextNd, true );
m_sText = aField.GetNumber();
rText = aField.GetNumber(pLay);
if (!m_sSetReferenceLanguage.isEmpty())
lcl_formatReferenceLanguage(m_sText, false, GetLanguage(), m_sSetReferenceLanguage);
lcl_formatReferenceLanguage(rText, false, GetLanguage(), m_sSetReferenceLanguage);
}
};
func(m_sText, pLayout);
func(m_sTextRLHidden, pLayoutRLHidden);
}
break;
@@ -630,6 +706,7 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
m_sText = nNumStart < pFieldTextAttr->GetStart()
? aLocaleData.getAboveWord()
: aLocaleData.getBelowWord();
m_sTextRLHidden = m_sText;
break;
}
@@ -640,6 +717,8 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
if (!m_sSetReferenceLanguage.isEmpty())
lcl_formatReferenceLanguage(m_sText, false, GetLanguage(), m_sSetReferenceLanguage);
m_sTextRLHidden = m_sText;
}
break;
// #i81002#
@@ -647,19 +726,26 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
case REF_NUMBER_NO_CONTEXT:
case REF_NUMBER_FULL_CONTEXT:
{
// for differentiation of Roman numbers and letters in Hungarian article handling
bool bClosingParenthesis = false;
if ( pFieldTextAttr && pFieldTextAttr->GetpTextNode() )
{
m_sText = MakeRefNumStr( pFieldTextAttr->GetTextNode(), *pTextNd, GetFormat() );
if ( !m_sText.isEmpty() && !m_sSetReferenceLanguage.isEmpty() )
bClosingParenthesis = pTextNd->GetNumRule()->MakeNumString( *(pTextNd->GetNum()), true).endsWith(")");
auto result =
MakeRefNumStr(pLayout, pFieldTextAttr->GetTextNode(), *pTextNd, GetFormat());
m_sText = result.first;
// for differentiation of Roman numbers and letters in Hungarian article handling
bool bClosingParenthesis = result.second;
if (!m_sSetReferenceLanguage.isEmpty())
{
lcl_formatReferenceLanguage(m_sText, bClosingParenthesis, GetLanguage(), m_sSetReferenceLanguage);
}
result =
MakeRefNumStr(pLayoutRLHidden, pFieldTextAttr->GetTextNode(), *pTextNd, GetFormat());
m_sTextRLHidden = result.first;
bClosingParenthesis = result.second;
if (!m_sSetReferenceLanguage.isEmpty())
{
lcl_formatReferenceLanguage(m_sTextRLHidden, bClosingParenthesis, GetLanguage(), m_sSetReferenceLanguage);
}
}
if (!m_sSetReferenceLanguage.isEmpty())
lcl_formatReferenceLanguage(m_sText, bClosingParenthesis, GetLanguage(), m_sSetReferenceLanguage);
}
break;
@@ -669,14 +755,22 @@ void SwGetRefField::UpdateField( const SwTextField* pFieldTextAttr )
}
// #i81002#
OUString SwGetRefField::MakeRefNumStr( const SwTextNode& rTextNodeOfField,
const SwTextNode& rTextNodeOfReferencedItem,
const sal_uInt32 nRefNumFormat )
static std::pair<OUString, bool> MakeRefNumStr(
SwRootFrame const*const pLayout,
const SwTextNode& i_rTextNodeOfField,
const SwTextNode& i_rTextNodeOfReferencedItem,
const sal_uInt32 nRefNumFormat)
{
SwTextNode const& rTextNodeOfField(pLayout
? *sw::GetParaPropsNode(*pLayout, i_rTextNodeOfField)
: i_rTextNodeOfField);
SwTextNode const& rTextNodeOfReferencedItem(pLayout
? *sw::GetParaPropsNode(*pLayout, i_rTextNodeOfReferencedItem)
: i_rTextNodeOfReferencedItem);
if ( rTextNodeOfReferencedItem.HasNumber() &&
rTextNodeOfReferencedItem.IsCountedInList() )
{
OSL_ENSURE( rTextNodeOfReferencedItem.GetNum(),
OSL_ENSURE( rTextNodeOfReferencedItem.GetNum(pLayout),
"<SwGetRefField::MakeRefNumStr(..)> - referenced paragraph has number, but no <SwNodeNum> instance!" );
// Determine, up to which level the superior list labels have to be
@@ -700,17 +794,19 @@ OUString SwGetRefField::MakeRefNumStr( const SwTextNode& rTextNodeOfField,
if ( rTextNodeOfField.HasNumber() &&
rTextNodeOfField.GetNumRule() == rTextNodeOfReferencedItem.GetNumRule() )
{
pNodeNumForTextNodeOfField = rTextNodeOfField.GetNum();
pNodeNumForTextNodeOfField = rTextNodeOfField.GetNum(pLayout);
}
else
{
pNodeNumForTextNodeOfField =
rTextNodeOfReferencedItem.GetNum()->GetPrecedingNodeNumOf( rTextNodeOfField );
rTextNodeOfReferencedItem.GetNum(pLayout)->GetPrecedingNodeNumOf(rTextNodeOfField);
}
if ( pNodeNumForTextNodeOfField )
{
const SwNumberTree::tNumberVector rFieldNumVec = pNodeNumForTextNodeOfField->GetNumberVector();
const SwNumberTree::tNumberVector rRefItemNumVec = rTextNodeOfReferencedItem.GetNum()->GetNumberVector();
const SwNumberTree::tNumberVector rFieldNumVec =
pNodeNumForTextNodeOfField->GetNumberVector();
const SwNumberTree::tNumberVector rRefItemNumVec =
rTextNodeOfReferencedItem.GetNum()->GetNumberVector();
std::size_t nLevel( 0 );
while ( nLevel < rFieldNumVec.size() && nLevel < rRefItemNumVec.size() )
{
@@ -734,13 +830,17 @@ OUString SwGetRefField::MakeRefNumStr( const SwTextNode& rTextNodeOfField,
OSL_ENSURE( rTextNodeOfReferencedItem.GetNumRule(),
"<SwGetRefField::MakeRefNumStr(..)> - referenced numbered paragraph has no numbering rule set!" );
return rTextNodeOfReferencedItem.GetNumRule()->MakeRefNumString(
*(rTextNodeOfReferencedItem.GetNum()),
bInclSuperiorNumLabels,
nRestrictInclToThisLevel );
return std::make_pair(
rTextNodeOfReferencedItem.GetNumRule()->MakeRefNumString(
*(rTextNodeOfReferencedItem.GetNum(pLayout)),
bInclSuperiorNumLabels,
nRestrictInclToThisLevel ),
rTextNodeOfReferencedItem.GetNumRule()->MakeNumString(
*(rTextNodeOfReferencedItem.GetNum(pLayout)),
true).endsWith(")") );
}
return OUString();
return std::make_pair(OUString(), false);
}
std::unique_ptr<SwField> SwGetRefField::Copy() const
@@ -749,6 +849,7 @@ std::unique_ptr<SwField> SwGetRefField::Copy() const
m_sSetRefName, m_sSetReferenceLanguage, m_nSubType,
m_nSeqNo, GetFormat() ) );
pField->m_sText = m_sText;
pField->m_sTextRLHidden = m_sTextRLHidden;
return std::unique_ptr<SwField>(pField.release());
}