[Libreoffice-commits] core.git: sw/source
Caolán McNamara
caolanm at redhat.com
Sat Dec 16 15:54:53 UTC 2017
sw/source/filter/html/htmlcss1.cxx | 76 ++++++++---------
sw/source/filter/html/htmlctxt.cxx | 66 +++++++-------
sw/source/filter/html/htmldrawreader.cxx | 2
sw/source/filter/html/htmlgrin.cxx | 30 +++---
sw/source/filter/html/htmlsect.cxx | 2
sw/source/filter/html/htmltab.cxx | 44 +++++----
sw/source/filter/html/swhtml.cxx | 138 +++++++++++++++----------------
sw/source/filter/html/swhtml.hxx | 125 ++++++++++++++--------------
8 files changed, 246 insertions(+), 237 deletions(-)
New commits:
commit d9533e4c3f36c283681893c66b11343834ca45fa
Author: Caolán McNamara <caolanm at redhat.com>
Date: Thu Dec 14 13:10:26 2017 +0000
ofz: dangling pointers
make attribute table a shared_ptr and get HTMLAttrs that belong
to it to add a reference to it while they exist
Change-Id: I2d3ba433700d4a98fd466b38a495ed5a7adae020
Reviewed-on: https://gerrit.libreoffice.org/46449
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/sw/source/filter/html/htmlcss1.cxx b/sw/source/filter/html/htmlcss1.cxx
index fa4e9a4951b8..14f7061c6233 100644
--- a/sw/source/filter/html/htmlcss1.cxx
+++ b/sw/source/filter/html/htmlcss1.cxx
@@ -1541,119 +1541,119 @@ HTMLAttr **SwHTMLParser::GetAttrTabEntry( sal_uInt16 nWhich )
switch( nWhich )
{
case RES_CHRATR_BLINK:
- ppAttr = &m_aAttrTab.pBlink;
+ ppAttr = &m_xAttrTab->pBlink;
break;
case RES_CHRATR_CASEMAP:
- ppAttr = &m_aAttrTab.pCaseMap;
+ ppAttr = &m_xAttrTab->pCaseMap;
break;
case RES_CHRATR_COLOR:
- ppAttr = &m_aAttrTab.pFontColor;
+ ppAttr = &m_xAttrTab->pFontColor;
break;
case RES_CHRATR_CROSSEDOUT:
- ppAttr = &m_aAttrTab.pStrike;
+ ppAttr = &m_xAttrTab->pStrike;
break;
case RES_CHRATR_ESCAPEMENT:
- ppAttr = &m_aAttrTab.pEscapement;
+ ppAttr = &m_xAttrTab->pEscapement;
break;
case RES_CHRATR_FONT:
- ppAttr = &m_aAttrTab.pFont;
+ ppAttr = &m_xAttrTab->pFont;
break;
case RES_CHRATR_CJK_FONT:
- ppAttr = &m_aAttrTab.pFontCJK;
+ ppAttr = &m_xAttrTab->pFontCJK;
break;
case RES_CHRATR_CTL_FONT:
- ppAttr = &m_aAttrTab.pFontCTL;
+ ppAttr = &m_xAttrTab->pFontCTL;
break;
case RES_CHRATR_FONTSIZE:
- ppAttr = &m_aAttrTab.pFontHeight;
+ ppAttr = &m_xAttrTab->pFontHeight;
break;
case RES_CHRATR_CJK_FONTSIZE:
- ppAttr = &m_aAttrTab.pFontHeightCJK;
+ ppAttr = &m_xAttrTab->pFontHeightCJK;
break;
case RES_CHRATR_CTL_FONTSIZE:
- ppAttr = &m_aAttrTab.pFontHeightCTL;
+ ppAttr = &m_xAttrTab->pFontHeightCTL;
break;
case RES_CHRATR_KERNING:
- ppAttr = &m_aAttrTab.pKerning;
+ ppAttr = &m_xAttrTab->pKerning;
break;
case RES_CHRATR_POSTURE:
- ppAttr = &m_aAttrTab.pItalic;
+ ppAttr = &m_xAttrTab->pItalic;
break;
case RES_CHRATR_CJK_POSTURE:
- ppAttr = &m_aAttrTab.pItalicCJK;
+ ppAttr = &m_xAttrTab->pItalicCJK;
break;
case RES_CHRATR_CTL_POSTURE:
- ppAttr = &m_aAttrTab.pItalicCTL;
+ ppAttr = &m_xAttrTab->pItalicCTL;
break;
case RES_CHRATR_UNDERLINE:
- ppAttr = &m_aAttrTab.pUnderline;
+ ppAttr = &m_xAttrTab->pUnderline;
break;
case RES_CHRATR_WEIGHT:
- ppAttr = &m_aAttrTab.pBold;
+ ppAttr = &m_xAttrTab->pBold;
break;
case RES_CHRATR_CJK_WEIGHT:
- ppAttr = &m_aAttrTab.pBoldCJK;
+ ppAttr = &m_xAttrTab->pBoldCJK;
break;
case RES_CHRATR_CTL_WEIGHT:
- ppAttr = &m_aAttrTab.pBoldCTL;
+ ppAttr = &m_xAttrTab->pBoldCTL;
break;
case RES_CHRATR_BACKGROUND:
- ppAttr = &m_aAttrTab.pCharBrush;
+ ppAttr = &m_xAttrTab->pCharBrush;
break;
case RES_CHRATR_BOX:
- ppAttr = &m_aAttrTab.pCharBox;
+ ppAttr = &m_xAttrTab->pCharBox;
break;
case RES_PARATR_LINESPACING:
- ppAttr = &m_aAttrTab.pLineSpacing;
+ ppAttr = &m_xAttrTab->pLineSpacing;
break;
case RES_PARATR_ADJUST:
- ppAttr = &m_aAttrTab.pAdjust;
+ ppAttr = &m_xAttrTab->pAdjust;
break;
case RES_LR_SPACE:
- ppAttr = &m_aAttrTab.pLRSpace;
+ ppAttr = &m_xAttrTab->pLRSpace;
break;
case RES_UL_SPACE:
- ppAttr = &m_aAttrTab.pULSpace;
+ ppAttr = &m_xAttrTab->pULSpace;
break;
case RES_BOX:
- ppAttr = &m_aAttrTab.pBox;
+ ppAttr = &m_xAttrTab->pBox;
break;
case RES_BACKGROUND:
- ppAttr = &m_aAttrTab.pBrush;
+ ppAttr = &m_xAttrTab->pBrush;
break;
case RES_BREAK:
- ppAttr = &m_aAttrTab.pBreak;
+ ppAttr = &m_xAttrTab->pBreak;
break;
case RES_PAGEDESC:
- ppAttr = &m_aAttrTab.pPageDesc;
+ ppAttr = &m_xAttrTab->pPageDesc;
break;
case RES_PARATR_SPLIT:
- ppAttr = &m_aAttrTab.pSplit;
+ ppAttr = &m_xAttrTab->pSplit;
break;
case RES_PARATR_WIDOWS:
- ppAttr = &m_aAttrTab.pWidows;
+ ppAttr = &m_xAttrTab->pWidows;
break;
case RES_PARATR_ORPHANS:
- ppAttr = &m_aAttrTab.pOrphans;
+ ppAttr = &m_xAttrTab->pOrphans;
break;
case RES_KEEP:
- ppAttr = &m_aAttrTab.pKeep;
+ ppAttr = &m_xAttrTab->pKeep;
break;
case RES_CHRATR_LANGUAGE:
- ppAttr = &m_aAttrTab.pLanguage;
+ ppAttr = &m_xAttrTab->pLanguage;
break;
case RES_CHRATR_CJK_LANGUAGE:
- ppAttr = &m_aAttrTab.pLanguageCJK;
+ ppAttr = &m_xAttrTab->pLanguageCJK;
break;
case RES_CHRATR_CTL_LANGUAGE:
- ppAttr = &m_aAttrTab.pLanguageCTL;
+ ppAttr = &m_xAttrTab->pLanguageCTL;
break;
case RES_FRAMEDIR:
- ppAttr = &m_aAttrTab.pDirection;
+ ppAttr = &m_xAttrTab->pDirection;
break;
}
@@ -2261,7 +2261,7 @@ void SwHTMLParser::InsertParaAttrs( const SfxItemSet& rItemSet )
if( ppAttr )
{
- NewAttr( ppAttr, *pItem );
+ NewAttr(m_xAttrTab, ppAttr, *pItem);
if( RES_PARATR_BEGIN > nWhich )
(*ppAttr)->SetLikePara();
m_aParaAttrs.push_back( *ppAttr );
diff --git a/sw/source/filter/html/htmlctxt.cxx b/sw/source/filter/html/htmlctxt.cxx
index 263c347b01b7..bd48c6a9c223 100644
--- a/sw/source/filter/html/htmlctxt.cxx
+++ b/sw/source/filter/html/htmlctxt.cxx
@@ -46,8 +46,8 @@ class HTMLAttrContext_SaveDoc
SwHTMLNumRuleInfo aNumRuleInfo; // Numbering for this environment
std::unique_ptr<SwPosition>
pPos; // Jump back to here when leaving context
- std::unique_ptr<HTMLAttrTable>
- pAttrTab; // Valid attributes for the environment,
+ std::shared_ptr<HTMLAttrTable>
+ xAttrTab; // Valid attributes for the environment,
// if attributes shouldn't be preserved
size_t nContextStMin; // Stack lower bound for the environment
@@ -62,7 +62,7 @@ class HTMLAttrContext_SaveDoc
public:
HTMLAttrContext_SaveDoc() :
- pPos( nullptr ), pAttrTab( nullptr ),
+ pPos( nullptr ),
nContextStMin( SIZE_MAX ), nContextStAttrMin( SIZE_MAX ),
bStripTrailingPara( false ), bKeepNumRules( false ),
bFixHeaderDist( false ), bFixFooterDist( false )
@@ -76,7 +76,7 @@ public:
void SetNumInfo( const SwHTMLNumRuleInfo& rInf ) { aNumRuleInfo.Set(rInf); }
const SwHTMLNumRuleInfo& GetNumInfo() const { return aNumRuleInfo; }
- HTMLAttrTable *GetAttrTab( bool bCreate= false );
+ std::shared_ptr<HTMLAttrTable> GetAttrTab(bool bCreate = false);
void SetContextStMin( size_t nMin ) { nContextStMin = nMin; }
size_t GetContextStMin() const { return nContextStMin; }
@@ -97,14 +97,14 @@ public:
bool GetFixFooterDist() const { return bFixFooterDist; }
};
-HTMLAttrTable *HTMLAttrContext_SaveDoc::GetAttrTab( bool bCreate )
+std::shared_ptr<HTMLAttrTable> HTMLAttrContext_SaveDoc::GetAttrTab( bool bCreate )
{
- if( !pAttrTab && bCreate )
+ if (!xAttrTab && bCreate)
{
- pAttrTab.reset( new HTMLAttrTable );
- memset( pAttrTab.get(), 0, sizeof( HTMLAttrTable ));
+ xAttrTab.reset(new HTMLAttrTable);
+ memset(xAttrTab.get(), 0, sizeof(HTMLAttrTable));
}
- return pAttrTab.get();
+ return xAttrTab;
}
HTMLAttrContext_SaveDoc *HTMLAttrContext::GetSaveDocContext( bool bCreate )
@@ -139,7 +139,7 @@ void SwHTMLParser::SplitAttrTab( const SwPosition& rNewPos )
bool bMoveBack = false;
// close all open attributes and re-open them after the table
- HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(&m_aAttrTab);
+ HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(m_xAttrTab.get());
for (auto nCnt = sizeof(HTMLAttrTable) / sizeof(HTMLAttr*); nCnt--; ++pHTMLAttributes)
{
HTMLAttr *pAttr = *pHTMLAttributes;
@@ -244,8 +244,8 @@ void SwHTMLParser::SaveDocContext( HTMLAttrContext *pCntxt,
}
else
{
- HTMLAttrTable *pSaveAttrTab = pSave->GetAttrTab( true );
- SaveAttrTab( *pSaveAttrTab );
+ std::shared_ptr<HTMLAttrTable> xSaveAttrTab = pSave->GetAttrTab(true);
+ SaveAttrTab(xSaveAttrTab);
}
pSave->SetPos( *m_pPam->GetPoint() );
@@ -282,15 +282,15 @@ void SwHTMLParser::RestoreDocContext( HTMLAttrContext *pCntxt )
FixHeaderFooterDistance( pSave->GetFixHeaderDist(),
pSave->GetPos() );
- HTMLAttrTable *pSaveAttrTab = pSave->GetAttrTab();
- if( !pSaveAttrTab )
+ std::shared_ptr<HTMLAttrTable> xSaveAttrTab = pSave->GetAttrTab();
+ if (!xSaveAttrTab)
{
// Close attribute on current position and start on the old one
SplitAttrTab( *pSave->GetPos() );
}
else
{
- RestoreAttrTab( *pSaveAttrTab );
+ RestoreAttrTab(xSaveAttrTab);
}
*m_pPam->GetPoint() = *pSave->GetPos();
@@ -480,10 +480,10 @@ void SwHTMLParser::InsertAttrs( SfxItemSet &rItemSet,
// We only set the DropCap attribute if the initial spans multiple lines
if( aDrop.GetLines() > 1 )
{
- NewAttr( &m_aAttrTab.pDropCap, aDrop );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pDropCap, aDrop);
HTMLAttrs &rAttrs = pContext->GetAttrs();
- rAttrs.push_back( m_aAttrTab.pDropCap );
+ rAttrs.push_back( m_xAttrTab->pDropCap );
return;
}
@@ -562,8 +562,8 @@ void SwHTMLParser::InsertAttrs( SfxItemSet &rItemSet,
aLRItem.SetTextFirstLineOfst( nIndent );
aLRItem.SetTextLeft( nLeft );
aLRItem.SetRight( nRight );
- NewAttr( &m_aAttrTab.pLRSpace, aLRItem );
- EndAttr( m_aAttrTab.pLRSpace, false );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pLRSpace, aLRItem);
+ EndAttr( m_xAttrTab->pLRSpace, false );
}
break;
@@ -578,33 +578,33 @@ void SwHTMLParser::InsertAttrs( SfxItemSet &rItemSet,
if( !rPropInfo.m_bBottomMargin )
aULSpace.SetLower( nLower );
- NewAttr( &m_aAttrTab.pULSpace, aULSpace );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pULSpace, aULSpace);
// save context information
HTMLAttrs &rAttrs = pContext->GetAttrs();
- rAttrs.push_back( m_aAttrTab.pULSpace );
+ rAttrs.push_back( m_xAttrTab->pULSpace );
pContext->SetULSpace( aULSpace.GetUpper(), aULSpace.GetLower() );
}
else
{
- ppAttr = &m_aAttrTab.pULSpace;
+ ppAttr = &m_xAttrTab->pULSpace;
}
break;
case RES_CHRATR_FONTSIZE:
// don't set attributes with a % property
if( static_cast<const SvxFontHeightItem *>(pItem)->GetProp() == 100 )
- ppAttr = &m_aAttrTab.pFontHeight;
+ ppAttr = &m_xAttrTab->pFontHeight;
break;
case RES_CHRATR_CJK_FONTSIZE:
// don't set attributes with a % property
if( static_cast<const SvxFontHeightItem *>(pItem)->GetProp() == 100 )
- ppAttr = &m_aAttrTab.pFontHeightCJK;
+ ppAttr = &m_xAttrTab->pFontHeightCJK;
break;
case RES_CHRATR_CTL_FONTSIZE:
// don't set attributes with a % property
if( static_cast<const SvxFontHeightItem *>(pItem)->GetProp() == 100 )
- ppAttr = &m_aAttrTab.pFontHeightCTL;
+ ppAttr = &m_xAttrTab->pFontHeightCTL;
break;
case RES_BACKGROUND:
@@ -615,16 +615,16 @@ void SwHTMLParser::InsertAttrs( SfxItemSet &rItemSet,
aBrushItem.SetWhich( RES_CHRATR_BACKGROUND );
// Set the attribute
- NewAttr( &m_aAttrTab.pCharBrush, aBrushItem );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pCharBrush, aBrushItem);
// and save context information
HTMLAttrs &rAttrs = pContext->GetAttrs();
- rAttrs.push_back( m_aAttrTab.pCharBrush );
+ rAttrs.push_back( m_xAttrTab->pCharBrush );
}
else if( pContext->GetToken() != HtmlTokenId::TABLEHEADER_ON &&
pContext->GetToken() != HtmlTokenId::TABLEDATA_ON )
{
- ppAttr = &m_aAttrTab.pBrush;
+ ppAttr = &m_xAttrTab->pBrush;
}
break;
@@ -634,14 +634,14 @@ void SwHTMLParser::InsertAttrs( SfxItemSet &rItemSet,
SvxBoxItem aBoxItem( *static_cast<const SvxBoxItem *>(pItem) );
aBoxItem.SetWhich( RES_CHRATR_BOX );
- NewAttr( &m_aAttrTab.pCharBox, aBoxItem );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pCharBox, aBoxItem);
HTMLAttrs &rAttrs = pContext->GetAttrs();
- rAttrs.push_back( m_aAttrTab.pCharBox );
+ rAttrs.push_back( m_xAttrTab->pCharBox );
}
else
{
- ppAttr = &m_aAttrTab.pBox;
+ ppAttr = &m_xAttrTab->pBox;
}
break;
@@ -653,7 +653,7 @@ void SwHTMLParser::InsertAttrs( SfxItemSet &rItemSet,
if( ppAttr )
{
// Set the attribute
- NewAttr( ppAttr, *pItem );
+ NewAttr(m_xAttrTab, ppAttr, *pItem);
// and save context information
HTMLAttrs &rAttrs = pContext->GetAttrs();
@@ -678,7 +678,7 @@ void SwHTMLParser::InsertAttr( HTMLAttr **ppAttr, const SfxPoolItem & rItem,
}
// Set the attribute
- NewAttr( ppAttr, rItem );
+ NewAttr(m_xAttrTab, ppAttr, rItem);
// save context information
HTMLAttrs &rAttrs = pCntxt->GetAttrs();
diff --git a/sw/source/filter/html/htmldrawreader.cxx b/sw/source/filter/html/htmldrawreader.cxx
index 9720a399de2f..b937eea4608d 100644
--- a/sw/source/filter/html/htmldrawreader.cxx
+++ b/sw/source/filter/html/htmldrawreader.cxx
@@ -425,7 +425,7 @@ void SwHTMLParser::NewMarquee( HTMLTable *pCurTable )
}
// set attribute of environment at the Draw object
- HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(&m_aAttrTab);
+ HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(m_xAttrTab.get());
for (auto nCnt = sizeof(HTMLAttrTable) / sizeof(HTMLAttr*); nCnt--; ++pHTMLAttributes)
{
HTMLAttr *pAttr = *pHTMLAttributes;
diff --git a/sw/source/filter/html/htmlgrin.cxx b/sw/source/filter/html/htmlgrin.cxx
index 54e967e661f4..53842661bd95 100644
--- a/sw/source/filter/html/htmlgrin.cxx
+++ b/sw/source/filter/html/htmlgrin.cxx
@@ -229,9 +229,9 @@ void SwHTMLParser::SetAnchorAndAdjustment( sal_Int16 eVertOri,
if( nUpper )
{
- NewAttr( &m_aAttrTab.pULSpace, SvxULSpaceItem( 0, nLower, RES_UL_SPACE ) );
- m_aParaAttrs.push_back( m_aAttrTab.pULSpace );
- EndAttr( m_aAttrTab.pULSpace, false );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pULSpace, SvxULSpaceItem(0, nLower, RES_UL_SPACE));
+ m_aParaAttrs.push_back( m_xAttrTab->pULSpace );
+ EndAttr( m_xAttrTab->pULSpace, false );
}
}
@@ -311,7 +311,7 @@ void SwHTMLParser::InsertImage()
long nWidth=0, nHeight=0;
long nVSpace=0, nHSpace=0;
- sal_uInt16 nBorder = (m_aAttrTab.pINetFormat ? 1 : 0);
+ sal_uInt16 nBorder = (m_xAttrTab->pINetFormat ? 1 : 0);
bool bIsMap = false;
bool bPrcWidth = false;
bool bPrcHeight = false;
@@ -509,10 +509,10 @@ IMAGE_SETEVENT:
::editeng::SvxBorderLine aHBorderLine( nullptr, nHBorderWidth );
::editeng::SvxBorderLine aVBorderLine( nullptr, nVBorderWidth );
- if( m_aAttrTab.pINetFormat )
+ if( m_xAttrTab->pINetFormat )
{
const OUString& rURL =
- static_cast<const SwFormatINetFormat&>(m_aAttrTab.pINetFormat->GetItem()).GetValue();
+ static_cast<const SwFormatINetFormat&>(m_xAttrTab->pINetFormat->GetItem()).GetValue();
m_pCSS1Parser->SetATagStyles();
sal_uInt16 nPoolId = static_cast< sal_uInt16 >(m_xDoc->IsVisitedURL( rURL )
@@ -524,8 +524,8 @@ IMAGE_SETEVENT:
}
else
{
- const SvxColorItem& rColorItem = m_aAttrTab.pFontColor ?
- static_cast<const SvxColorItem &>(m_aAttrTab.pFontColor->GetItem()) :
+ const SvxColorItem& rColorItem = m_xAttrTab->pFontColor ?
+ static_cast<const SvxColorItem &>(m_xAttrTab->pFontColor->GetItem()) :
static_cast<const SvxColorItem &>(m_xDoc->GetDefault(RES_CHRATR_COLOR));
aHBorderLine.SetColor( rColorItem.GetValue() );
aVBorderLine.SetColor( aHBorderLine.GetColor() );
@@ -749,10 +749,10 @@ IMAGE_SETEVENT:
pGrfNd->SetScaleImageMap( true );
}
- if( m_aAttrTab.pINetFormat )
+ if( m_xAttrTab->pINetFormat )
{
const SwFormatINetFormat &rINetFormat =
- static_cast<const SwFormatINetFormat&>(m_aAttrTab.pINetFormat->GetItem());
+ static_cast<const SwFormatINetFormat&>(m_xAttrTab->pINetFormat->GetItem());
SwFormatURL aURL( pFlyFormat->GetURL() );
@@ -776,14 +776,14 @@ IMAGE_SETEVENT:
}
if ((RndStdIds::FLY_AS_CHAR == pFlyFormat->GetAnchor().GetAnchorId()) &&
- m_aAttrTab.pINetFormat->GetSttPara() ==
+ m_xAttrTab->pINetFormat->GetSttPara() ==
m_pPam->GetPoint()->nNode &&
- m_aAttrTab.pINetFormat->GetSttCnt() ==
+ m_xAttrTab->pINetFormat->GetSttCnt() ==
m_pPam->GetPoint()->nContent.GetIndex() - 1 )
{
// the attribute was insert right before as-character anchored
// graphic, therefore we move it
- m_aAttrTab.pINetFormat->SetStart( *m_pPam->GetPoint() );
+ m_xAttrTab->pINetFormat->SetStart( *m_pPam->GetPoint() );
// When the attribute is also an anchor, we'll insert
// a bookmark before the graphic, because SwFormatURL
@@ -1233,7 +1233,7 @@ ANCHOR_SETEVENT:
aINetFormat.SetMacroTable( &aMacroTable );
// set the default attribute
- InsertAttr(&m_aAttrTab.pINetFormat, aINetFormat, xCntxt.get());
+ InsertAttr(&m_xAttrTab->pINetFormat, aINetFormat, xCntxt.get());
}
else if( !aName.isEmpty() )
{
@@ -1274,7 +1274,7 @@ void SwHTMLParser::EndAnchor()
void SwHTMLParser::InsertBookmark( const OUString& rName )
{
HTMLAttr* pTmp = new HTMLAttr( *m_pPam->GetPoint(),
- SfxStringItem( RES_FLTR_BOOKMARK, rName ));
+ SfxStringItem(RES_FLTR_BOOKMARK, rName), nullptr, std::shared_ptr<HTMLAttrTable>());
m_aSetAttrTab.push_back( pTmp );
}
diff --git a/sw/source/filter/html/htmlsect.cxx b/sw/source/filter/html/htmlsect.cxx
index a158212e09d8..67fa9d916d8a 100644
--- a/sw/source/filter/html/htmlsect.cxx
+++ b/sw/source/filter/html/htmlsect.cxx
@@ -368,7 +368,7 @@ void SwHTMLParser::NewDivision( HtmlTokenId nToken )
if( SvxAdjust::End != eAdjust )
{
- InsertAttr(&m_aAttrTab.pAdjust, SvxAdjustItem(eAdjust, RES_PARATR_ADJUST), xCntxt.get());
+ InsertAttr(&m_xAttrTab->pAdjust, SvxAdjustItem(eAdjust, RES_PARATR_ADJUST), xCntxt.get());
}
// parse style
diff --git a/sw/source/filter/html/htmltab.cxx b/sw/source/filter/html/htmltab.cxx
index 6810a222c742..18d3a45f62af 100644
--- a/sw/source/filter/html/htmltab.cxx
+++ b/sw/source/filter/html/htmltab.cxx
@@ -122,7 +122,7 @@ class HTMLTableContext
public:
- HTMLAttrTable aAttrTab; // attributes
+ std::shared_ptr<HTMLAttrTable> xAttrTab; // attributes
HTMLTableContext( SwPosition *pPs, size_t nCntxtStMin,
size_t nCntxtStAttrMin ) :
@@ -133,9 +133,10 @@ public:
nContextStMin( nCntxtStMin ),
bRestartPRE( false ),
bRestartXMP( false ),
- bRestartListing( false )
+ bRestartListing( false ),
+ xAttrTab(new HTMLAttrTable)
{
- memset( &aAttrTab, 0, sizeof( HTMLAttrTable ));
+ memset(xAttrTab.get(), 0, sizeof(HTMLAttrTable));
}
void SetNumInfo( const SwHTMLNumRuleInfo& rInf ) { aNumRuleInfo.Set(rInf); }
@@ -3109,7 +3110,7 @@ CellSaveStruct::CellSaveStruct( SwHTMLParser& rParser, HTMLTable const *pCurTabl
}
std::unique_ptr<HTMLAttrContext> xCntxt(new HTMLAttrContext(nToken, nColl, aEmptyOUStr, true));
if( SvxAdjust::End != m_eAdjust )
- rParser.InsertAttr(&rParser.m_aAttrTab.pAdjust, SvxAdjustItem(m_eAdjust, RES_PARATR_ADJUST),
+ rParser.InsertAttr(&rParser.m_xAttrTab->pAdjust, SvxAdjustItem(m_eAdjust, RES_PARATR_ADJUST),
xCntxt.get());
if( SwHTMLParser::HasStyleOptions( m_aStyle, m_aId, m_aClass, &m_aLang, &m_aDir ) )
@@ -3165,7 +3166,7 @@ void CellSaveStruct::InsertCell( SwHTMLParser& rParser,
if( rParser.m_nContextStAttrMin == GetContextStAttrMin() )
{
- HTMLAttr** pTable = reinterpret_cast<HTMLAttr**>(&rParser.m_aAttrTab);
+ HTMLAttr** pTable = reinterpret_cast<HTMLAttr**>(rParser.m_xAttrTab.get());
for( auto nCnt = sizeof( HTMLAttrTable ) / sizeof( HTMLAttr* );
nCnt--; ++pTable )
@@ -3263,7 +3264,7 @@ HTMLTableCnts *SwHTMLParser::InsertTableContents(
const SwNodeIndex& rSttPara = m_pPam->GetPoint()->nNode;
sal_Int32 nSttCnt = m_pPam->GetPoint()->nContent.GetIndex();
- HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(&m_aAttrTab);
+ HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(m_xAttrTab.get());
for (sal_uInt16 nCnt = sizeof(HTMLAttrTable) / sizeof(HTMLAttr*); nCnt--; ++pHTMLAttributes)
{
HTMLAttr *pAttr = *pHTMLAttributes;
@@ -3422,21 +3423,21 @@ void SwHTMLParser::BuildTableCell( HTMLTable *pCurTable, bool bReadOptions,
SvxFontHeightItem aFontHeight( 40, 100, RES_CHRATR_FONTSIZE );
HTMLAttr* pTmp =
- new HTMLAttr( *m_pPam->GetPoint(), aFontHeight );
+ new HTMLAttr( *m_pPam->GetPoint(), aFontHeight, nullptr, std::shared_ptr<HTMLAttrTable>() );
m_aSetAttrTab.push_back( pTmp );
SvxFontHeightItem aFontHeightCJK( 40, 100, RES_CHRATR_CJK_FONTSIZE );
pTmp =
- new HTMLAttr( *m_pPam->GetPoint(), aFontHeightCJK );
+ new HTMLAttr( *m_pPam->GetPoint(), aFontHeightCJK, nullptr, std::shared_ptr<HTMLAttrTable>() );
m_aSetAttrTab.push_back( pTmp );
SvxFontHeightItem aFontHeightCTL( 40, 100, RES_CHRATR_CTL_FONTSIZE );
pTmp =
- new HTMLAttr( *m_pPam->GetPoint(), aFontHeightCTL );
+ new HTMLAttr( *m_pPam->GetPoint(), aFontHeightCTL, nullptr, std::shared_ptr<HTMLAttrTable>() );
m_aSetAttrTab.push_back( pTmp );
pTmp = new HTMLAttr( *m_pPam->GetPoint(),
- SvxULSpaceItem( 0, 0, RES_UL_SPACE ) );
+ SvxULSpaceItem( 0, 0, RES_UL_SPACE ), nullptr, std::shared_ptr<HTMLAttrTable>() );
m_aSetAttrTab.push_front( pTmp ); // Position 0, since
// something can be set by
// the table end before
@@ -3482,7 +3483,7 @@ void SwHTMLParser::BuildTableCell( HTMLTable *pCurTable, bool bReadOptions,
HTMLAttrs *pPostIts = nullptr;
if( !bForceFrame && (bTopTable || pCurTable->HasParentSection()) )
{
- SplitAttrTab( pTCntxt->aAttrTab, bTopTable );
+ SplitAttrTab(pTCntxt->xAttrTab, bTopTable);
// If we reuse a already existing paragraph, we can't add
// PostIts since the paragraph gets behind that table.
// They're gonna be moved into the first paragraph of the table
@@ -3496,7 +3497,7 @@ void SwHTMLParser::BuildTableCell( HTMLTable *pCurTable, bool bReadOptions,
}
else
{
- SaveAttrTab( pTCntxt->aAttrTab );
+ SaveAttrTab(pTCntxt->xAttrTab);
if( bTopTable && !bAppended )
{
pPostIts = new HTMLAttrs;
@@ -3763,8 +3764,8 @@ void SwHTMLParser::BuildTableCell( HTMLTable *pCurTable, bool bReadOptions,
}
// There could be a section in the cell
- eTabAdjust = m_aAttrTab.pAdjust
- ? static_cast<const SvxAdjustItem&>(m_aAttrTab.pAdjust->GetItem()).
+ eTabAdjust = m_xAttrTab->pAdjust
+ ? static_cast<const SvxAdjustItem&>(m_xAttrTab->pAdjust->GetItem()).
GetAdjust()
: SvxAdjust::End;
}
@@ -4565,12 +4566,13 @@ class CaptionSaveStruct : public SectionSaveStruct
public:
- HTMLAttrTable aAttrTab; // attributes
+ std::shared_ptr<HTMLAttrTable> xAttrTab; // attributes
CaptionSaveStruct( SwHTMLParser& rParser, const SwPosition& rPos ) :
- SectionSaveStruct( rParser ), aSavePos( rPos )
+ SectionSaveStruct( rParser ), aSavePos( rPos ),
+ xAttrTab(new HTMLAttrTable)
{
- rParser.SaveAttrTab( aAttrTab );
+ rParser.SaveAttrTab(xAttrTab);
// The current numbering was remembered and just needs to be closed
aNumRuleInfo.Set( rParser.GetNumInfo() );
@@ -4585,7 +4587,7 @@ public:
Restore( rParser );
// Recover the old attribute tables
- rParser.RestoreAttrTab( aAttrTab );
+ rParser.RestoreAttrTab(xAttrTab);
// Re-open the old numbering
rParser.GetNumInfo().Set( aNumRuleInfo );
@@ -4651,10 +4653,10 @@ void SwHTMLParser::BuildTableCaption( HTMLTable *pCurTable )
std::unique_ptr<HTMLAttrContext> xCntxt(new HTMLAttrContext(HtmlTokenId::CAPTION_ON));
// Table headers are always centered
- NewAttr( &m_aAttrTab.pAdjust, SvxAdjustItem(SvxAdjust::Center, RES_PARATR_ADJUST) );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pAdjust, SvxAdjustItem(SvxAdjust::Center, RES_PARATR_ADJUST));
HTMLAttrs &rAttrs = xCntxt->GetAttrs();
- rAttrs.push_back( m_aAttrTab.pAdjust );
+ rAttrs.push_back( m_xAttrTab->pAdjust );
PushContext(xCntxt);
@@ -5181,7 +5183,7 @@ std::shared_ptr<HTMLTable> SwHTMLParser::BuildTable(SvxAdjust eParentAdjust,
GetNumInfo().Set( pTCntxt->GetNumInfo() );
pTCntxt->RestorePREListingXMP( *this );
- RestoreAttrTab( pTCntxt->aAttrTab );
+ RestoreAttrTab(pTCntxt->xAttrTab);
if (m_xTable == xCurTable && eState != SvParserState::Error)
{
diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx
index ef5b157fbe9c..88d926472082 100644
--- a/sw/source/filter/html/swhtml.cxx
+++ b/sw/source/filter/html/swhtml.cxx
@@ -246,6 +246,7 @@ SwHTMLParser::SwHTMLParser( SwDoc* pD, SwPaM& rCursor, SvStream& rIn,
SwClient( nullptr ),
m_aPathToFile( rPath ),
m_sBaseURL( rBaseURL ),
+ m_xAttrTab(new HTMLAttrTable),
m_pAppletImpl( nullptr ),
m_pCSS1Parser( nullptr ),
m_pNumRuleInfo( new SwHTMLNumRuleInfo ),
@@ -305,7 +306,7 @@ SwHTMLParser::SwHTMLParser( SwDoc* pD, SwPaM& rCursor, SvStream& rIn,
rCursor.DeleteMark();
m_pPam = &rCursor; // re-use existing cursor: avoids spurious ~SwIndexReg assert
- memset( &m_aAttrTab, 0, sizeof( HTMLAttrTable ));
+ memset(m_xAttrTab.get(), 0, sizeof(HTMLAttrTable));
// Read the font sizes 1-7 from the INI file
SvxHtmlOptions& rHtmlOptions = SvxHtmlOptions::Get();
@@ -1441,8 +1442,8 @@ void SwHTMLParser::NextToken( HtmlTokenId nToken )
AppendTextNode();
if (!m_xTable && !m_xDoc->IsInHeaderFooter(m_pPam->GetPoint()->nNode))
{
- NewAttr( &m_aAttrTab.pBreak, SvxFormatBreakItem(SvxBreak::PageBefore, RES_BREAK) );
- EndAttr( m_aAttrTab.pBreak, false );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pBreak, SvxFormatBreakItem(SvxBreak::PageBefore, RES_BREAK));
+ EndAttr( m_xAttrTab->pBreak, false );
}
break;
@@ -1686,8 +1687,8 @@ void SwHTMLParser::NextToken( HtmlTokenId nToken )
if ( m_nParaCnt < 5 )
Show(); // show what we have up to here
- SvxAdjust eAdjust = m_aAttrTab.pAdjust
- ? static_cast<const SvxAdjustItem&>(m_aAttrTab.pAdjust->GetItem()).
+ SvxAdjust eAdjust = m_xAttrTab->pAdjust
+ ? static_cast<const SvxAdjustItem&>(m_xAttrTab->pAdjust->GetItem()).
GetAdjust()
: SvxAdjust::End;
BuildTable( eAdjust );
@@ -1743,9 +1744,9 @@ void SwHTMLParser::NextToken( HtmlTokenId nToken )
SvxPostureItem aPostureCJK( ITALIC_NORMAL, RES_CHRATR_CJK_POSTURE );
SvxPostureItem aPostureCTL( ITALIC_NORMAL, RES_CHRATR_CTL_POSTURE );
NewStdAttr( HtmlTokenId::ITALIC_ON,
- &m_aAttrTab.pItalic, aPosture,
- &m_aAttrTab.pItalicCJK, &aPostureCJK,
- &m_aAttrTab.pItalicCTL, &aPostureCTL );
+ &m_xAttrTab->pItalic, aPosture,
+ &m_xAttrTab->pItalicCJK, &aPostureCJK,
+ &m_xAttrTab->pItalicCTL, &aPostureCTL );
}
break;
@@ -1755,44 +1756,44 @@ void SwHTMLParser::NextToken( HtmlTokenId nToken )
SvxWeightItem aWeightCJK( WEIGHT_BOLD, RES_CHRATR_CJK_WEIGHT );
SvxWeightItem aWeightCTL( WEIGHT_BOLD, RES_CHRATR_CTL_WEIGHT );
NewStdAttr( HtmlTokenId::BOLD_ON,
- &m_aAttrTab.pBold, aWeight,
- &m_aAttrTab.pBoldCJK, &aWeightCJK,
- &m_aAttrTab.pBoldCTL, &aWeightCTL );
+ &m_xAttrTab->pBold, aWeight,
+ &m_xAttrTab->pBoldCJK, &aWeightCJK,
+ &m_xAttrTab->pBoldCTL, &aWeightCTL );
}
break;
case HtmlTokenId::STRIKE_ON:
case HtmlTokenId::STRIKETHROUGH_ON:
{
- NewStdAttr( HtmlTokenId::STRIKE_ON, &m_aAttrTab.pStrike,
+ NewStdAttr( HtmlTokenId::STRIKE_ON, &m_xAttrTab->pStrike,
SvxCrossedOutItem(STRIKEOUT_SINGLE, RES_CHRATR_CROSSEDOUT) );
}
break;
case HtmlTokenId::UNDERLINE_ON:
{
- NewStdAttr( HtmlTokenId::UNDERLINE_ON, &m_aAttrTab.pUnderline,
+ NewStdAttr( HtmlTokenId::UNDERLINE_ON, &m_xAttrTab->pUnderline,
SvxUnderlineItem(LINESTYLE_SINGLE, RES_CHRATR_UNDERLINE) );
}
break;
case HtmlTokenId::SUPERSCRIPT_ON:
{
- NewStdAttr( HtmlTokenId::SUPERSCRIPT_ON, &m_aAttrTab.pEscapement,
+ NewStdAttr( HtmlTokenId::SUPERSCRIPT_ON, &m_xAttrTab->pEscapement,
SvxEscapementItem(HTML_ESC_SUPER,HTML_ESC_PROP, RES_CHRATR_ESCAPEMENT) );
}
break;
case HtmlTokenId::SUBSCRIPT_ON:
{
- NewStdAttr( HtmlTokenId::SUBSCRIPT_ON, &m_aAttrTab.pEscapement,
+ NewStdAttr( HtmlTokenId::SUBSCRIPT_ON, &m_xAttrTab->pEscapement,
SvxEscapementItem(HTML_ESC_SUB,HTML_ESC_PROP, RES_CHRATR_ESCAPEMENT) );
}
break;
case HtmlTokenId::BLINK_ON:
{
- NewStdAttr( HtmlTokenId::BLINK_ON, &m_aAttrTab.pBlink,
+ NewStdAttr( HtmlTokenId::BLINK_ON, &m_xAttrTab->pBlink,
SvxBlinkItem( true, RES_CHRATR_BLINK ) );
}
break;
@@ -2140,7 +2141,7 @@ bool SwHTMLParser::AppendTextNode( SwHTMLAppendMode eMode, bool bUpdateNum )
const sal_Int32 nEndCnt = aOldPos.nContent.GetIndex();
const SwPosition& rPos = *m_pPam->GetPoint();
- HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(&m_aAttrTab);
+ HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(m_xAttrTab.get());
for (auto nCnt = sizeof(HTMLAttrTable) / sizeof(HTMLAttr*); nCnt--; ++pHTMLAttributes)
{
HTMLAttr *pAttr = *pHTMLAttributes;
@@ -2966,7 +2967,7 @@ void SwHTMLParser::SetAttr_( bool bChkEnd, bool bBeforeTable,
}
}
-void SwHTMLParser::NewAttr( HTMLAttr **ppAttr, const SfxPoolItem& rItem )
+void SwHTMLParser::NewAttr(const std::shared_ptr<HTMLAttrTable>& rAttrTable, HTMLAttr **ppAttr, const SfxPoolItem& rItem )
{
// Font height and font colour as well as escape attributes may not be
// combined. Therefore they're saved in a list and in it the last opened
@@ -2974,13 +2975,12 @@ void SwHTMLParser::NewAttr( HTMLAttr **ppAttr, const SfxPoolItem& rItem )
// attributes count is just incremented.
if( *ppAttr )
{
- HTMLAttr *pAttr = new HTMLAttr( *m_pPam->GetPoint(), rItem,
- ppAttr );
+ HTMLAttr *pAttr = new HTMLAttr(*m_pPam->GetPoint(), rItem, ppAttr, rAttrTable);
pAttr->InsertNext( *ppAttr );
(*ppAttr) = pAttr;
}
else
- (*ppAttr) = new HTMLAttr( *m_pPam->GetPoint(), rItem, ppAttr );
+ (*ppAttr) = new HTMLAttr(*m_pPam->GetPoint(), rItem, ppAttr, rAttrTable);
}
bool SwHTMLParser::EndAttr( HTMLAttr* pAttr, bool bChkEmpty )
@@ -3202,7 +3202,7 @@ void SwHTMLParser::DeleteAttr( HTMLAttr* pAttr )
*ppHead = pNext;
}
-void SwHTMLParser::SaveAttrTab( HTMLAttrTable& rNewAttrTab )
+void SwHTMLParser::SaveAttrTab(std::shared_ptr<HTMLAttrTable>& rNewAttrTab)
{
// preliminary paragraph attributes are not allowed here, they could
// be set here and then the pointers become invalid!
@@ -3211,8 +3211,8 @@ void SwHTMLParser::SaveAttrTab( HTMLAttrTable& rNewAttrTab )
if( !m_aParaAttrs.empty() )
m_aParaAttrs.clear();
- HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(&m_aAttrTab);
- HTMLAttr** pSaveAttributes = reinterpret_cast<HTMLAttr**>(&rNewAttrTab);
+ HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(m_xAttrTab.get());
+ HTMLAttr** pSaveAttributes = reinterpret_cast<HTMLAttr**>(rNewAttrTab.get());
for (auto nCnt = sizeof(HTMLAttrTable) / sizeof(HTMLAttr*); nCnt--; ++pHTMLAttributes, ++pSaveAttributes)
{
@@ -3221,7 +3221,7 @@ void SwHTMLParser::SaveAttrTab( HTMLAttrTable& rNewAttrTab )
HTMLAttr *pAttr = *pSaveAttributes;
while (pAttr)
{
- pAttr->SetHead(pSaveAttributes);
+ pAttr->SetHead(pSaveAttributes, rNewAttrTab);
pAttr = pAttr->GetNext();
}
@@ -3229,7 +3229,7 @@ void SwHTMLParser::SaveAttrTab( HTMLAttrTable& rNewAttrTab )
}
}
-void SwHTMLParser::SplitAttrTab( HTMLAttrTable& rNewAttrTab,
+void SwHTMLParser::SplitAttrTab( std::shared_ptr<HTMLAttrTable>& rNewAttrTab,
bool bMoveEndBack )
{
// preliminary paragraph attributes are not allowed here, they could
@@ -3243,8 +3243,8 @@ void SwHTMLParser::SplitAttrTab( HTMLAttrTable& rNewAttrTab,
SwNodeIndex nEndIdx( nSttIdx );
// close all still open attributes and re-open them after the table
- HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(&m_aAttrTab);
- HTMLAttr** pSaveAttributes = reinterpret_cast<HTMLAttr**>(&rNewAttrTab);
+ HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(m_xAttrTab.get());
+ HTMLAttr** pSaveAttributes = reinterpret_cast<HTMLAttr**>(rNewAttrTab.get());
bool bSetAttr = true;
const sal_Int32 nSttCnt = m_pPam->GetPoint()->nContent.GetIndex();
sal_Int32 nEndCnt = nSttCnt;
@@ -3311,7 +3311,7 @@ void SwHTMLParser::SplitAttrTab( HTMLAttrTable& rNewAttrTab,
}
// set the start of the attribute anew and break link
- pAttr->Reset(nSttIdx, nSttCnt, pSaveAttributes);
+ pAttr->Reset(nSttIdx, nSttCnt, pSaveAttributes, rNewAttrTab);
if (*pSaveAttributes)
{
@@ -3330,7 +3330,7 @@ void SwHTMLParser::SplitAttrTab( HTMLAttrTable& rNewAttrTab,
}
}
-void SwHTMLParser::RestoreAttrTab( HTMLAttrTable& rNewAttrTab )
+void SwHTMLParser::RestoreAttrTab(std::shared_ptr<HTMLAttrTable>& rNewAttrTab)
{
// preliminary paragraph attributes are not allowed here, they could
// be set here and then the pointers become invalid!
@@ -3339,8 +3339,8 @@ void SwHTMLParser::RestoreAttrTab( HTMLAttrTable& rNewAttrTab )
if( !m_aParaAttrs.empty() )
m_aParaAttrs.clear();
- HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(&m_aAttrTab);
- HTMLAttr** pSaveAttributes = reinterpret_cast<HTMLAttr**>(&rNewAttrTab);
+ HTMLAttr** pHTMLAttributes = reinterpret_cast<HTMLAttr**>(m_xAttrTab.get());
+ HTMLAttr** pSaveAttributes = reinterpret_cast<HTMLAttr**>(rNewAttrTab.get());
for (auto nCnt = sizeof(HTMLAttrTable) / sizeof(HTMLAttr*); nCnt--; ++pHTMLAttributes, ++pSaveAttributes)
{
@@ -3353,7 +3353,7 @@ void SwHTMLParser::RestoreAttrTab( HTMLAttrTable& rNewAttrTab )
{
OSL_ENSURE( !pAttr->GetPrev() || !pAttr->GetPrev()->ppHead,
"Previous attribute has still a header" );
- pAttr->SetHead(pHTMLAttributes);
+ pAttr->SetHead(pHTMLAttributes, m_xAttrTab);
pAttr = pAttr->GetNext();
}
@@ -3363,8 +3363,7 @@ void SwHTMLParser::RestoreAttrTab( HTMLAttrTable& rNewAttrTab )
void SwHTMLParser::InsertAttr( const SfxPoolItem& rItem, bool bInsAtStart )
{
- HTMLAttr* pTmp = new HTMLAttr( *m_pPam->GetPoint(),
- rItem );
+ HTMLAttr* pTmp = new HTMLAttr(*m_pPam->GetPoint(), rItem, nullptr, std::shared_ptr<HTMLAttrTable>());
if (bInsAtStart)
m_aSetAttrTab.push_front( pTmp );
else
@@ -3583,11 +3582,11 @@ void SwHTMLParser::NewBasefontAttr()
else
{
SvxFontHeightItem aFontHeight( m_aFontHeights[nSize-1], 100, RES_CHRATR_FONTSIZE );
- InsertAttr( &m_aAttrTab.pFontHeight, aFontHeight, xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFontHeight, aFontHeight, xCntxt.get() );
SvxFontHeightItem aFontHeightCJK( m_aFontHeights[nSize-1], 100, RES_CHRATR_CJK_FONTSIZE );
- InsertAttr( &m_aAttrTab.pFontHeightCJK, aFontHeightCJK, xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFontHeightCJK, aFontHeightCJK, xCntxt.get() );
SvxFontHeightItem aFontHeightCTL( m_aFontHeights[nSize-1], 100, RES_CHRATR_CTL_FONTSIZE );
- InsertAttr( &m_aAttrTab.pFontHeightCTL, aFontHeightCTL, xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFontHeightCTL, aFontHeightCTL, xCntxt.get() );
}
// save the context
@@ -3799,22 +3798,22 @@ void SwHTMLParser::NewFontAttr( HtmlTokenId nToken )
if( nFontHeight )
{
SvxFontHeightItem aFontHeight( nFontHeight, 100, RES_CHRATR_FONTSIZE );
- InsertAttr( &m_aAttrTab.pFontHeight, aFontHeight, xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFontHeight, aFontHeight, xCntxt.get() );
SvxFontHeightItem aFontHeightCJK( nFontHeight, 100, RES_CHRATR_CJK_FONTSIZE );
- InsertAttr( &m_aAttrTab.pFontHeight, aFontHeightCJK, xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFontHeight, aFontHeightCJK, xCntxt.get() );
SvxFontHeightItem aFontHeightCTL( nFontHeight, 100, RES_CHRATR_CTL_FONTSIZE );
- InsertAttr( &m_aAttrTab.pFontHeight, aFontHeightCTL, xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFontHeight, aFontHeightCTL, xCntxt.get() );
}
if( bColor )
- InsertAttr( &m_aAttrTab.pFontColor, SvxColorItem(aColor, RES_CHRATR_COLOR), xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFontColor, SvxColorItem(aColor, RES_CHRATR_COLOR), xCntxt.get() );
if( !aFontName.isEmpty() )
{
SvxFontItem aFont( eFamily, aFontName, aStyleName, ePitch, eEnc, RES_CHRATR_FONT );
- InsertAttr( &m_aAttrTab.pFont, aFont, xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFont, aFont, xCntxt.get() );
SvxFontItem aFontCJK( eFamily, aFontName, aStyleName, ePitch, eEnc, RES_CHRATR_CJK_FONT );
- InsertAttr( &m_aAttrTab.pFont, aFontCJK, xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFont, aFontCJK, xCntxt.get() );
SvxFontItem aFontCTL( eFamily, aFontName, aStyleName, ePitch, eEnc, RES_CHRATR_CTL_FONT );
- InsertAttr( &m_aAttrTab.pFont, aFontCTL, xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pFont, aFontCTL, xCntxt.get() );
}
}
@@ -3894,7 +3893,7 @@ void SwHTMLParser::NewPara()
}
if( SvxAdjust::End != m_eParaAdjust )
- InsertAttr( &m_aAttrTab.pAdjust, SvxAdjustItem(m_eParaAdjust, RES_PARATR_ADJUST), xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pAdjust, SvxAdjustItem(m_eParaAdjust, RES_PARATR_ADJUST), xCntxt.get() );
// and push on stack
PushContext( xCntxt );
@@ -4028,7 +4027,7 @@ void SwHTMLParser::NewHeading( HtmlTokenId nToken )
}
if( SvxAdjust::End != m_eParaAdjust )
- InsertAttr( &m_aAttrTab.pAdjust, SvxAdjustItem(m_eParaAdjust, RES_PARATR_ADJUST), xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pAdjust, SvxAdjustItem(m_eParaAdjust, RES_PARATR_ADJUST), xCntxt.get() );
// and push on stack
PushContext(xCntxt);
@@ -4706,10 +4705,10 @@ void SwHTMLParser::SetTextCollAttrs( HTMLAttrContext *pContext )
pItemSet->Put( aLRItem );
else
{
- NewAttr( &m_aAttrTab.pLRSpace, aLRItem );
- m_aAttrTab.pLRSpace->SetLikePara();
- m_aParaAttrs.push_back( m_aAttrTab.pLRSpace );
- EndAttr( m_aAttrTab.pLRSpace, false );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pLRSpace, aLRItem);
+ m_xAttrTab->pLRSpace->SetLikePara();
+ m_aParaAttrs.push_back( m_xAttrTab->pLRSpace );
+ EndAttr( m_xAttrTab->pLRSpace, false );
}
}
@@ -4776,7 +4775,7 @@ void SwHTMLParser::NewCharFormat( HtmlTokenId nToken )
// Character formats are stored in their own stack and can never be inserted
// by styles. Therefore the attribute doesn't exist in CSS1-Which-Range.
if( pCFormat )
- InsertAttr( &m_aAttrTab.pCharFormats, SwFormatCharFormat( pCFormat ), xCntxt.get() );
+ InsertAttr( &m_xAttrTab->pCharFormats, SwFormatCharFormat( pCFormat ), xCntxt.get() );
// save the context
PushContext(xCntxt);
@@ -4910,8 +4909,8 @@ void SwHTMLParser::InsertSpacer()
}
else
{
- NewAttr( &m_aAttrTab.pULSpace, SvxULSpaceItem( 0, (sal_uInt16)nSize, RES_UL_SPACE ) );
- EndAttr( m_aAttrTab.pULSpace, false );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pULSpace, SvxULSpaceItem(0, (sal_uInt16)nSize, RES_UL_SPACE));
+ EndAttr( m_xAttrTab->pULSpace, false );
AppendTextNode(); // Don't change spacing!
}
@@ -4943,15 +4942,15 @@ void SwHTMLParser::InsertSpacer()
aLRItem.SetRight( nRight );
aLRItem.SetTextFirstLineOfst( nIndent );
- NewAttr( &m_aAttrTab.pLRSpace, aLRItem );
- EndAttr( m_aAttrTab.pLRSpace, false );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pLRSpace, aLRItem);
+ EndAttr( m_xAttrTab->pLRSpace, false );
}
else
{
- NewAttr( &m_aAttrTab.pKerning, SvxKerningItem( (short)nSize, RES_CHRATR_KERNING ) );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pKerning, SvxKerningItem( (short)nSize, RES_CHRATR_KERNING ));
OUString aTmp( ' ' );
m_xDoc->getIDocumentContentOperations().InsertString( *m_pPam, aTmp );
- EndAttr( m_aAttrTab.pKerning );
+ EndAttr( m_xAttrTab->pKerning );
}
}
}
@@ -5137,8 +5136,8 @@ void SwHTMLParser::InsertLineBreak()
if( bBreakItem && SvxBreak::PageAfter==aBreakItem.GetBreak() )
{
- NewAttr( &m_aAttrTab.pBreak, aBreakItem );
- EndAttr( m_aAttrTab.pBreak, false );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pBreak, aBreakItem);
+ EndAttr( m_xAttrTab->pBreak, false );
}
if( !bCleared && !bBreakItem )
@@ -5158,8 +5157,8 @@ void SwHTMLParser::InsertLineBreak()
}
if( bBreakItem && SvxBreak::PageBefore==aBreakItem.GetBreak() )
{
- NewAttr( &m_aAttrTab.pBreak, aBreakItem );
- EndAttr( m_aAttrTab.pBreak, false );
+ NewAttr(m_xAttrTab, &m_xAttrTab->pBreak, aBreakItem);
+ EndAttr( m_xAttrTab->pBreak, false );
}
}
@@ -5264,7 +5263,7 @@ void SwHTMLParser::InsertHorzRule()
SvxBoxItem aBoxItem(RES_BOX);
aBoxItem.SetLine( &aBorderLine, SvxBoxItemLine::BOTTOM );
- HTMLAttr* pTmp = new HTMLAttr( *m_pPam->GetPoint(), aBoxItem );
+ HTMLAttr* pTmp = new HTMLAttr(*m_pPam->GetPoint(), aBoxItem, nullptr, std::shared_ptr<HTMLAttrTable>());
m_aSetAttrTab.push_back( pTmp );
}
if( nWidth )
@@ -5304,7 +5303,7 @@ void SwHTMLParser::InsertHorzRule()
break;
}
- HTMLAttr* pTmp = new HTMLAttr( *m_pPam->GetPoint(), aLRItem );
+ HTMLAttr* pTmp = new HTMLAttr(*m_pPam->GetPoint(), aLRItem, nullptr, std::shared_ptr<HTMLAttrTable>());
m_aSetAttrTab.push_back( pTmp );
}
}
@@ -5398,7 +5397,7 @@ void SwHTMLParser::ParseMoreMetaOptions()
}
HTMLAttr::HTMLAttr( const SwPosition& rPos, const SfxPoolItem& rItem,
- HTMLAttr **ppHd ) :
+ HTMLAttr **ppHd, const std::shared_ptr<HTMLAttrTable>& rAttrTab ) :
nSttPara( rPos.nNode ),
nEndPara( rPos.nNode ),
nSttContent( rPos.nContent.GetIndex() ),
@@ -5407,6 +5406,7 @@ HTMLAttr::HTMLAttr( const SwPosition& rPos, const SfxPoolItem& rItem,
bLikePara( false ),
bValid( true ),
pItem( rItem.Clone() ),
+ xAttrTab( rAttrTab ),
pNext( nullptr ),
pPrev( nullptr ),
ppHead( ppHd )
@@ -5414,7 +5414,7 @@ HTMLAttr::HTMLAttr( const SwPosition& rPos, const SfxPoolItem& rItem,
}
HTMLAttr::HTMLAttr( const HTMLAttr &rAttr, const SwNodeIndex &rEndPara,
- sal_Int32 nEndCnt, HTMLAttr **ppHd ) :
+ sal_Int32 nEndCnt, HTMLAttr **ppHd, const std::shared_ptr<HTMLAttrTable>& rAttrTab ) :
nSttPara( rAttr.nSttPara ),
nEndPara( rEndPara ),
nSttContent( rAttr.nSttContent ),
@@ -5423,6 +5423,7 @@ HTMLAttr::HTMLAttr( const HTMLAttr &rAttr, const SwNodeIndex &rEndPara,
bLikePara( rAttr.bLikePara ),
bValid( rAttr.bValid ),
pItem( rAttr.pItem->Clone() ),
+ xAttrTab( rAttrTab ),
pNext( nullptr ),
pPrev( nullptr ),
ppHead( ppHd )
@@ -5436,7 +5437,7 @@ HTMLAttr::~HTMLAttr()
HTMLAttr *HTMLAttr::Clone(const SwNodeIndex& rEndPara, sal_Int32 nEndCnt) const
{
// create the attribute anew with old start position
- HTMLAttr *pNew = new HTMLAttr( *this, rEndPara, nEndCnt, ppHead );
+ HTMLAttr *pNew = new HTMLAttr( *this, rEndPara, nEndCnt, ppHead, xAttrTab );
// The Previous-List must be taken over, the Next-List not!
pNew->pPrev = pPrev;
@@ -5445,7 +5446,7 @@ HTMLAttr *HTMLAttr::Clone(const SwNodeIndex& rEndPara, sal_Int32 nEndCnt) const
}
void HTMLAttr::Reset(const SwNodeIndex& rSttPara, sal_Int32 nSttCnt,
- HTMLAttr **ppHd)
+ HTMLAttr **ppHd, const std::shared_ptr<HTMLAttrTable>& rAttrTab)
{
// reset the start (and the end)
nSttPara = rSttPara;
@@ -5457,6 +5458,7 @@ void HTMLAttr::Reset(const SwNodeIndex& rSttPara, sal_Int32 nSttCnt,
pNext = nullptr;
pPrev = nullptr;
ppHead = ppHd;
+ xAttrTab = rAttrTab;
}
void HTMLAttr::InsertPrev( HTMLAttr *pPrv )
diff --git a/sw/source/filter/html/swhtml.hxx b/sw/source/filter/html/swhtml.hxx
index c02309b7e4c0..198cc2ab739b 100644
--- a/sw/source/filter/html/swhtml.hxx
+++ b/sw/source/filter/html/swhtml.hxx
@@ -72,6 +72,57 @@ extern HTMLOptionEnum<sal_Int16> aHTMLImgVAlignTable[];
class HTMLAttr;
typedef std::deque<HTMLAttr *> HTMLAttrs;
+// Table of attributes: The order here is important: The attributes in the
+// beginning of the table will set first in EndAllAttrs.
+struct HTMLAttrTable
+{
+ HTMLAttr
+ *pKeep, // frame attributes
+ *pBox,
+ *pBrush,
+ *pBreak,
+ *pPageDesc,
+
+ *pLRSpace, // paragraph attributes
+ *pULSpace,
+ *pLineSpacing,
+ *pAdjust,
+ *pDropCap,
+ *pSplit,
+ *pWidows,
+ *pOrphans,
+ *pDirection,
+
+ *pCharFormats, // text attributes
+ *pINetFormat,
+
+ *pBold, // character attributes
+ *pBoldCJK,
+ *pBoldCTL,
+ *pItalic,
+ *pItalicCJK,
+ *pItalicCTL,
+ *pStrike,
+ *pUnderline,
+ *pBlink,
+ *pFont,
+ *pFontCJK,
+ *pFontCTL,
+ *pFontHeight,
+ *pFontHeightCJK,
+ *pFontHeightCTL,
+ *pFontColor,
+ *pEscapement,
+ *pCaseMap,
+ *pKerning, // (only for SPACER)
+ *pCharBrush, // character background
+ *pLanguage,
+ *pLanguageCJK,
+ *pLanguageCTL,
+ *pCharBox
+ ;
+};
+
class HTMLAttr
{
friend class SwHTMLParser;
@@ -84,15 +135,16 @@ class HTMLAttr
bool bValid : 1; // is the attribute valid?
std::unique_ptr<SfxPoolItem> pItem;
+ std::shared_ptr<HTMLAttrTable> xAttrTab;
HTMLAttr *pNext; // still to close attributes with different values
HTMLAttr *pPrev; // already closed but not set attributes
HTMLAttr **ppHead; // list head
HTMLAttr( const SwPosition& rPos, const SfxPoolItem& rItem,
- HTMLAttr **pHd=nullptr );
+ HTMLAttr **pHd, const std::shared_ptr<HTMLAttrTable>& rAttrTab );
HTMLAttr( const HTMLAttr &rAttr, const SwNodeIndex &rEndPara,
- sal_Int32 nEndCnt, HTMLAttr **pHd );
+ sal_Int32 nEndCnt, HTMLAttr **pHd, const std::shared_ptr<HTMLAttrTable>& rAttrTab );
public:
@@ -100,7 +152,7 @@ public:
HTMLAttr *Clone( const SwNodeIndex& rEndPara, sal_Int32 nEndCnt ) const;
void Reset( const SwNodeIndex& rSttPara, sal_Int32 nSttCnt,
- HTMLAttr **pHd );
+ HTMLAttr **pHd, const std::shared_ptr<HTMLAttrTable>& rAttrTab );
inline void SetStart( const SwPosition& rPos );
sal_uInt32 GetSttParaIdx() const { return nSttPara.GetIndex(); }
@@ -125,7 +177,11 @@ public:
void InsertPrev( HTMLAttr *pPrv );
void ClearPrev() { pPrev = nullptr; }
- void SetHead( HTMLAttr **ppHd ) { ppHead = ppHd; }
+ void SetHead(HTMLAttr **ppHd, const std::shared_ptr<HTMLAttrTable>& rAttrTab)
+ {
+ ppHead = ppHd;
+ xAttrTab = rAttrTab;
+ }
// During setting attributes from styles it can happen that these
// shouldn't be set anymore. To delete them would be very expensive, because
@@ -134,57 +190,6 @@ public:
void Invalidate() { bValid = false; }
};
-// Table of attributes: The order here is important: The attributes in the
-// beginning of the table will set first in EndAllAttrs.
-struct HTMLAttrTable
-{
- HTMLAttr
- *pKeep, // frame attributes
- *pBox,
- *pBrush,
- *pBreak,
- *pPageDesc,
-
- *pLRSpace, // paragraph attributes
- *pULSpace,
- *pLineSpacing,
- *pAdjust,
- *pDropCap,
- *pSplit,
- *pWidows,
- *pOrphans,
- *pDirection,
-
- *pCharFormats, // text attributes
- *pINetFormat,
-
- *pBold, // character attributes
- *pBoldCJK,
- *pBoldCTL,
- *pItalic,
- *pItalicCJK,
- *pItalicCTL,
- *pStrike,
- *pUnderline,
- *pBlink,
- *pFont,
- *pFontCJK,
- *pFontCTL,
- *pFontHeight,
- *pFontHeightCJK,
- *pFontHeightCTL,
- *pFontColor,
- *pEscapement,
- *pCaseMap,
- *pKerning, // (only for SPACER)
- *pCharBrush, // character background
- *pLanguage,
- *pLanguageCJK,
- *pLanguageCTL,
- *pCharBox
- ;
-};
-
class HTMLAttrContext_SaveDoc;
enum SwHTMLAppendMode {
@@ -391,7 +396,7 @@ class SwHTMLParser : public SfxHTMLParser, public SwClient
HTMLAttrs m_aSetAttrTab;// "closed", not set attributes
HTMLAttrs m_aParaAttrs; // temporary paragraph attributes
- HTMLAttrTable m_aAttrTab; // "open" attributes
+ std::shared_ptr<HTMLAttrTable> m_xAttrTab; // "open" attributes
HTMLAttrContexts m_aContexts;// the current context of attribute/token
std::vector<SwFrameFormat *> m_aMoveFlyFrames;// Fly-Frames, the anchor is moved
std::deque<sal_Int32> m_aMoveFlyCnts;// and the Content-Positions
@@ -512,15 +517,15 @@ class SwHTMLParser : public SfxHTMLParser, public SwClient
// start/end an attribute
// ppDepAttr indicated an attribute table entry, which attribute has to be
// set, before the attribute is closed
- void NewAttr( HTMLAttr **ppAttr, const SfxPoolItem& rItem );
+ void NewAttr(const std::shared_ptr<HTMLAttrTable>& rAttrTab, HTMLAttr **ppAttr, const SfxPoolItem& rItem);
bool EndAttr( HTMLAttr *pAttr, bool bChkEmpty=true );
void DeleteAttr( HTMLAttr* pAttr );
void EndContextAttrs( HTMLAttrContext *pContext );
- void SaveAttrTab( HTMLAttrTable& rNewAttrTab );
+ void SaveAttrTab(std::shared_ptr<HTMLAttrTable>& rNewAttrTab);
void SplitAttrTab( const SwPosition& rNewPos );
- void SplitAttrTab( HTMLAttrTable& rNewAttrTab, bool bMoveEndBack );
- void RestoreAttrTab( HTMLAttrTable& rNewAttrTab );
+ void SplitAttrTab(std::shared_ptr<HTMLAttrTable>& rNewAttrTab, bool bMoveEndBack);
+ void RestoreAttrTab(std::shared_ptr<HTMLAttrTable>& rNewAttrTab);
void InsertAttr( const SfxPoolItem& rItem, bool bInsAtStart );
void InsertAttrs( HTMLAttrs& rAttrs );
More information about the Libreoffice-commits
mailing list