[Libreoffice] [PATCH] Fix 33898 - import/export xrefs to numbered paras

Troy Rollo libreoffice at troy.rollo.name
Sun Jul 17 07:54:26 PDT 2011


---
 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;
-- 
1.7.2.5



More information about the LibreOffice mailing list