Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


Hi Troy,

Your patch looks good to me, but it seems the bug number is wrong in the
title: isn't it fdo#33960? I pushed your patch to master, but I'm
wondering if you have some sample documents to help us test it more
intensively...

Thanks for your patch!

On Mon, 2011-07-18 at 00:54 +1000, Troy Rollo wrote:
---
 sw/source/filter/rtf/rtffld.cxx  |   50 ++++++++++++-----------------
 sw/source/filter/ww8/ww8atr.cxx  |   12 +++++++
 sw/source/filter/ww8/ww8par5.cxx |   63 +++++++++++++++++++------------------
 3 files changed, 65 insertions(+), 60 deletions(-)

diff --git a/sw/source/filter/rtf/rtffld.cxx b/sw/source/filter/rtf/rtffld.cxx
index f5d9058..ccac5f1 100644
--- a/sw/source/filter/rtf/rtffld.cxx
+++ b/sw/source/filter/rtf/rtffld.cxx
@@ -813,8 +813,7 @@ int SwRTFParser::MakeFieldInst( String& rFieldStr )
     case RTFFLD_REF:
         {
             String sOrigBkmName;
-            bool bChapterNr = false;
-            bool bAboveBelow = false;
+            REFERENCEMARK eFormat = REF_CONTENT;
 
             RtfFieldSwitch aRFS( aSaveStr );
             while( !aRFS.IsAtEnd() )
@@ -828,42 +827,35 @@ int SwRTFParser::MakeFieldInst( String& rFieldStr )
                             sOrigBkmName = sParam;
                         break;
 
+                    /* References to numbers in Word could be either to a numbered
+                    paragraph or to a chapter number. However Word does not seem to
+                    have the capability we do, of refering to the chapter number some
+                    other bookmark is in. As a result, cross-references to chapter
+                    numbers in a word document will be cross-references to a numbered
+                    paragraph, being the chapter heading paragraph. As it happens, our
+                    cross-references to numbered paragraphs will do the right thing
+                    when the target is a numbered chapter heading, so there is no need
+                    for us to use the REF_CHAPTER bookmark format on import.
+                    */
                     case 'n':
+                        eFormat = REF_NUMBER_NO_CONTEXT;
+                        break;
                     case 'r':
+                        eFormat = REF_NUMBER;
+                        break;
                     case 'w':
-                        bChapterNr = true; // activate flag 'Chapter Number'
+                        eFormat = REF_NUMBER_FULL_CONTEXT;
                         break;
 
                     case 'p':
-                        bAboveBelow = true;
+                        eFormat = REF_UPDOWN;
                         break;
                 }
             }
-            if (!bAboveBelow || bChapterNr)
-            {
-                if (bChapterNr)
-                {
-                    SwGetRefField aFld(
-                        (SwGetRefFieldType*)pDoc->GetSysFldType( RES_GETREFFLD ),
-                        sOrigBkmName,REF_BOOKMARK,0,REF_CHAPTER);
-                    pDoc->InsertPoolItem( *pPam, SwFmtFld( aFld ), 0 );
-                }
-                else
-                {
-                    SwGetRefField aFld(
-                        (SwGetRefFieldType*)pDoc->GetSysFldType( RES_GETREFFLD ),
-                        sOrigBkmName,REF_BOOKMARK,0,REF_CONTENT);
-                    pDoc->InsertPoolItem( *pPam, SwFmtFld( aFld ), 0 );
-                }
-            }
-
-            if( bAboveBelow )
-            {
-                SwGetRefField aFld( (SwGetRefFieldType*)
-                    pDoc->GetSysFldType( RES_GETREFFLD ), sOrigBkmName, REF_BOOKMARK, 0,
-                    REF_UPDOWN );
-                pDoc->InsertPoolItem(*pPam, SwFmtFld(aFld), 0);
-            }
+            SwGetRefField aFld(
+                (SwGetRefFieldType*)pDoc->GetSysFldType( RES_GETREFFLD ),
+                sOrigBkmName,REF_BOOKMARK,0,eFormat);
+            pDoc->InsertPoolItem( *pPam, SwFmtFld( aFld ), 0 );
         }
         break;
 
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
index 0ea9201..1464e42 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -2831,6 +2831,18 @@ void AttributeOutputBase::TextField( const SwFmtFld& rField )
                     sStr = FieldString(eFld);
                     sStr += GetExport().GetBookmarkName(nSubType,
                         &rRFld.GetSetRefName(), 0);
+                    switch (pFld->GetFormat())
+                    {
+                        case REF_NUMBER:
+                            sStr.APPEND_CONST_ASC(" \\r");
+                            break;
+                        case REF_NUMBER_NO_CONTEXT:
+                            sStr.APPEND_CONST_ASC(" \\n");
+                            break;
+                        case REF_NUMBER_FULL_CONTEXT:
+                            sStr.APPEND_CONST_ASC(" \\w");
+                            break;
+                    }
                     break;
                 case REF_FOOTNOTE:
                 case REF_ENDNOTE:
diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx
index 759293d..62d73b6 100644
--- a/sw/source/filter/ww8/ww8par5.cxx
+++ b/sw/source/filter/ww8/ww8par5.cxx
@@ -2089,8 +2089,7 @@ eF_ResT SwWW8ImplReader::Read_F_Set( WW8FieldDesc* pF, String& rStr )
 eF_ResT SwWW8ImplReader::Read_F_Ref( WW8FieldDesc*, String& rStr )
 {                                                       // Reference - Field
     String sOrigBkmName;
-    bool bChapterNr = false;
-    bool bAboveBelow = false;
+    REFERENCEMARK eFormat = REF_CONTENT;
 
     long nRet;
     _ReadFieldParams aReadParam( rStr );
@@ -2102,14 +2101,29 @@ eF_ResT SwWW8ImplReader::Read_F_Ref( WW8FieldDesc*, String& rStr )
             if( !sOrigBkmName.Len() ) // get name of bookmark
                 sOrigBkmName = aReadParam.GetResult();
             break;
+
+        /* References to numbers in Word could be either to a numbered
+        paragraph or to a chapter number. However Word does not seem to
+        have the capability we do, of refering to the chapter number some
+        other bookmark is in. As a result, cross-references to chapter
+        numbers in a word document will be cross-references to a numbered
+        paragraph, being the chapter heading paragraph. As it happens, our
+        cross-references to numbered paragraphs will do the right thing
+        when the target is a numbered chapter heading, so there is no need
+        for us to use the REF_CHAPTER bookmark format on import.
+        */
         case 'n':
+            eFormat = REF_NUMBER_NO_CONTEXT;
+            break;
         case 'r':
+            eFormat = REF_NUMBER;
+            break;
         case 'w':
-            bChapterNr = true; // activate flag 'Chapter Number'
+            eFormat = REF_NUMBER_FULL_CONTEXT;
             break;
 
         case 'p':
-            bAboveBelow = true;
+            eFormat = REF_UPDOWN;
             break;
         case 'h':
             break;
@@ -2121,36 +2135,23 @@ eF_ResT SwWW8ImplReader::Read_F_Ref( WW8FieldDesc*, String& rStr )
 
     String sBkmName(GetMappedBookmark(sOrigBkmName));
 
-    if (!bAboveBelow || bChapterNr)
+    SwGetRefField aFld(
+        (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ),
+        sBkmName,REF_BOOKMARK,0,eFormat);
+
+    if (eFormat == REF_CONTENT)
     {
-        if (bChapterNr)
-        {
-            SwGetRefField aFld(
-                (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ),
-                sBkmName,REF_BOOKMARK,0,REF_CHAPTER);
-            rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
-        }
-        else
-        {
-            /*
-            If we are just inserting the contents of the bookmark, then it
-            is possible that the bookmark is actually a variable, so we
-            must store it until the end of the document to see if it was,
-            in which case we'll turn it into a show variable
-            */
-            SwGetRefField aFld(
-                (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ),
-                sBkmName,REF_BOOKMARK,0,REF_CONTENT);
-            pReffingStck->NewAttr( *pPaM->GetPoint(), SwFmtFld(aFld) );
-            pReffingStck->SetAttr( *pPaM->GetPoint(), RES_TXTATR_FIELD);
-        }
+        /*
+        If we are just inserting the contents of the bookmark, then it
+        is possible that the bookmark is actually a variable, so we
+        must store it until the end of the document to see if it was,
+        in which case we'll turn it into a show variable
+        */
+        pReffingStck->NewAttr( *pPaM->GetPoint(), SwFmtFld(aFld) );
+        pReffingStck->SetAttr( *pPaM->GetPoint(), RES_TXTATR_FIELD);
     }
-
-    if( bAboveBelow )
+    else
     {
-        SwGetRefField aFld( (SwGetRefFieldType*)
-            rDoc.GetSysFldType( RES_GETREFFLD ), sBkmName, REF_BOOKMARK, 0,
-            REF_UPDOWN );
         rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
     }
     return FLD_OK;

-- 
Cédric Bosdonnat
LibreOffice hacker
http://documentfoundation.org
OOo Eclipse Integration developer
http://cedric.bosdonnat.free.fr


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.