fdo#81502: sw: fix spurious "[" being painted for field marks

There is a special SwFieldMarkPortion sub-class that is supposed to be
created for these, which overrides Paint() to do nothing; unfortunately
at least for the CH_TXT_ATR_FIELDSTART at beginning of a paragraph
a plain SwTxtPortion is created, because the check of rInf.Len() is
checking the length of the _previous_ text portion; the call to
rInf.SetLen() only happens after creation, in last line of
SwTxtFormatter::NewTxtPortion().

This problem affects RTF and DOCX files since commit
c6b99eedda.

Change-Id: I447b21e841d22558d689f0f244d811c32e4923ec
This commit is contained in:
Michael Stahl
2014-07-24 23:02:12 +02:00
parent 678ad50a5e
commit c3916303eb
2 changed files with 31 additions and 32 deletions

View File

@@ -870,13 +870,11 @@ SwTxtPortion *SwTxtFormatter::WhichTxtPor( SwTxtFormatInfo &rInf ) const
// Only at the End!
// If pCurr does not have a width, it can however aready have content.
// E.g. for non-displayable characters
if( rInf.GetLen() > 0 )
{
if( rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FIELDSTART )
if (rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FIELDSTART)
pPor = new SwFieldMarkPortion();
else if( rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FIELDEND )
else if (rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FIELDEND)
pPor = new SwFieldMarkPortion();
else if( rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FORMELEMENT )
else if (rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FORMELEMENT)
{
SwTxtNode *pNd = const_cast<SwTxtNode *>(rInf.GetTxtFrm()->GetTxtNode());
const SwDoc *doc = pNd->GetDoc();
@@ -907,7 +905,6 @@ SwTxtPortion *SwTxtFormatter::WhichTxtPor( SwTxtFormatInfo &rInf ) const
}
}
}
}
if( !pPor )
{
if( !rInf.X() && !pCurr->GetPortion() && !pCurr->GetLen() && !GetFnt()->IsURL() )

View File

@@ -517,12 +517,14 @@ void SwTxtPortion::Paint( const SwTxtPaintInfo &rInf ) const
{
if (rInf.OnWin() && 1==rInf.GetLen() && CH_TXT_ATR_FIELDEND==rInf.GetTxt()[rInf.GetIdx()])
{
assert(false); // this is some debugging only code
rInf.DrawBackBrush( *this );
const OUString aTxt(CH_TXT_ATR_SUBST_FIELDEND);
rInf.DrawText( aTxt, *this, 0, aTxt.getLength(), false );
}
else if (rInf.OnWin() && 1==rInf.GetLen() && CH_TXT_ATR_FIELDSTART==rInf.GetTxt()[rInf.GetIdx()])
{
assert(false); // this is some debugging only code
rInf.DrawBackBrush( *this );
const OUString aTxt(CH_TXT_ATR_SUBST_FIELDSTART);
rInf.DrawText( aTxt, *this, 0, aTxt.getLength(), false );