diff options
author | Michael Stahl <mstahl@redhat.com> | 2014-07-24 23:02:12 +0200 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2014-07-24 23:24:04 +0200 |
commit | c3916303ebe63f9910cd2a4a38ac6a8d6ccee3e0 (patch) | |
tree | d3ae2bb55d6ad1a5a203f9f0233033f256d493a5 | |
parent | 678ad50a5eaf2b8826e7f8b0f34eb3229559d4ec (diff) |
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
c6b99eedda03461202f9bf012a422dfd81da72ec.
Change-Id: I447b21e841d22558d689f0f244d811c32e4923ec
-rw-r--r-- | sw/source/core/text/itrform2.cxx | 61 | ||||
-rw-r--r-- | sw/source/core/text/portxt.cxx | 2 |
2 files changed, 31 insertions, 32 deletions
diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx index 537e1632ee44..f1165656522b 100644 --- a/sw/source/core/text/itrform2.cxx +++ b/sw/source/core/text/itrform2.cxx @@ -870,41 +870,38 @@ 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) + pPor = new SwFieldMarkPortion(); + else if (rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FIELDEND) + pPor = new SwFieldMarkPortion(); + else if (rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FORMELEMENT) { - if( rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FIELDSTART ) - pPor = new SwFieldMarkPortion(); - else if( rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FIELDEND ) - pPor = new SwFieldMarkPortion(); - else if( rInf.GetTxt()[rInf.GetIdx()]==CH_TXT_ATR_FORMELEMENT ) + SwTxtNode *pNd = const_cast<SwTxtNode *>(rInf.GetTxtFrm()->GetTxtNode()); + const SwDoc *doc = pNd->GetDoc(); + SwIndex aIndex(pNd, rInf.GetIdx()); + SwPosition aPosition(*pNd, aIndex); + sw::mark::IFieldmark *pBM = doc->getIDocumentMarkAccess()->getFieldmarkFor(aPosition); + OSL_ENSURE(pBM != NULL, "Where is my form field bookmark???"); + if (pBM != NULL) { - SwTxtNode *pNd = const_cast<SwTxtNode *>(rInf.GetTxtFrm()->GetTxtNode()); - const SwDoc *doc = pNd->GetDoc(); - SwIndex aIndex(pNd, rInf.GetIdx()); - SwPosition aPosition(*pNd, aIndex); - sw::mark::IFieldmark *pBM = doc->getIDocumentMarkAccess()->getFieldmarkFor(aPosition); - OSL_ENSURE(pBM != NULL, "Where is my form field bookmark???"); - if (pBM != NULL) + if (pBM->GetFieldname( ) == ODF_FORMCHECKBOX) { - if (pBM->GetFieldname( ) == ODF_FORMCHECKBOX) - { - pPor = new SwFieldFormCheckboxPortion(); - } - else if (pBM->GetFieldname( ) == ODF_FORMDROPDOWN) - { - pPor = new SwFieldFormDropDownPortion(sw::mark::ExpandFieldmark(pBM)); - } - /* we need to check for ODF_FORMTEXT for scenario having FormFields inside FORMTEXT. - * Otherwise file will crash on open. - */ - else if (pBM->GetFieldname( ) == ODF_FORMTEXT) - { - pPor = new SwFieldMarkPortion(); - } - else - { - assert( false ); // unknown type... - } + pPor = new SwFieldFormCheckboxPortion(); + } + else if (pBM->GetFieldname( ) == ODF_FORMDROPDOWN) + { + pPor = new SwFieldFormDropDownPortion(sw::mark::ExpandFieldmark(pBM)); + } + /* we need to check for ODF_FORMTEXT for scenario having FormFields inside FORMTEXT. + * Otherwise file will crash on open. + */ + else if (pBM->GetFieldname( ) == ODF_FORMTEXT) + { + pPor = new SwFieldMarkPortion(); + } + else + { + assert( false ); // unknown type... } } } diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx index 60db2763a473..bf5cb992fee1 100644 --- a/sw/source/core/text/portxt.cxx +++ b/sw/source/core/text/portxt.cxx @@ -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 ); |