summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/inc/SwNumberTree.hxx14
-rw-r--r--sw/inc/doc.hxx2
-rw-r--r--sw/inc/list.hxx2
-rw-r--r--sw/source/core/doc/list.cxx19
-rw-r--r--sw/source/core/doc/poolfmt.cxx9
-rw-r--r--sw/source/filter/writer/writer.cxx10
-rw-r--r--sw/source/filter/ww8/rtfexport.cxx2
-rw-r--r--sw/source/filter/ww8/wrtw8num.cxx4
-rw-r--r--sw/source/uibase/app/docstyle.cxx6
9 files changed, 52 insertions, 16 deletions
diff --git a/sw/inc/SwNumberTree.hxx b/sw/inc/SwNumberTree.hxx
index ad3ffe845110..e3d93a27766f 100644
--- a/sw/inc/SwNumberTree.hxx
+++ b/sw/inc/SwNumberTree.hxx
@@ -334,6 +334,13 @@ public:
void IsSane(bool bRecursive) const;
#endif // DBG_UTIL
+ /**
+ Returns how many children this node has got.
+
+ @return number of children
+ */
+ tSwNumberTreeChildren::size_type GetChildCount() const;
+
protected:
/** the children */
tSwNumberTreeChildren mChildren;
@@ -355,13 +362,6 @@ protected:
*/
virtual bool IsNotificationEnabled() const = 0;
- /**
- Returns how many children this node has got.
-
- @return number of children
- */
- tSwNumberTreeChildren::size_type GetChildCount() const;
-
// #i64010# - made pure virtual
virtual bool HasCountedChildren() const = 0;
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index b80e1157a7c9..83651fc8fcb2 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -851,7 +851,7 @@ public:
bool IsUsed( const SwModify& ) const;
/// Query if table style is used.
bool IsUsed( const SwTableAutoFormat& ) const;
- static bool IsUsed( const SwNumRule& );
+ bool IsUsed( const SwNumRule& );
// Set name of newly loaded document template.
size_t SetDocPattern(const OUString& rPatternName);
diff --git a/sw/inc/list.hxx b/sw/inc/list.hxx
index d8b3e16943ea..64d62faa9c93 100644
--- a/sw/inc/list.hxx
+++ b/sw/inc/list.hxx
@@ -58,6 +58,8 @@ class SwList
bool IsListLevelMarked( const int nListLevel ) const;
+ bool HasNodes() const;
+
private:
SwList( const SwList& ) = delete;
SwList& operator=( const SwList& ) = delete;
diff --git a/sw/source/core/doc/list.cxx b/sw/source/core/doc/list.cxx
index c81eef636ff1..3651e706f4b7 100644
--- a/sw/source/core/doc/list.cxx
+++ b/sw/source/core/doc/list.cxx
@@ -39,6 +39,8 @@ class SwListImpl
const OUString& GetDefaultListStyleName() const { return msDefaultListStyleName;}
+ bool HasNodes() const;
+
void InsertListItem( SwNodeNum& rNodeNum, bool isHiddenRedlines,
const int nLevel );
static void RemoveListItem( SwNodeNum& rNodeNum );
@@ -122,6 +124,18 @@ SwListImpl::~SwListImpl() COVERITY_NOEXCEPT_FALSE
}
}
+bool SwListImpl::HasNodes() const
+{
+ for (auto const& rNumberTree : maListTrees)
+ {
+ if (rNumberTree.pRoot->GetChildCount() != 0)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
void SwListImpl::InsertListItem( SwNodeNum& rNodeNum, bool const isHiddenRedlines,
const int nLevel )
{
@@ -225,6 +239,11 @@ SwList::~SwList()
{
}
+bool SwList::HasNodes() const
+{
+ return mpListImpl->HasNodes();
+}
+
const OUString & SwList::GetListId() const
{
return mpListImpl->GetListId();
diff --git a/sw/source/core/doc/poolfmt.cxx b/sw/source/core/doc/poolfmt.cxx
index be521cfdccd7..b32dcab95c1c 100644
--- a/sw/source/core/doc/poolfmt.cxx
+++ b/sw/source/core/doc/poolfmt.cxx
@@ -25,6 +25,8 @@
#include <doc.hxx>
#include <IDocumentState.hxx>
#include <IDocumentStylePoolAccess.hxx>
+#include <IDocumentListsAccess.hxx>
+#include <list.hxx>
#include <poolfmt.hxx>
#include <pagedesc.hxx>
#include <fmtcol.hxx>
@@ -106,9 +108,14 @@ bool SwDoc::IsUsed( const SwTableAutoFormat& rTableAutoFormat) const
// See if the NumRule is used
bool SwDoc::IsUsed( const SwNumRule& rRule )
{
+ SwList const*const pList(getIDocumentListsAccess().getListByName(rRule.GetDefaultListId()));
bool bUsed = rRule.GetTextNodeListSize() > 0 ||
rRule.GetParagraphStyleListSize() > 0 ||
- rRule.IsUsedByRedline();
+ rRule.IsUsedByRedline()
+ // tdf#135014 default num rule is used if any associated num rule is used
+ || (pList
+ && pList->GetDefaultListStyleName() == rRule.GetName()
+ && pList->HasNodes());
return bUsed;
}
diff --git a/sw/source/filter/writer/writer.cxx b/sw/source/filter/writer/writer.cxx
index fa56eb08f519..cd59f2f445e5 100644
--- a/sw/source/filter/writer/writer.cxx
+++ b/sw/source/filter/writer/writer.cxx
@@ -359,15 +359,18 @@ void Writer::PutNumFormatFontsInAttrPool()
// it can be removed - it is already in the Pool
SfxItemPool& rPool = m_pDoc->GetAttrPool();
const SwNumRuleTable& rListTable = m_pDoc->GetNumRuleTable();
- const SwNumRule* pRule;
const SwNumFormat* pFormat;
const vcl::Font* pFont;
const vcl::Font* pDefFont = &numfunc::GetDefBulletFont();
bool bCheck = false;
for( size_t nGet = rListTable.size(); nGet; )
- if( SwDoc::IsUsed( *(pRule = rListTable[ --nGet ] )))
+ {
+ SwNumRule const*const pRule = rListTable[ --nGet ];
+ if (m_pDoc->IsUsed(*pRule))
+ {
for( sal_uInt8 nLvl = 0; nLvl < MAXLEVEL; ++nLvl )
+ {
if( SVX_NUM_CHAR_SPECIAL == (pFormat = &pRule->Get( nLvl ))->GetNumberingType() ||
SVX_NUM_BITMAP == pFormat->GetNumberingType() )
{
@@ -386,6 +389,9 @@ void Writer::PutNumFormatFontsInAttrPool()
pFont->GetFamilyName(), pFont->GetStyleName(),
pFont->GetPitch(), pFont->GetCharSet(), RES_CHRATR_FONT ));
}
+ }
+ }
+ }
}
void Writer::PutEditEngFontsInAttrPool()
diff --git a/sw/source/filter/ww8/rtfexport.cxx b/sw/source/filter/ww8/rtfexport.cxx
index 366cc18b3b0c..3072798aed37 100644
--- a/sw/source/filter/ww8/rtfexport.cxx
+++ b/sw/source/filter/ww8/rtfexport.cxx
@@ -214,7 +214,7 @@ void RtfExport::BuildNumbering()
for (auto n = rListTable.size(); n;)
{
SwNumRule* pRule = rListTable[--n];
- if (!SwDoc::IsUsed(*pRule))
+ if (!m_pDoc->IsUsed(*pRule))
continue;
if (IsExportNumRule(*pRule))
diff --git a/sw/source/filter/ww8/wrtw8num.cxx b/sw/source/filter/ww8/wrtw8num.cxx
index 088f5d445996..d0514482e5e1 100644
--- a/sw/source/filter/ww8/wrtw8num.cxx
+++ b/sw/source/filter/ww8/wrtw8num.cxx
@@ -96,6 +96,8 @@ sal_uInt16 MSWordExportBase::OverrideNumRule(
const sal_uInt16 absnumdef = rListId == rAbstractRule.GetDefaultListId()
? GetNumberingId(rAbstractRule)
: DuplicateAbsNum(rListId, rAbstractRule);
+ assert(numdef != USHRT_MAX);
+ assert(absnumdef != USHRT_MAX);
auto const mapping = std::make_pair(numdef, absnumdef);
auto it = m_OverridingNums.insert(std::make_pair(m_pUsedNumTable->size(), mapping));
@@ -125,7 +127,7 @@ sal_uInt16 MSWordExportBase::GetNumberingId( const SwNumRule& rNumRule )
for ( sal_uInt16 n = m_pUsedNumTable->size(); n; )
{
const SwNumRule& rRule = *(*m_pUsedNumTable)[ --n ];
- if ( !SwDoc::IsUsed( rRule ) )
+ if (!m_pDoc->IsUsed(rRule))
{
m_pUsedNumTable->erase( m_pUsedNumTable->begin() + n );
}
diff --git a/sw/source/uibase/app/docstyle.cxx b/sw/source/uibase/app/docstyle.cxx
index 4326445cd8ec..d1a08912ae56 100644
--- a/sw/source/uibase/app/docstyle.cxx
+++ b/sw/source/uibase/app/docstyle.cxx
@@ -2247,7 +2247,7 @@ bool SwDocStyleSheet::IsUsed() const
case SfxStyleFamily::Page : pMod = pDesc; break;
case SfxStyleFamily::Pseudo:
- return pNumRule && SwDoc::IsUsed( *pNumRule );
+ return pNumRule && rDoc.IsUsed(*pNumRule);
case SfxStyleFamily::Table:
return pTableFormat && rDoc.IsUsed( *pTableFormat );
@@ -3014,7 +3014,7 @@ SfxStyleSheetBase* SwStyleSheetIterator::First()
if ( nSrchMask == SfxStyleSearchBits::Hidden && !rRule.IsHidden( ) )
continue;
- bool bUsed = bIsSearchUsed && ( bOrganizer || SwDoc::IsUsed(rRule) );
+ bool bUsed = bIsSearchUsed && (bOrganizer || rDoc.IsUsed(rRule));
if( !bUsed )
{
if( ( !bSearchHidden && rRule.IsHidden() ) ||
@@ -3176,7 +3176,7 @@ void SwStyleSheetIterator::AppendStyleList(const std::vector<OUString>& rList,
case SwGetPoolIdFromName::NumRule:
{
SwNumRule* pRule = rDoc.FindNumRulePtr( i );
- bUsed = pRule && SwDoc::IsUsed( *pRule );
+ bUsed = pRule && rDoc.IsUsed(*pRule);
bHidden = pRule && pRule->IsHidden( );
}
break;