summaryrefslogtreecommitdiff
path: root/sw/source/filter/ww1
diff options
context:
space:
mode:
authorOliver-Rainer Wittmann <orw@apache.org>2012-11-22 11:14:51 +0000
committerOliver-Rainer Wittmann <orw@apache.org>2012-11-22 11:14:51 +0000
commite3a34e95823105fda68fd29a4ded22a9d52523fb (patch)
tree700ec78cd3ef2121607592f532f51490660edeeb /sw/source/filter/ww1
parent4116c33b12d3787c406f0348f89efcb1cf409507 (diff)
#120879# - import "Microsoft Word TOC bookmarks" as cross reference bookmarks
and suppress the import of unreferenced ones. Review by: zhengfan
Notes
Diffstat (limited to 'sw/source/filter/ww1')
-rw-r--r--sw/source/filter/ww1/fltshell.cxx89
-rw-r--r--sw/source/filter/ww1/w1filter.cxx2
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;
}