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 _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice