summaryrefslogtreecommitdiff
path: root/editeng/source/rtf/rtfitem.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'editeng/source/rtf/rtfitem.cxx')
-rw-r--r--editeng/source/rtf/rtfitem.cxx367
1 files changed, 173 insertions, 194 deletions
diff --git a/editeng/source/rtf/rtfitem.cxx b/editeng/source/rtf/rtfitem.cxx
index b6e0a93adee6..63ae0c119974 100644
--- a/editeng/source/rtf/rtfitem.cxx
+++ b/editeng/source/rtf/rtfitem.cxx
@@ -77,37 +77,39 @@ using namespace editeng;
void SvxRTFParser::SetScriptAttr( RTF_CharTypeDef eType, SfxItemSet& rSet,
SfxPoolItem& rItem )
{
- const sal_uInt16 *pNormal = nullptr, *pCJK = nullptr, *pCTL = nullptr;
+ std::optional<sal_uInt16> pNormal;
+ std::optional<sal_uInt16> pCJK;
+ std::optional<sal_uInt16> pCTL;
switch( rItem.Which() )
{
case SID_ATTR_CHAR_FONT:
- pNormal = &aPlainMap.nFont;
- pCJK = &aPlainMap.nCJKFont;
- pCTL = &aPlainMap.nCTLFont;
+ pNormal = aPlainMap[SID_ATTR_CHAR_FONT];
+ pCJK = aPlainMap[SID_ATTR_CHAR_CJK_FONT];
+ pCTL = aPlainMap[SID_ATTR_CHAR_CTL_FONT];
break;
case SID_ATTR_CHAR_FONTHEIGHT:
- pNormal = &aPlainMap.nFontHeight;
- pCJK = &aPlainMap.nCJKFontHeight;
- pCTL = &aPlainMap.nCTLFontHeight;
+ pNormal = aPlainMap[SID_ATTR_CHAR_FONTHEIGHT];
+ pCJK = aPlainMap[SID_ATTR_CHAR_CJK_FONTHEIGHT];
+ pCTL = aPlainMap[SID_ATTR_CHAR_CTL_FONTHEIGHT];
break;
case SID_ATTR_CHAR_POSTURE:
- pNormal = &aPlainMap.nPosture;
- pCJK = &aPlainMap.nCJKPosture;
- pCTL = &aPlainMap.nCTLPosture;
+ pNormal = aPlainMap[SID_ATTR_CHAR_POSTURE];
+ pCJK = aPlainMap[SID_ATTR_CHAR_CJK_POSTURE];
+ pCTL = aPlainMap[SID_ATTR_CHAR_CTL_POSTURE];
break;
case SID_ATTR_CHAR_WEIGHT:
- pNormal = &aPlainMap.nWeight;
- pCJK = &aPlainMap.nCJKWeight;
- pCTL = &aPlainMap.nCTLWeight;
+ pNormal = aPlainMap[SID_ATTR_CHAR_WEIGHT];
+ pCJK = aPlainMap[SID_ATTR_CHAR_CJK_WEIGHT];
+ pCTL = aPlainMap[SID_ATTR_CHAR_CTL_WEIGHT];
break;
case SID_ATTR_CHAR_LANGUAGE:
- pNormal = &aPlainMap.nLanguage;
- pCJK = &aPlainMap.nCJKLanguage;
- pCTL = &aPlainMap.nCTLLanguage;
+ pNormal = aPlainMap[SID_ATTR_CHAR_LANGUAGE];
+ pCJK = aPlainMap[SID_ATTR_CHAR_CJK_LANGUAGE];
+ pCTL = aPlainMap[SID_ATTR_CHAR_CTL_LANGUAGE];
break;
case 0:
@@ -214,7 +216,7 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
if( RTF_PARD == nLastToken || RTF_PLAIN == nLastToken )
break;
- if (pCurrent->aAttrSet.Count() || pCurrent->m_pChildList ||
+ if (pCurrent->aAttrSet.Count() || !pCurrent->maChildList.empty() ||
pCurrent->nStyleNo )
{
// Open a new Group
@@ -267,57 +269,55 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
break;
case RTF_KEEP:
- if( aPardMap.nSplit )
+ if (const TypedWhichId<SvxFormatSplitItem> wid = aPardMap[SID_ATTR_PARA_SPLIT])
{
- pSet->Put( SvxFormatSplitItem( false, aPardMap.nSplit ));
+ pSet->Put(SvxFormatSplitItem(false, wid));
}
break;
case RTF_KEEPN:
- if( aPardMap.nKeep )
+ if (const TypedWhichId<SvxFormatKeepItem> wid = aPardMap[SID_ATTR_PARA_KEEP])
{
- pSet->Put( SvxFormatKeepItem( true, aPardMap.nKeep ));
+ pSet->Put(SvxFormatKeepItem(true, wid));
}
break;
case RTF_LEVEL:
- if( aPardMap.nOutlineLvl )
+ if (const TypedWhichId<SfxInt16Item> wid = aPardMap[SID_ATTR_PARA_OUTLLEVEL])
{
- pSet->Put( SfxInt16Item( aPardMap.nOutlineLvl,
- static_cast<sal_uInt16>(nTokenValue) ));
+ pSet->Put(SfxInt16Item(wid, static_cast<sal_uInt16>(nTokenValue)));
}
break;
case RTF_QL:
- if( aPardMap.nAdjust )
+ if (const TypedWhichId<SvxAdjustItem> wid = aPardMap[SID_ATTR_PARA_ADJUST])
{
- pSet->Put( SvxAdjustItem( SvxAdjust::Left, aPardMap.nAdjust ));
+ pSet->Put(SvxAdjustItem(SvxAdjust::Left, wid));
}
break;
case RTF_QR:
- if( aPardMap.nAdjust )
+ if (const TypedWhichId<SvxAdjustItem> wid = aPardMap[SID_ATTR_PARA_ADJUST])
{
- pSet->Put( SvxAdjustItem( SvxAdjust::Right, aPardMap.nAdjust ));
+ pSet->Put(SvxAdjustItem(SvxAdjust::Right, wid));
}
break;
case RTF_QJ:
- if( aPardMap.nAdjust )
+ if (const TypedWhichId<SvxAdjustItem> wid = aPardMap[SID_ATTR_PARA_ADJUST])
{
- pSet->Put( SvxAdjustItem( SvxAdjust::Block, aPardMap.nAdjust ));
+ pSet->Put(SvxAdjustItem(SvxAdjust::Block, wid));
}
break;
case RTF_QC:
- if( aPardMap.nAdjust )
+ if (const TypedWhichId<SvxAdjustItem> wid = aPardMap[SID_ATTR_PARA_ADJUST])
{
- pSet->Put( SvxAdjustItem( SvxAdjust::Center, aPardMap.nAdjust ));
+ pSet->Put(SvxAdjustItem(SvxAdjust::Center, wid));
}
break;
case RTF_FI:
- if( aPardMap.nLRSpace )
+ if (const TypedWhichId<SvxLRSpaceItem> wid = aPardMap[SID_ATTR_LRSPACE])
{
- SvxLRSpaceItem aLR(
- static_cast<const SvxLRSpaceItem&>(pSet->Get(aPardMap.nLRSpace)));
+ SvxLRSpaceItem aLR(pSet->Get(wid));
sal_uInt16 nSz = 0;
if( -1 != nTokenValue )
{
@@ -332,10 +332,9 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
case RTF_LI:
case RTF_LIN:
- if( aPardMap.nLRSpace )
+ if (const TypedWhichId<SvxLRSpaceItem> wid = aPardMap[SID_ATTR_LRSPACE])
{
- SvxLRSpaceItem aLR(
- static_cast<const SvxLRSpaceItem&>(pSet->Get(aPardMap.nLRSpace)));
+ SvxLRSpaceItem aLR(pSet->Get(wid));
sal_uInt16 nSz = 0;
if( 0 < nTokenValue )
{
@@ -350,10 +349,9 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
case RTF_RI:
case RTF_RIN:
- if( aPardMap.nLRSpace )
+ if (const TypedWhichId<SvxLRSpaceItem> wid = aPardMap[SID_ATTR_LRSPACE])
{
- SvxLRSpaceItem aLR(
- static_cast<const SvxLRSpaceItem&>(pSet->Get(aPardMap.nLRSpace)));
+ SvxLRSpaceItem aLR(pSet->Get(wid));
sal_uInt16 nSz = 0;
if( 0 < nTokenValue )
{
@@ -367,10 +365,9 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
break;
case RTF_SB:
- if( aPardMap.nULSpace )
+ if (const TypedWhichId<SvxULSpaceItem> wid = aPardMap[SID_ATTR_ULSPACE])
{
- SvxULSpaceItem aUL(
- static_cast<const SvxULSpaceItem&>(pSet->Get(aPardMap.nULSpace)));
+ SvxULSpaceItem aUL(pSet->Get(wid));
sal_uInt16 nSz = 0;
if( 0 < nTokenValue )
{
@@ -384,10 +381,9 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
break;
case RTF_SA:
- if( aPardMap.nULSpace )
+ if (const TypedWhichId<SvxULSpaceItem> wid = aPardMap[SID_ATTR_ULSPACE])
{
- SvxULSpaceItem aUL(
- static_cast<const SvxULSpaceItem&>(pSet->Get(aPardMap.nULSpace)));
+ SvxULSpaceItem aUL(pSet->Get(wid));
sal_uInt16 nSz = 0;
if( 0 < nTokenValue )
{
@@ -401,11 +397,11 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
break;
case RTF_SLMULT:
- if( aPardMap.nLinespacing && 1 == nTokenValue )
+ if (const TypedWhichId<SvxLineSpacingItem> wid = aPardMap[SID_ATTR_PARA_LINESPACE];
+ wid && 1 == nTokenValue)
{
// then switches to multi-line!
- SvxLineSpacingItem aLSpace(
- static_cast<const SvxLineSpacingItem&>(pSet->Get( aPardMap.nLinespacing,false)));
+ SvxLineSpacingItem aLSpace(pSet->Get(wid, false));
// how much do you get from the line height value?
@@ -426,12 +422,12 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
break;
case RTF_SL:
- if( aPardMap.nLinespacing )
+ if (const TypedWhichId<SvxLineSpacingItem> wid = aPardMap[SID_ATTR_PARA_LINESPACE])
{
// Calculate the ratio between the default font and the
// specified size. The distance consists of the line height
// (100%) and the space above the line (20%).
- SvxLineSpacingItem aLSpace(0, aPardMap.nLinespacing);
+ SvxLineSpacingItem aLSpace(0, wid);
nTokenValue = !bTokenHasValue ? 0 : nTokenValue;
if (1000 == nTokenValue )
@@ -464,25 +460,22 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
break;
case RTF_NOCWRAP:
- if( aPardMap.nForbRule )
+ if (const TypedWhichId<SvxForbiddenRuleItem> wid = aPardMap[SID_ATTR_PARA_FORBIDDEN_RULES])
{
- pSet->Put( SvxForbiddenRuleItem( false,
- aPardMap.nForbRule ));
+ pSet->Put(SvxForbiddenRuleItem(false, wid));
}
break;
case RTF_NOOVERFLOW:
- if( aPardMap.nHangPunct )
+ if (const TypedWhichId<SvxHangingPunctuationItem> wid = aPardMap[SID_ATTR_PARA_HANGPUNCTUATION])
{
- pSet->Put( SvxHangingPunctuationItem( false,
- aPardMap.nHangPunct ));
+ pSet->Put(SvxHangingPunctuationItem(false, wid));
}
break;
case RTF_ASPALPHA:
- if( aPardMap.nScriptSpace )
+ if (const TypedWhichId<SvxScriptSpaceItem> wid = aPardMap[SID_ATTR_PARA_SCRIPTSPACE])
{
- pSet->Put( SvxScriptSpaceItem( true,
- aPardMap.nScriptSpace ));
+ pSet->Put(SvxScriptSpaceItem(true, wid));
}
break;
@@ -498,10 +491,9 @@ void SvxRTFParser::ReadAttr( int nToken, SfxItemSet* pSet )
case RTF_FAROMAN: nFontAlign = SvxParaVertAlignItem::Align::Baseline;
goto SET_FONTALIGNMENT;
SET_FONTALIGNMENT:
- if( aPardMap.nFontAlign )
+ if (const TypedWhichId<SvxParaVertAlignItem> wid = aPardMap[SID_PARA_VERTALIGN])
{
- pSet->Put( SvxParaVertAlignItem( nFontAlign,
- aPardMap.nFontAlign ));
+ pSet->Put(SvxParaVertAlignItem(nFontAlign, wid));
}
break;
@@ -519,8 +511,8 @@ SET_FONTALIGNMENT:
case RTF_CAPS:
case RTF_SCAPS:
- if( aPlainMap.nCaseMap &&
- IsAttrSttPos() ) // not in the text flow?
+ if (const sal_uInt16 wid = aPlainMap[SID_ATTR_CHAR_CASEMAP];
+ wid && IsAttrSttPos()) // not in the text flow?
{
SvxCaseMap eCaseMap;
if( !nTokenValue )
@@ -530,15 +522,14 @@ SET_FONTALIGNMENT:
else
eCaseMap = SvxCaseMap::SmallCaps;
- pSet->Put( SvxCaseMapItem( eCaseMap, aPlainMap.nCaseMap ));
+ pSet->Put(SvxCaseMapItem(eCaseMap, wid));
}
break;
case RTF_DN:
case RTF_SUB:
- if( aPlainMap.nEscapement )
+ if (const sal_uInt16 nEsc = aPlainMap[SID_ATTR_CHAR_ESCAPEMENT])
{
- const sal_uInt16 nEsc = aPlainMap.nEscapement;
if( -1 == nTokenValue )
nTokenValue = 6; //RTF default \dn value in half-points
if( IsCalcValue() )
@@ -562,15 +553,14 @@ SET_FONTALIGNMENT:
break;
case RTF_NOSUPERSUB:
- if( aPlainMap.nEscapement )
+ if (const sal_uInt16 nEsc = aPlainMap[SID_ATTR_CHAR_ESCAPEMENT])
{
- const sal_uInt16 nEsc = aPlainMap.nEscapement;
pSet->Put( SvxEscapementItem( nEsc ));
}
break;
case RTF_EXPND:
- if( aPlainMap.nKering )
+ if (TypedWhichId<SvxKerningItem> wid = aPlainMap[SID_ATTR_CHAR_KERNING])
{
if( -1 == nTokenValue )
nTokenValue = 0;
@@ -578,12 +568,12 @@ SET_FONTALIGNMENT:
nTokenValue *= 5;
if( IsCalcValue() )
CalcValue();
- pSet->Put( SvxKerningItem( static_cast<short>(nTokenValue), aPlainMap.nKering ));
+ pSet->Put(SvxKerningItem(static_cast<short>(nTokenValue), wid));
}
break;
case RTF_KERNING:
- if( aPlainMap.nAutoKerning )
+ if (const TypedWhichId<SvxAutoKernItem> wid = aPlainMap[SID_ATTR_CHAR_AUTOKERN])
{
if( -1 == nTokenValue )
nTokenValue = 0;
@@ -591,19 +581,18 @@ SET_FONTALIGNMENT:
nTokenValue *= 10;
if( IsCalcValue() )
CalcValue();
- pSet->Put( SvxAutoKernItem( 0 != nTokenValue,
- aPlainMap.nAutoKerning ));
+ pSet->Put(SvxAutoKernItem(0 != nTokenValue, wid));
}
break;
case RTF_EXPNDTW:
- if( aPlainMap.nKering )
+ if (TypedWhichId<SvxKerningItem> wid = aPlainMap[SID_ATTR_CHAR_KERNING])
{
if( -1 == nTokenValue )
nTokenValue = 0;
if( IsCalcValue() )
CalcValue();
- pSet->Put( SvxKerningItem( static_cast<short>(nTokenValue), aPlainMap.nKering ));
+ pSet->Put(SvxKerningItem(static_cast<short>(nTokenValue), wid));
}
break;
@@ -656,39 +645,37 @@ SET_FONTALIGNMENT:
break;
case RTF_OUTL:
- if( aPlainMap.nContour &&
- IsAttrSttPos() ) // not in the text flow?
+ if (const TypedWhichId<SvxContourItem> wid = aPlainMap[SID_ATTR_CHAR_CONTOUR];
+ wid && IsAttrSttPos()) // not in the text flow?
{
- pSet->Put( SvxContourItem(nTokenValue != 0,
- aPlainMap.nContour ));
+ pSet->Put(SvxContourItem(nTokenValue != 0, wid));
}
break;
case RTF_SHAD:
- if( aPlainMap.nShadowed &&
- IsAttrSttPos() ) // not in the text flow?
+ if (const TypedWhichId<SvxShadowedItem> wid = aPlainMap[SID_ATTR_CHAR_SHADOWED];
+ wid && IsAttrSttPos()) // not in the text flow?
{
- pSet->Put( SvxShadowedItem(nTokenValue != 0,
- aPlainMap.nShadowed ));
+ pSet->Put(SvxShadowedItem(nTokenValue != 0, wid));
}
break;
case RTF_STRIKE:
- if( aPlainMap.nCrossedOut &&
- IsAttrSttPos() ) // not in the text flow?
+ if (const TypedWhichId<SvxCrossedOutItem> wid = aPlainMap[SID_ATTR_CHAR_STRIKEOUT];
+ wid && IsAttrSttPos()) // not in the text flow?
{
pSet->Put( SvxCrossedOutItem(
nTokenValue ? STRIKEOUT_SINGLE : STRIKEOUT_NONE,
- aPlainMap.nCrossedOut ));
+ wid ));
}
break;
case RTF_STRIKED:
- if( aPlainMap.nCrossedOut ) // not in the text flow?
+ if (const TypedWhichId<SvxCrossedOutItem> wid = aPlainMap[SID_ATTR_CHAR_STRIKEOUT]) // not in the text flow?
{
pSet->Put( SvxCrossedOutItem(
nTokenValue ? STRIKEOUT_DOUBLE : STRIKEOUT_NONE,
- aPlainMap.nCrossedOut ));
+ wid ));
}
break;
@@ -750,26 +737,26 @@ SET_FONTALIGNMENT:
case RTF_ULW:
eUnderline = LINESTYLE_SINGLE;
- if( aPlainMap.nWordlineMode )
+ if (const TypedWhichId<SvxWordLineModeItem> wid = aPlainMap[SID_ATTR_CHAR_WORDLINEMODE])
{
- pSet->Put( SvxWordLineModeItem( true, aPlainMap.nWordlineMode ));
+ pSet->Put(SvxWordLineModeItem(true, wid));
}
goto ATTR_SETUNDERLINE;
ATTR_SETUNDERLINE:
- if( aPlainMap.nUnderline )
+ if (const sal_uInt16 wid = aPlainMap[SID_ATTR_CHAR_UNDERLINE])
{
- pSet->Put( SvxUnderlineItem( eUnderline, aPlainMap.nUnderline ));
+ pSet->Put(SvxUnderlineItem(eUnderline, wid));
}
break;
case RTF_ULC:
- if( aPlainMap.nUnderline )
+ if (const sal_uInt16 wid = aPlainMap[SID_ATTR_CHAR_UNDERLINE])
{
- std::unique_ptr<SvxUnderlineItem> aUL(std::make_unique<SvxUnderlineItem>(LINESTYLE_SINGLE, aPlainMap.nUnderline));
+ std::unique_ptr<SvxUnderlineItem> aUL(std::make_unique<SvxUnderlineItem>(LINESTYLE_SINGLE, wid));
const SfxPoolItem* pItem(nullptr);
- if( SfxItemState::SET == pSet->GetItemState(aPlainMap.nUnderline, false, &pItem ) )
+ if (SfxItemState::SET == pSet->GetItemState(wid, false, &pItem))
{
// is switched off ?
if( LINESTYLE_NONE == static_cast<const SvxUnderlineItem*>(pItem)->GetLineStyle() )
@@ -779,7 +766,7 @@ ATTR_SETUNDERLINE:
}
else
{
- aUL.reset(static_cast<SvxUnderlineItem*>(pSet->Get( aPlainMap.nUnderline, false).Clone()));
+ aUL.reset(static_cast<SvxUnderlineItem*>(pSet->Get(wid, false).Clone()));
}
if(LINESTYLE_NONE == aUL->GetLineStyle())
@@ -789,7 +776,7 @@ ATTR_SETUNDERLINE:
aUL->SetColor(GetColor(sal_uInt16(nTokenValue)));
- pSet->Put(*aUL);
+ pSet->Put(std::move(aUL));
}
break;
@@ -851,26 +838,26 @@ ATTR_SETUNDERLINE:
case RTF_OLW:
eOverline = LINESTYLE_SINGLE;
- if( aPlainMap.nWordlineMode )
+ if (const TypedWhichId<SvxWordLineModeItem> wid = aPlainMap[SID_ATTR_CHAR_WORDLINEMODE])
{
- pSet->Put( SvxWordLineModeItem( true, aPlainMap.nWordlineMode ));
+ pSet->Put(SvxWordLineModeItem(true, wid));
}
goto ATTR_SETOVERLINE;
ATTR_SETOVERLINE:
- if( aPlainMap.nUnderline )
+ if (const TypedWhichId<SvxOverlineItem> wid = aPlainMap[SID_ATTR_CHAR_OVERLINE])
{
- pSet->Put( SvxOverlineItem( eOverline, aPlainMap.nOverline ));
+ pSet->Put(SvxOverlineItem(eOverline, wid));
}
break;
case RTF_OLC:
- if( aPlainMap.nOverline )
+ if (const TypedWhichId<SvxOverlineItem> wid = aPlainMap[SID_ATTR_CHAR_OVERLINE])
{
- std::unique_ptr<SvxOverlineItem> aOL(std::make_unique<SvxOverlineItem>(LINESTYLE_SINGLE, aPlainMap.nOverline));
+ std::unique_ptr<SvxOverlineItem> aOL(std::make_unique<SvxOverlineItem>(LINESTYLE_SINGLE, wid));
const SfxPoolItem* pItem(nullptr);
- if( SfxItemState::SET == pSet->GetItemState(aPlainMap.nOverline, false, &pItem ) )
+ if (SfxItemState::SET == pSet->GetItemState(wid, false, &pItem))
{
// is switched off ?
if( LINESTYLE_NONE == static_cast<const SvxOverlineItem*>(pItem)->GetLineStyle() )
@@ -880,7 +867,7 @@ ATTR_SETOVERLINE:
}
else
{
- aOL.reset(static_cast<SvxOverlineItem*>(pSet->Get( aPlainMap.nOverline, false).Clone()));
+ aOL.reset(pSet->Get(wid, false).Clone());
}
if(LINESTYLE_NONE == aOL->GetLineStyle())
@@ -890,15 +877,14 @@ ATTR_SETOVERLINE:
aOL->SetColor(GetColor(sal_uInt16(nTokenValue)));
- pSet->Put(*aOL);
+ pSet->Put(std::move(aOL));
}
break;
case RTF_UP:
case RTF_SUPER:
- if( aPlainMap.nEscapement )
+ if (const sal_uInt16 nEsc = aPlainMap[SID_ATTR_CHAR_ESCAPEMENT])
{
- const sal_uInt16 nEsc = aPlainMap.nEscapement;
if( -1 == nTokenValue )
nTokenValue = 6; //RTF default \up value in half-points
if( IsCalcValue() )
@@ -922,37 +908,33 @@ ATTR_SETOVERLINE:
break;
case RTF_CF:
- if( aPlainMap.nColor )
+ if (const sal_uInt16 wid = aPlainMap[SID_ATTR_CHAR_COLOR])
{
- pSet->Put( SvxColorItem( GetColor( sal_uInt16(nTokenValue) ),
- aPlainMap.nColor ));
+ pSet->Put(SvxColorItem(GetColor(sal_uInt16(nTokenValue)), wid));
}
break;
//#i12501# While cb is clearly documented in the rtf spec, word
//doesn't accept it at all
#if 0
case RTF_CB:
- if( aPlainMap.nBgColor )
+ if (const sal_uInt16 wid = aPlainMap[SID_ATTR_BRUSH_CHAR])
{
- pSet->Put( SvxBrushItem( GetColor( sal_uInt16(nTokenValue) ),
- aPlainMap.nBgColor ));
+ pSet->Put(SvxBrushItem(GetColor(sal_uInt16(nTokenValue)), wid));
}
break;
#endif
case RTF_LANG:
- if( aPlainMap.nLanguage )
+ if (const sal_uInt16 wid = aPlainMap[SID_ATTR_CHAR_LANGUAGE])
{
- pSet->Put( SvxLanguageItem( LanguageType(nTokenValue),
- aPlainMap.nLanguage ));
+ pSet->Put(SvxLanguageItem(LanguageType(nTokenValue), wid));
}
break;
case RTF_LANGFE:
- if( aPlainMap.nCJKLanguage )
+ if (const sal_uInt16 wid = aPlainMap[SID_ATTR_CHAR_CJK_LANGUAGE])
{
- pSet->Put( SvxLanguageItem( LanguageType(nTokenValue),
- aPlainMap.nCJKLanguage ));
+ pSet->Put(SvxLanguageItem(LanguageType(nTokenValue), wid));
}
break;
case RTF_ALANG:
@@ -970,17 +952,15 @@ ATTR_SETOVERLINE:
bIsLeftToRightDef = true;
break;
case RTF_RTLPAR:
- if (aPardMap.nDirection)
+ if (const TypedWhichId<SvxFrameDirectionItem> wid = aPardMap[SID_ATTR_FRAMEDIRECTION])
{
- pSet->Put(SvxFrameDirectionItem(SvxFrameDirection::Horizontal_RL_TB,
- aPardMap.nDirection));
+ pSet->Put(SvxFrameDirectionItem(SvxFrameDirection::Horizontal_RL_TB, wid));
}
break;
case RTF_LTRPAR:
- if (aPardMap.nDirection)
+ if (const TypedWhichId<SvxFrameDirectionItem> wid = aPardMap[SID_ATTR_FRAMEDIRECTION])
{
- pSet->Put(SvxFrameDirectionItem(SvxFrameDirection::Horizontal_LR_TB,
- aPardMap.nDirection));
+ pSet->Put(SvxFrameDirectionItem(SvxFrameDirection::Horizontal_LR_TB, wid));
}
break;
case RTF_LOCH: eCharType = LOW_CHARTYPE; break;
@@ -998,15 +978,14 @@ ATTR_SETOVERLINE:
case RTF_ACCCOMMA:
eEmphasis = (FontEmphasisMark::Accent | FontEmphasisMark::PosAbove);
ATTR_SETEMPHASIS:
- if( aPlainMap.nEmphasis )
+ if (const TypedWhichId<SvxEmphasisMarkItem> wid = aPlainMap[SID_ATTR_CHAR_EMPHASISMARK])
{
- pSet->Put( SvxEmphasisMarkItem( eEmphasis,
- aPlainMap.nEmphasis ));
+ pSet->Put(SvxEmphasisMarkItem(eEmphasis, wid));
}
break;
case RTF_TWOINONE:
- if( aPlainMap.nTwoLines )
+ if (const TypedWhichId<SvxTwoLinesItem> wid = aPlainMap[SID_ATTR_CHAR_TWO_LINES])
{
sal_Unicode cStt, cEnd;
switch ( nTokenValue )
@@ -1018,50 +997,44 @@ ATTR_SETEMPHASIS:
default: cStt = 0; cEnd = 0; break;
}
- pSet->Put( SvxTwoLinesItem( true, cStt, cEnd,
- aPlainMap.nTwoLines ));
+ pSet->Put(SvxTwoLinesItem(true, cStt, cEnd, wid));
}
break;
case RTF_CHARSCALEX :
- if (aPlainMap.nCharScaleX)
+ if (const TypedWhichId<SvxCharScaleWidthItem> wid = aPlainMap[SID_ATTR_CHAR_SCALEWIDTH])
{
//i21372
if (nTokenValue < 1 || nTokenValue > 600)
nTokenValue = 100;
- pSet->Put( SvxCharScaleWidthItem( sal_uInt16(nTokenValue),
- aPlainMap.nCharScaleX ));
+ pSet->Put(SvxCharScaleWidthItem(sal_uInt16(nTokenValue), wid));
}
break;
case RTF_HORZVERT:
- if( aPlainMap.nHorzVert )
+ if (const TypedWhichId<SvxCharRotateItem> wid = aPlainMap[SID_ATTR_CHAR_ROTATED])
{
// RTF knows only 90deg
- pSet->Put( SvxCharRotateItem( 900_deg10, 1 == nTokenValue,
- aPlainMap.nHorzVert ));
+ pSet->Put(SvxCharRotateItem(900_deg10, 1 == nTokenValue, wid));
}
break;
case RTF_EMBO:
- if (aPlainMap.nRelief)
+ if (const TypedWhichId<SvxCharReliefItem> wid = aPlainMap[SID_ATTR_CHAR_RELIEF])
{
- pSet->Put(SvxCharReliefItem(FontRelief::Embossed,
- aPlainMap.nRelief));
+ pSet->Put(SvxCharReliefItem(FontRelief::Embossed, wid));
}
break;
case RTF_IMPR:
- if (aPlainMap.nRelief)
+ if (const TypedWhichId<SvxCharReliefItem> wid = aPlainMap[SID_ATTR_CHAR_RELIEF])
{
- pSet->Put(SvxCharReliefItem(FontRelief::Engraved,
- aPlainMap.nRelief));
+ pSet->Put(SvxCharReliefItem(FontRelief::Engraved, wid));
}
break;
case RTF_V:
- if (aPlainMap.nHidden)
+ if (const TypedWhichId<SvxCharHiddenItem> wid = aPlainMap[SID_ATTR_CHAR_HIDDEN])
{
- pSet->Put(SvxCharHiddenItem(nTokenValue != 0,
- aPlainMap.nHidden));
+ pSet->Put(SvxCharHiddenItem(nTokenValue != 0, wid));
}
break;
case RTF_CHBGFDIAG:
@@ -1079,7 +1052,7 @@ ATTR_SETEMPHASIS:
case RTF_CHCBPAT:
case RTF_CHCFPAT:
case RTF_CHSHDNG:
- if( aPlainMap.nBgColor )
+ if (aPlainMap[SID_ATTR_BRUSH_CHAR])
ReadBackgroundAttr( nToken, *pSet );
break;
@@ -1111,9 +1084,8 @@ ATTR_SETEMPHASIS:
// Recognize own auto-flags!
nEsc = DFLT_ESC_AUTO_SUPER;
- if( aPlainMap.nEscapement )
- pSet->Put( SvxEscapementItem( nEsc, nProp,
- aPlainMap.nEscapement ));
+ if (const sal_uInt16 wid = aPlainMap[SID_ATTR_CHAR_ESCAPEMENT])
+ pSet->Put(SvxEscapementItem(nEsc, nProp, wid));
}
break;
@@ -1121,10 +1093,10 @@ ATTR_SETEMPHASIS:
{
SvxHyphenZoneItem aHypenZone(
(nTokenValue & 1) != 0,
- aPardMap.nHyphenzone );
+ aPardMap[SID_ATTR_PARA_HYPHENZONE]);
aHypenZone.SetPageEnd((nTokenValue & 2) != 0);
- if( aPardMap.nHyphenzone &&
+ if( aPardMap[SID_ATTR_PARA_HYPHENZONE] &&
RTF_HYPHLEAD == GetNextToken() &&
RTF_HYPHTRAIL == GetNextToken() &&
RTF_HYPHMAX == GetNextToken() )
@@ -1143,6 +1115,16 @@ ATTR_SETEMPHASIS:
}
break;
+ // We expect these to be preceded by a RTF_HYPHEN and
+ // so normally are handled by the RTF_HYPHEN case, but
+ // if they appear 'bare' in a document then safely skip
+ // them here
+ case RTF_HYPHLEAD:
+ case RTF_HYPHTRAIL:
+ case RTF_HYPHMAX:
+ SkipGroup();
+ break;
+
case RTF_SHADOW:
{
bool bSkip = true;
@@ -1164,9 +1146,8 @@ ATTR_SETEMPHASIS:
Color aColor = GetColor( nCol );
- if( aPardMap.nShadow )
- pSet->Put( SvxShadowItem( aPardMap.nShadow,
- &aColor, nDist, eSL ) );
+ if (const TypedWhichId<SvxShadowItem> wid = aPardMap[SID_ATTR_BORDER_SHADOW])
+ pSet->Put(SvxShadowItem(wid, &aColor, nDist, eSL));
bSkip = false;
} while( false );
@@ -1266,7 +1247,7 @@ void SvxRTFParser::ReadTabAttr( int nToken, SfxItemSet& rSet )
bool bMethodOwnsToken = false; // #i52542# patch from cmc.
// then read all the TabStops
SvxTabStop aTabStop;
- SvxTabStopItem aAttr( 0, 0, SvxTabAdjust::Default, aPardMap.nTabStop );
+ SvxTabStopItem aAttr(0, 0, SvxTabAdjust::Default, aPardMap[SID_ATTR_TABSTOP]);
bool bContinue = true;
do {
switch( nToken )
@@ -1372,15 +1353,15 @@ void SvxRTFParser::ReadBorderAttr( int nToken, SfxItemSet& rSet,
bool bTableDef )
{
// then read the border attribute
- std::unique_ptr<SvxBoxItem> aAttr(std::make_unique<SvxBoxItem>(aPardMap.nBox));
+ std::unique_ptr<SvxBoxItem> aAttr(std::make_unique<SvxBoxItem>(aPardMap[SID_ATTR_BORDER_OUTER]));
const SfxPoolItem* pItem(nullptr);
- if( SfxItemState::SET == rSet.GetItemState( aPardMap.nBox, false, &pItem ) )
+ if (SfxItemState::SET == rSet.GetItemState(aPardMap[SID_ATTR_BORDER_OUTER], false, &pItem))
{
aAttr.reset(static_cast<SvxBoxItem*>(pItem->Clone()));
}
- SvxBorderLine aBrd( nullptr, DEF_LINE_WIDTH_0 ); // Simple plain line
+ SvxBorderLine aBrd( nullptr, SvxBorderLineWidth::Hairline );
bool bContinue = true;
int nBorderTyp = 0;
@@ -1448,7 +1429,7 @@ void SvxRTFParser::ReadBorderAttr( int nToken, SfxItemSet& rSet,
case RTF_BRDRHAIR: // hairline border
{
aBrd.SetBorderLineStyle( SvxBorderLineStyle::SOLID);
- aBrd.SetWidth( DEF_LINE_WIDTH_0 );
+ aBrd.SetWidth( SvxBorderLineWidth::Hairline );
}
break;
case RTF_BRDRDB: // Double border
@@ -1500,7 +1481,7 @@ void SvxRTFParser::ReadBorderAttr( int nToken, SfxItemSet& rSet,
break;
case RTF_BRDRSH: // Shadowed border
- rSet.Put( SvxShadowItem( aPardMap.nShadow, nullptr, 60 /*3pt*/,
+ rSet.Put( SvxShadowItem( aPardMap[SID_ATTR_BORDER_SHADOW], nullptr, 60 /*3pt*/,
SvxShadowLocation::BottomRight ) );
break;
@@ -1549,7 +1530,7 @@ void SvxRTFParser::ReadBorderAttr( int nToken, SfxItemSet& rSet,
SetBorderLine( nBorderTyp, *aAttr, aBrd );
- rSet.Put( *aAttr );
+ rSet.Put( std::move(aAttr) );
SkipToken();
}
@@ -1569,8 +1550,8 @@ void SvxRTFParser::ReadBackgroundAttr( int nToken, SfxItemSet& rSet,
sal_uInt8 nFillValue = 0;
sal_uInt16 nWh = ( nToken & ~0xff ) == RTF_CHRFMT
- ? aPlainMap.nBgColor
- : aPardMap.nBrush;
+ ? aPlainMap[SID_ATTR_BRUSH_CHAR]
+ : aPardMap[SID_ATTR_BRUSH];
do {
switch( nToken )
@@ -1700,7 +1681,7 @@ void SvxRTFParser::RTFPardPlain( bool const bPard, SfxItemSet** ppSet )
RTF_PLAIN != nLastToken &&
BRACELEFT != nLastToken )
{
- if (pCurrent->aAttrSet.Count() || pCurrent->m_pChildList || pCurrent->nStyleNo)
+ if (pCurrent->aAttrSet.Count() || !pCurrent->maChildList.empty() || pCurrent->nStyleNo)
{
// open a new group
auto xNew(std::make_unique<SvxRTFItemStackType>(*pCurrent, *mxInsertPosition, true));
@@ -1726,49 +1707,48 @@ void SvxRTFParser::RTFPardPlain( bool const bPard, SfxItemSet** ppSet )
( pCurrent->aAttrSet.GetParent() || pCurrent->aAttrSet.Count() ))
{
const SfxPoolItem *pItem, *pDef;
- const sal_uInt16* pPtr;
- sal_uInt16 nCnt;
+ std::map<sal_uInt16, sal_uInt16>::const_iterator aIt;
+ std::map<sal_uInt16, sal_uInt16>::const_iterator aEnd;
const SfxItemSet* pDfltSet = &GetRTFDefaults();
if( bPard )
{
pCurrent->nStyleNo = 0;
- pPtr = reinterpret_cast<sal_uInt16*>(&aPardMap);
- nCnt = sizeof(aPardMap) / sizeof(sal_uInt16);
+ aIt = aPardMap.data.begin();
+ aEnd = aPardMap.data.end();
}
else
{
- pPtr = reinterpret_cast<sal_uInt16*>(&aPlainMap);
- nCnt = sizeof(aPlainMap) / sizeof(sal_uInt16);
+ aIt = aPlainMap.data.begin();
+ aEnd = aPlainMap.data.end();
}
- for( sal_uInt16 n = 0; n < nCnt; ++n, ++pPtr )
+ for (; aIt != aEnd; ++aIt)
{
+ const sal_uInt16 wid = aIt->second;
// Item set and different -> Set the Default Pool
- if( !*pPtr )
+ if (!wid)
;
- else if (SfxItemPool::IsSlot(*pPtr))
- pCurrent->aAttrSet.ClearItem( *pPtr );
+ else if (SfxItemPool::IsSlot(wid))
+ pCurrent->aAttrSet.ClearItem(wid);
else if( IsChkStyleAttr() )
- pCurrent->aAttrSet.Put( pDfltSet->Get( *pPtr ) );
+ pCurrent->aAttrSet.Put(pDfltSet->Get(wid));
else if( !pCurrent->aAttrSet.GetParent() )
{
- if( SfxItemState::SET ==
- pDfltSet->GetItemState( *pPtr, false, &pDef ))
+ if (SfxItemState::SET == pDfltSet->GetItemState(wid, false, &pDef))
pCurrent->aAttrSet.Put( *pDef );
else
- pCurrent->aAttrSet.ClearItem( *pPtr );
+ pCurrent->aAttrSet.ClearItem(wid);
}
else if( SfxItemState::SET == pCurrent->aAttrSet.GetParent()->
- GetItemState( *pPtr, true, &pItem ) &&
- *( pDef = &pDfltSet->Get( *pPtr )) != *pItem )
+ GetItemState(wid, true, &pItem) &&
+ *( pDef = &pDfltSet->Get(wid)) != *pItem )
pCurrent->aAttrSet.Put( *pDef );
else
{
- if( SfxItemState::SET ==
- pDfltSet->GetItemState( *pPtr, false, &pDef ))
+ if (SfxItemState::SET == pDfltSet->GetItemState(wid, false, &pDef))
pCurrent->aAttrSet.Put( *pDef );
else
- pCurrent->aAttrSet.ClearItem( *pPtr );
+ pCurrent->aAttrSet.ClearItem(wid);
}
}
}
@@ -1797,7 +1777,7 @@ void SvxRTFParser::SetDefault( int nToken, int nValue )
if( !bNewDoc )
return;
- SfxItemSet aTmp( *pAttrPool, aWhichMap.data() );
+ SfxItemSet aTmp(*pAttrPool, aWhichMap);
bool bOldFlag = bIsLeftToRightDef;
bIsLeftToRightDef = true;
switch( nToken )
@@ -1831,7 +1811,7 @@ void SvxRTFParser::SetDefault( int nToken, int nValue )
break;
case RTF_DEFTAB:
- if( aPardMap.nTabStop )
+ if (const sal_uInt16 wid = aPardMap[SID_ATTR_TABSTOP])
{
// RTF defines 720 twips as default
bIsSetDfltTab = true;
@@ -1858,12 +1838,11 @@ void SvxRTFParser::SetDefault( int nToken, int nValue )
nTabCount = 1;
// we want Defaulttabs
- SvxTabStopItem aNewTab( nTabCount, sal_uInt16(nValue),
- SvxTabAdjust::Default, aPardMap.nTabStop );
+ SvxTabStopItem aNewTab(nTabCount, sal_uInt16(nValue), SvxTabAdjust::Default, wid);
while( nTabCount )
const_cast<SvxTabStop&>(aNewTab[ --nTabCount ]).GetAdjustment() = SvxTabAdjust::Default;
- pAttrPool->SetPoolDefaultItem( aNewTab );
+ pAttrPool->SetUserDefaultItem( aNewTab );
}
break;
}
@@ -1875,7 +1854,7 @@ void SvxRTFParser::SetDefault( int nToken, int nValue )
const SfxPoolItem* pItem = aIter.GetCurItem();
do
{
- pAttrPool->SetPoolDefaultItem( *pItem );
+ pAttrPool->SetUserDefaultItem( *pItem );
pItem = aIter.NextItem();
} while (pItem);
}