[Libreoffice-commits] core.git: sw/source

Michael Stahl mstahl at redhat.com
Thu Jul 24 14:30:24 PDT 2014


 sw/source/core/text/itrform2.cxx |   61 ++++++++++++++++++---------------------
 sw/source/core/text/portxt.cxx   |    2 +
 2 files changed, 31 insertions(+), 32 deletions(-)

New commits:
commit c3916303ebe63f9910cd2a4a38ac6a8d6ccee3e0
Author: Michael Stahl <mstahl at redhat.com>
Date:   Thu Jul 24 23:02:12 2014 +0200

    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

diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx
index 537e163..f116565 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 60db276..bf5cb99 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 );


More information about the Libreoffice-commits mailing list