diff options
author | Oliver-Rainer Wittmann <orw@apache.org> | 2012-11-22 11:14:51 +0000 |
---|---|---|
committer | Oliver-Rainer Wittmann <orw@apache.org> | 2012-11-22 11:14:51 +0000 |
commit | e3a34e95823105fda68fd29a4ded22a9d52523fb (patch) | |
tree | 700ec78cd3ef2121607592f532f51490660edeeb /sw/source/filter/ww1 | |
parent | 4116c33b12d3787c406f0348f89efcb1cf409507 (diff) |
#120879# - import "Microsoft Word TOC bookmarks" as cross reference bookmarks
and suppress the import of unreferenced ones.
Review by: zhengfan
Notes
merged as: 679faffc68bb854af0f55d0f218698e2f372f00b
Diffstat (limited to 'sw/source/filter/ww1')
-rw-r--r-- | sw/source/filter/ww1/fltshell.cxx | 89 | ||||
-rw-r--r-- | sw/source/filter/ww1/w1filter.cxx | 2 |
2 files changed, 47 insertions, 44 deletions
diff --git a/sw/source/filter/ww1/fltshell.cxx b/sw/source/filter/ww1/fltshell.cxx index 08371198e34c..dd0b66b2cdcb 100644 --- a/sw/source/filter/ww1/fltshell.cxx +++ b/sw/source/filter/ww1/fltshell.cxx @@ -539,40 +539,36 @@ void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry* break; case RES_FLTR_NUMRULE_NUM: break; - case RES_FLTR_BOOKMARK: // eigentlich nur fuer den Ende-Stack + case RES_FLTR_BOOKMARK: { SwFltBookmark* pB = (SwFltBookmark*)pEntry->pAttr; const String& rName = ((SwFltBookmark*)pEntry->pAttr)->GetName(); if (IsFlagSet(BOOK_TO_VAR_REF)) { - if (pB->IsPgRef() && !pB->IsRef()) - { - // XRefs und Bookmarks sind bereits geUpcased - MakeBookRegionOrPoint(pEntry, pDoc, aRegion, sal_True); - pDoc->InsertPoolItem(aRegion, SwFmtRefMark(rName), 0); - } - else if( !pB->IsOnlyRef() ) + SwFieldType* pFT = pDoc->GetFldType(RES_SETEXPFLD, rName, false); + if (!pFT) { - SwFieldType* pFT = pDoc->GetFldType(RES_SETEXPFLD, rName, false); - if (!pFT) - { // FieldType anlegen - SwSetExpFieldType aS(pDoc, rName, nsSwGetSetExpType::GSE_STRING); - pFT = pDoc->InsertFldType(aS); - } - SwSetExpField aFld((SwSetExpFieldType*)pFT, - pB->GetValSys()); - aFld.SetSubType( nsSwExtendedSubType::SUB_INVISIBLE ); - MakePoint(pEntry, pDoc, aRegion); - pDoc->InsertPoolItem(aRegion, SwFmtFld(aFld), 0); - MoveAttrs( *(aRegion.GetPoint()) ); + SwSetExpFieldType aS(pDoc, rName, nsSwGetSetExpType::GSE_STRING); + pFT = pDoc->InsertFldType(aS); } + SwSetExpField aFld((SwSetExpFieldType*)pFT, pB->GetValSys()); + aFld.SetSubType( nsSwExtendedSubType::SUB_INVISIBLE ); + MakePoint(pEntry, pDoc, aRegion); + pDoc->InsertPoolItem(aRegion, SwFmtFld(aFld), 0); + MoveAttrs( *(aRegion.GetPoint()) ); } - if( !pB->IsOnlyRef() && - ( !IsFlagSet(HYPO) || IsFlagSet(BOOK_AND_REF) ) && !pEntry->bConsumedByField) + if ( ( !IsFlagSet(HYPO) || IsFlagSet(BOOK_AND_REF) ) && + !pEntry->bConsumedByField ) { MakeBookRegionOrPoint(pEntry, pDoc, aRegion, sal_True); - pDoc->getIDocumentMarkAccess()->makeMark( aRegion, rName, IDocumentMarkAccess::BOOKMARK); + // #120879# - create a cross reference heading bookmark if appropriate. + const IDocumentMarkAccess::MarkType eBookmarkType = + ( pB->IsTOCBookmark() && + IDocumentMarkAccess::IsLegalPaMForCrossRefHeadingBookmark( aRegion ) ) + ? IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK + : IDocumentMarkAccess::BOOKMARK; + pDoc->getIDocumentMarkAccess()->makeMark( aRegion, rName, eBookmarkType ); } } break; @@ -916,32 +912,39 @@ SfxPoolItem* SwFltRedline::Clone( SfxItemPool* ) const //------ hier stehen die Methoden von SwFltBookmark ----------- SwFltBookmark::SwFltBookmark( const String& rNa, const String& rVa, - long nHand, sal_Bool bOnlyR ) - : SfxPoolItem(RES_FLTR_BOOKMARK), nHandle(nHand), aName(rNa), aVal(rVa), - bOnlyRef(bOnlyR), bRef(sal_False), bPgRef(sal_False) -{ - // eSrc: CHARSET_DONTKNOW fuer keine UEbersetzung bei operator << - // Upcase wird immer gemacht. - // bei XXXStack.NewAttr(...) wird nie eine UEbersetzung vorgenommen. - // ansonsten: uebergebener Src-Charset fuer aName - // im Filter eingestellter Src-Charset fuer aVal ( Text ) + long nHand, const bool bIsTOCBookmark ) + : SfxPoolItem( RES_FLTR_BOOKMARK ) + , mnHandle( nHand ) + , maName( rNa ) + , maVal( rVa ) + , mbIsTOCBookmark( bIsTOCBookmark ) +{ + // eSrc: CHARSET_DONTKNOW fuer keine UEbersetzung bei operator << + // Upcase wird immer gemacht. + // bei XXXStack.NewAttr(...) wird nie eine UEbersetzung vorgenommen. + // ansonsten: uebergebener Src-Charset fuer aName + // im Filter eingestellter Src-Charset fuer aVal ( Text ) + + if ( IsTOCBookmark() ) + { + maName = IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix(); + maName += rNa; + } } SwFltBookmark::SwFltBookmark(const SwFltBookmark& rCpy) - : SfxPoolItem(RES_FLTR_BOOKMARK), - nHandle(rCpy.nHandle), - aName(rCpy.aName), - aVal(rCpy.aVal), - bOnlyRef(rCpy.bOnlyRef), - bRef(rCpy.bRef), - bPgRef(rCpy.bPgRef) + : SfxPoolItem( RES_FLTR_BOOKMARK ) + , mnHandle( rCpy.mnHandle ) + , maName( rCpy.maName ) + , maVal( rCpy.maVal ) + , mbIsTOCBookmark( rCpy.mbIsTOCBookmark ) { } int SwFltBookmark::operator==(const SfxPoolItem& rItem) const { - return (aName == ((SwFltBookmark&)rItem).aName) - && (nHandle == ((SwFltBookmark&)rItem).nHandle); + return ( maName == ((SwFltBookmark&)rItem).maName) + && (mnHandle == ((SwFltBookmark&)rItem).mnHandle); } SfxPoolItem* SwFltBookmark::Clone(SfxItemPool*) const @@ -1249,8 +1252,8 @@ SwFltShell& SwFltShell::SetStyle( sal_uInt16 nStyle ) SwFltShell& SwFltShell::operator << (SwFltBookmark& aBook) { - ConvertUStr( aBook.aName ); - aBook.aVal = QuoteStr(aBook.aVal); + ConvertUStr( aBook.maName ); + aBook.maVal = QuoteStr(aBook.maVal); aEndStack.NewAttr(*pPaM->GetPoint(), aBook); return *this; } diff --git a/sw/source/filter/ww1/w1filter.cxx b/sw/source/filter/ww1/w1filter.cxx index 63115f95b05a..6bbbfdda0edb 100644 --- a/sw/source/filter/ww1/w1filter.cxx +++ b/sw/source/filter/ww1/w1filter.cxx @@ -351,7 +351,7 @@ void Ww1Bookmarks::Out(Ww1Shell& rOut, Ww1Manager& rMan, sal_uInt16) String aVal( rMan.GetText().GetText( Where(), nLen ) ); // in 2 Schritten, da OS/2 zu doof ist - SwFltBookmark aBook( rName, aVal, GetHandle(), sal_False ); + SwFltBookmark aBook( rName, aVal, GetHandle() ); rOut << aBook; } |