diff options
author | Troy Rollo <libreoffice@troy.rollo.name> | 2011-07-18 00:54:26 +1000 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat.ooo@free.fr> | 2011-08-10 10:18:04 +0200 |
commit | 234642040086ee91bdb026e10a7c92ec71ac24d3 (patch) | |
tree | 09bf3c841966b1d5caa7f8a27e76e0ece82f05f6 | |
parent | 7e631b61607ddd821d9b3a688ff769bde45a4b2c (diff) |
fdo#33960 - import/export xrefs to numbered paras
-rw-r--r-- | sw/source/filter/rtf/rtffld.cxx | 50 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8atr.cxx | 12 | ||||
-rw-r--r-- | 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 eb0b46539d29..7bb6210714a8 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 08241b24dcdd..8841a079349f 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -2830,6 +2830,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 0d993326f823..0b654ae2efdf 100644 --- a/sw/source/filter/ww8/ww8par5.cxx +++ b/sw/source/filter/ww8/ww8par5.cxx @@ -2064,8 +2064,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 ); @@ -2077,14 +2076,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; @@ -2096,36 +2110,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; |