You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by or...@apache.org on 2012/11/22 13:14:58 UTC

svn commit: r1412516 - in /incubator/ooo/trunk/main/sw: inc/ source/core/crsr/ source/core/doc/ source/core/inc/ source/core/unocore/ source/filter/inc/ source/filter/ww1/ source/filter/ww8/

Author: orw
Date: Thu Nov 22 12:14:51 2012
New Revision: 1412516

URL: http://svn.apache.org/viewvc?rev=1412516&view=rev
Log:
#120879# - import "Microsoft Word TOC bookmarks" as cross reference bookmarks
           and suppress the import of unreferenced ones.

           Review by: zhengfan

Modified:
    incubator/ooo/trunk/main/sw/inc/IDocumentMarkAccess.hxx
    incubator/ooo/trunk/main/sw/source/core/crsr/crossrefbookmark.cxx
    incubator/ooo/trunk/main/sw/source/core/doc/docbm.cxx
    incubator/ooo/trunk/main/sw/source/core/inc/crossrefbookmark.hxx
    incubator/ooo/trunk/main/sw/source/core/unocore/unobkm.cxx
    incubator/ooo/trunk/main/sw/source/filter/inc/fltshell.hxx
    incubator/ooo/trunk/main/sw/source/filter/ww1/fltshell.cxx
    incubator/ooo/trunk/main/sw/source/filter/ww1/w1filter.cxx
    incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.cxx
    incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.hxx
    incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par5.cxx

Modified: incubator/ooo/trunk/main/sw/inc/IDocumentMarkAccess.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/inc/IDocumentMarkAccess.hxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/inc/IDocumentMarkAccess.hxx (original)
+++ incubator/ooo/trunk/main/sw/inc/IDocumentMarkAccess.hxx Thu Nov 22 12:14:51 2012
@@ -240,6 +240,9 @@ class IDocumentMarkAccess
 
         // Returns the MarkType used to create the mark
         static MarkType SAL_DLLPUBLIC_EXPORT GetType(const ::sw::mark::IMark& rMark);
+
+        static const ::rtl::OUString SAL_DLLPUBLIC_EXPORT & GetCrossRefHeadingBookmarkNamePrefix();
+        static const bool SAL_DLLPUBLIC_EXPORT IsLegalPaMForCrossRefHeadingBookmark( const SwPaM& rPaM );
     protected:
         virtual ~IDocumentMarkAccess() {};
 };

Modified: incubator/ooo/trunk/main/sw/source/core/crsr/crossrefbookmark.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/core/crsr/crossrefbookmark.cxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/core/crsr/crossrefbookmark.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/core/crsr/crossrefbookmark.cxx Thu Nov 22 12:14:51 2012
@@ -24,6 +24,7 @@
 // MARKER(update_precomp.py): autogen include statement, do not remove
 #include "precompiled_sw.hxx"
 
+#include <IDocumentMarkAccess.hxx>
 #include <crossrefbookmark.hxx>
 #include <ndtxt.hxx>
 
@@ -38,12 +39,9 @@ namespace sw { namespace mark
         const OUString& rPrefix)
         : Bookmark(rPaM, rCode, rName, rShortName)
     {
-        if(rPaM.HasMark())
-            OSL_ENSURE((rPaM.GetMark()->nNode == rPaM.GetPoint()->nNode &&
-                rPaM.Start()->nContent.GetIndex() == 0 &&
-                rPaM.End()->nContent.GetIndex() == rPaM.GetPoint()->nNode.GetNode().GetTxtNode()->Len()),
-                "<CrossRefBookmark::CrossRefBookmark(..)>"
-                "- creation of cross-reference bookmark with an expanded PaM that does not expand over exactly one whole paragraph.");
+        OSL_ENSURE( IDocumentMarkAccess::IsLegalPaMForCrossRefHeadingBookmark( rPaM ),
+                    "<CrossRefBookmark::CrossRefBookmark(..)>"
+                    "- creation of cross-reference bookmark with an illegal PaM that does not expand over exactly one whole paragraph.");
         SetMarkPos(*rPaM.Start());
         if(!rName.getLength())
             m_aName = MarkBase::GenerateNewName(rPrefix);
@@ -72,14 +70,12 @@ namespace sw { namespace mark
         const KeyCode& rCode,
         const OUString& rName,
         const OUString& rShortName)
-        : CrossRefBookmark(rPaM, rCode, rName, rShortName, our_sNamePrefix)
+        : CrossRefBookmark(rPaM, rCode, rName, rShortName, IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix())
     { }
 
-    const ::rtl::OUString CrossRefHeadingBookmark::our_sNamePrefix = ::rtl::OUString::createFromAscii("__RefHeading__");
-
     bool CrossRefHeadingBookmark::IsLegalName(const ::rtl::OUString& rName)
     {
-        return rName.match(our_sNamePrefix);
+        return rName.match(IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix());
     }
 
     CrossRefNumItemBookmark::CrossRefNumItemBookmark(const SwPaM& rPaM,

Modified: incubator/ooo/trunk/main/sw/source/core/doc/docbm.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/core/doc/docbm.cxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/core/doc/docbm.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/core/doc/docbm.cxx Thu Nov 22 12:14:51 2012
@@ -295,6 +295,26 @@ IDocumentMarkAccess::MarkType IDocumentM
     }
 }
 
+const ::rtl::OUString& IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix()
+{
+    static const ::rtl::OUString CrossRefHeadingBookmarkNamePrefix = ::rtl::OUString::createFromAscii("__RefHeading__");
+
+    return CrossRefHeadingBookmarkNamePrefix;
+}
+
+const bool SAL_DLLPUBLIC_EXPORT IDocumentMarkAccess::IsLegalPaMForCrossRefHeadingBookmark( const SwPaM& rPaM )
+{
+    bool bRet( false );
+
+    bRet = rPaM.Start()->nNode.GetNode().IsTxtNode() &&
+           rPaM.Start()->nContent.GetIndex() == 0 &&
+           ( !rPaM.HasMark() ||
+             ( rPaM.GetMark()->nNode == rPaM.GetPoint()->nNode &&
+               rPaM.End()->nContent.GetIndex() == rPaM.End()->nNode.GetNode().GetTxtNode()->Len() ) );
+
+    return bRet;
+}
+
 namespace sw { namespace mark
 {
     MarkManager::MarkManager(SwDoc& rDoc)

Modified: incubator/ooo/trunk/main/sw/source/core/inc/crossrefbookmark.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/core/inc/crossrefbookmark.hxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/core/inc/crossrefbookmark.hxx (original)
+++ incubator/ooo/trunk/main/sw/source/core/inc/crossrefbookmark.hxx Thu Nov 22 12:14:51 2012
@@ -75,7 +75,6 @@ namespace sw { namespace mark
                 const ::rtl::OUString& rShortName);
             static ::rtl::OUString GenerateNewName();
             static bool IsLegalName(const ::rtl::OUString& rName);
-            static const ::rtl::OUString our_sNamePrefix;
     };
 
     class CrossRefNumItemBookmark

Modified: incubator/ooo/trunk/main/sw/source/core/unocore/unobkm.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/core/unocore/unobkm.cxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/core/unocore/unobkm.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/core/unocore/unobkm.cxx Thu Nov 22 12:14:51 2012
@@ -241,7 +241,8 @@ throw (lang::IllegalArgumentException, u
         eType = IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK;
     }
     else if ((eType == IDocumentMarkAccess::BOOKMARK) &&
-        ::sw::mark::CrossRefHeadingBookmark::IsLegalName(m_pImpl->m_sMarkName))
+        ::sw::mark::CrossRefHeadingBookmark::IsLegalName(m_pImpl->m_sMarkName) &&
+        IDocumentMarkAccess::IsLegalPaMForCrossRefHeadingBookmark( aPam ) )
     {
         eType = IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK;
     }

Modified: incubator/ooo/trunk/main/sw/source/filter/inc/fltshell.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/inc/fltshell.hxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/filter/inc/fltshell.hxx (original)
+++ incubator/ooo/trunk/main/sw/source/filter/inc/fltshell.hxx Thu Nov 22 12:14:51 2012
@@ -237,28 +237,32 @@ public:
 
 class SW_DLLPUBLIC SwFltBookmark : public SfxPoolItem
 {
+private:
     friend class SwFltShell;	// darf aName und aVal uebersetzen
-	long nHandle;
-	String aName;
-	String aVal;
-	sal_Bool bOnlyRef;			// "FRAGE"-Feld, Ref/Seitenrf oder nichts
-	sal_Bool bRef;
-	sal_Bool bPgRef;
+
+    long mnHandle;
+    String maName;
+    String maVal;
+    bool mbIsTOCBookmark;
+
 public:
-	SwFltBookmark( const String& rNa, const String& rVa,
-					long nHand, sal_Bool bOnlyR );
-	SwFltBookmark( const SwFltBookmark& );
-	// "pure virtual Methoden" vom SfxPoolItem
-	virtual int operator==(const SfxPoolItem&) const;
-	virtual SfxPoolItem* Clone(SfxItemPool* = 0) const;
-	const String& GetName() const 		{ return aName; }
-	const String& GetValSys() const 	{ return aVal; }
-	sal_Bool IsOnlyRef() const				{ return bOnlyRef; }
-	sal_Bool IsRef() const 					{ return bRef; }
-	void SetRef(sal_Bool b = sal_True) 			{ bRef = b; }
-	sal_Bool IsPgRef() const				{ return bPgRef; }
-	void SetPgRef(sal_Bool b = sal_True) 		{ bPgRef = b; }
-	long GetHandle() const 				{ return nHandle; }
+    SwFltBookmark( const String& rNa, 
+                   const String& rVa,
+                   long nHand,
+                   const bool bIsTOCBookmark = false );
+    SwFltBookmark( const SwFltBookmark& );
+
+    // "pure virtual Methoden" vom SfxPoolItem
+    virtual int operator==(const SfxPoolItem&) const;
+    virtual SfxPoolItem* Clone(SfxItemPool* = 0) const;
+
+    long GetHandle() const 				{ return mnHandle; }
+    const String& GetName() const 		{ return maName; }
+    const String& GetValSys() const 	{ return maVal; }
+    const bool IsTOCBookmark() const
+    {
+        return mbIsTOCBookmark;
+    }
 };
 
 class SW_DLLPUBLIC SwFltTOX : public SfxPoolItem

Modified: incubator/ooo/trunk/main/sw/source/filter/ww1/fltshell.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww1/fltshell.cxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/filter/ww1/fltshell.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/filter/ww1/fltshell.cxx Thu Nov 22 12:14:51 2012
@@ -537,45 +537,41 @@ void SwFltControlStack::SetAttrInDoc(con
 			}
 		}
 		break;
-	case RES_FLTR_NUMRULE_NUM:
-		break;
-	case RES_FLTR_BOOKMARK:			// eigentlich nur fuer den Ende-Stack
-		{
-			SwFltBookmark* pB = (SwFltBookmark*)pEntry->pAttr;
-			const String& rName = ((SwFltBookmark*)pEntry->pAttr)->GetName();
+    case RES_FLTR_NUMRULE_NUM:
+        break;
+    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)
-					{						// 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()) );
-				}
-			}
-			if( !pB->IsOnlyRef() &&
-				( !IsFlagSet(HYPO) || IsFlagSet(BOOK_AND_REF) ) && !pEntry->bConsumedByField)
-			{
-				MakeBookRegionOrPoint(pEntry, pDoc, aRegion, sal_True);
-                pDoc->getIDocumentMarkAccess()->makeMark( aRegion, rName, IDocumentMarkAccess::BOOKMARK);
-			}
-		}
-		break;
+            if (IsFlagSet(BOOK_TO_VAR_REF))
+            {
+                SwFieldType* pFT = pDoc->GetFldType(RES_SETEXPFLD, rName, false);
+                if (!pFT)
+                {
+                    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 ( ( !IsFlagSet(HYPO) || IsFlagSet(BOOK_AND_REF) ) && 
+                 !pEntry->bConsumedByField )
+            {
+                MakeBookRegionOrPoint(pEntry, pDoc, aRegion, sal_True);
+                // #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;
 	case RES_FLTR_TOX:
 		{
 			MakePoint(pEntry, pDoc, aRegion);
@@ -916,32 +912,39 @@ SfxPoolItem* SwFltRedline::Clone( SfxIte
 
 //------ 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_uI
 
 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;
 }

Modified: incubator/ooo/trunk/main/sw/source/filter/ww1/w1filter.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww1/w1filter.cxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/filter/ww1/w1filter.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/filter/ww1/w1filter.cxx Thu Nov 22 12:14:51 2012
@@ -351,7 +351,7 @@ void Ww1Bookmarks::Out(Ww1Shell& rOut, W
 	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;
 }
 

Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.cxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.cxx Thu Nov 22 12:14:51 2012
@@ -926,6 +926,41 @@ bool SwWW8FltControlStack::CheckSdOD(sal
 	return rReader.IsParaEndInCPs(nStart,nEnd);
 }
 //End
+
+void SwWW8ReferencedFltEndStack::SetAttrInDoc( const SwPosition& rTmpPos,
+                                               SwFltStackEntry* pEntry )
+{
+    switch( pEntry->pAttr->Which() )
+    {
+    case RES_FLTR_BOOKMARK:
+        {
+            // suppress insertion of bookmark, which is recognized as an internal bookmark used for table-of-content 
+            // and which is not referenced.
+            bool bInsertBookmarkIntoDoc = true;
+
+            SwFltBookmark* pFltBookmark = dynamic_cast<SwFltBookmark*>(pEntry->pAttr);
+            if ( pFltBookmark != 0 && pFltBookmark->IsTOCBookmark() )
+            {
+                const String& rName = pFltBookmark->GetName();
+                ::std::set< String, SwWW8::ltstr >::const_iterator aResult = aReferencedTOCBookmarks.find(rName);
+                if ( aResult == aReferencedTOCBookmarks.end() )
+                {
+                    bInsertBookmarkIntoDoc = false;
+                }
+            }
+            if ( bInsertBookmarkIntoDoc )
+            {
+                SwFltEndStack::SetAttrInDoc( rTmpPos, pEntry );
+            }
+            break;
+        }
+    default:
+        SwFltEndStack::SetAttrInDoc( rTmpPos, pEntry );
+        break;
+    }
+
+}
+
 void SwWW8FltControlStack::SetAttrInDoc(const SwPosition& rTmpPos,
     SwFltStackEntry* pEntry)
 {
@@ -3982,7 +4017,7 @@ sal_uLong SwWW8ImplReader::CoreLoad(WW8G
         RefFldStck: Keeps track of bookmarks which may be inserted as
         variables intstead.
     */
-    pReffedStck = new SwFltEndStack(&rDoc, nFieldFlags);
+    pReffedStck = new SwWW8ReferencedFltEndStack(&rDoc, nFieldFlags);
     pReffingStck = new SwWW8FltRefStack(&rDoc, nFieldFlags);
 
     pAnchorStck = new SwWW8FltAnchorStack(&rDoc, nFieldFlags);

Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.hxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.hxx (original)
+++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.hxx Thu Nov 22 12:14:51 2012
@@ -313,14 +313,8 @@ private:
     Position& operator=(const Position&);
 };
 
-class SwWW8FltRefStack : public SwFltEndStack
+namespace SwWW8
 {
-public:
-    SwWW8FltRefStack(SwDoc* pDo, sal_uLong nFieldFl)
-        : SwFltEndStack( pDo, nFieldFl )
-    {}
-    bool IsFtnEdnBkmField(const SwFmtFld& rFmtFld, sal_uInt16& rBkmNo);
-
     struct ltstr
     {
         bool operator()(const String &r1, const String &r2) const
@@ -328,10 +322,37 @@ public:
             return r1.CompareIgnoreCaseToAscii(r2) == COMPARE_LESS;
         }
     };
+};
+
+class SwWW8ReferencedFltEndStack : public SwFltEndStack
+{
+public:
+    SwWW8ReferencedFltEndStack( SwDoc* pDo, sal_uLong nFieldFl )
+        : SwFltEndStack( pDo, nFieldFl )
+        , aReferencedTOCBookmarks()
+    {}
+
+    // Keep track of referenced TOC bookmarks in order to suppress the import
+    // of unreferenced ones.
+    std::set<String, SwWW8::ltstr> aReferencedTOCBookmarks;
+protected:
+    virtual void SetAttrInDoc( const SwPosition& rTmpPos,
+                               SwFltStackEntry* pEntry );
+};
+
+class SwWW8FltRefStack : public SwFltEndStack
+{
+public:
+    SwWW8FltRefStack(SwDoc* pDo, sal_uLong nFieldFl)
+        : SwFltEndStack( pDo, nFieldFl )
+        , aFieldVarNames()
+    {}
+    bool IsFtnEdnBkmField(const SwFmtFld& rFmtFld, sal_uInt16& rBkmNo);
+
     //Keep track of variable names created with fields, and the bookmark
     //mapped to their position, hopefully the same, but very possibly
     //an additional pseudo bookmark
-    std::map<String, String, ltstr> aFieldVarNames;
+    std::map<String, String, SwWW8::ltstr> aFieldVarNames;
 protected:
     SwFltStackEntry *RefToVar(const SwField* pFld,SwFltStackEntry *pEntry);
     virtual void SetAttrInDoc(const SwPosition& rTmpPos,
@@ -843,11 +864,11 @@ private:
     sw::util::RedlineStack *mpRedlineStack;
 
     /*
-    This stack is for fields that get referneced later, e.g. BookMarks and TOX.
+    This stack is for fields that get referenced later, e.g. BookMarks and TOX.
     They get inserted at the end of the document, it is the same stack for
     headers/footers/main text/textboxes/tables etc...
     */
-    SwFltEndStack *pReffedStck;
+    SwWW8ReferencedFltEndStack *pReffedStck;
 
     /*
     This stack is for fields whose true conversion cannot be determined until

Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par5.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par5.cxx?rev=1412516&r1=1412515&r2=1412516&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par5.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par5.cxx Thu Nov 22 12:14:51 2012
@@ -294,6 +294,17 @@ bool _ReadFieldParams::GetTokenSttFromTo
 //              Bookmarks
 //----------------------------------------
 
+namespace
+{
+    // #120879# - helper method to identify a bookmark name to match the internal TOC bookmark naming convention
+    bool IsTOCBookmarkName( const ::rtl::OUString& rName )
+    {
+        static const ::rtl::OUString cTOCBookmarkNamePrefix = ::rtl::OUString::createFromAscii("_Toc");
+
+        return rName.match(cTOCBookmarkNamePrefix);
+    }
+}
+
 long SwWW8ImplReader::Read_Book(WW8PLCFManResult*)
 {
     // muesste auch ueber pRes.nCo2OrIdx gehen
@@ -404,8 +415,9 @@ long SwWW8ImplReader::Read_Book(WW8PLCFM
         aStart = rTest.maStartPos;
     }
 
-    pReffedStck->NewAttr(aStart, SwFltBookmark(BookmarkToWriter(*pName), aVal,
-        pB->GetHandle(), 0));
+    const String sOrigName = BookmarkToWriter(*pName);
+    pReffedStck->NewAttr( aStart, 
+                          SwFltBookmark( sOrigName, aVal, pB->GetHandle(), IsTOCBookmarkName( sOrigName ) ));
     return 0;
 }
 
@@ -1314,7 +1326,7 @@ long SwWW8ImplReader::MapBookmarkVariabl
         nNo += pPlcxMan->GetBook()->GetIMax();
     }
     pReffedStck->NewAttr(*pPaM->GetPoint(),
-        SwFltBookmark(BookmarkToWriter(sName), rData, nNo, 0));
+        SwFltBookmark( BookmarkToWriter(sName), rData, nNo ));
     pReffingStck->aFieldVarNames[rOrigName] = sName;
     return nNo;
 }
@@ -1337,7 +1349,7 @@ SwFltStackEntry *SwWW8FltRefStack::RefTo
     {
         //Get the name of the ref field, and see if actually a variable
         const String &rName = pFld->GetPar1();
-        ::std::map<String,String,SwWW8FltRefStack::ltstr>::const_iterator
+        ::std::map<String,String,SwWW8::ltstr>::const_iterator
             aResult = aFieldVarNames.find(rName);
 
         if (aResult != aFieldVarNames.end())
@@ -1361,7 +1373,7 @@ String SwWW8ImplReader::GetMappedBookmar
 
     //See if there has been a variable set with this name, if so get
     //the pseudo bookmark name that was set with it.
-    ::std::map<String,String,SwWW8FltRefStack::ltstr>::const_iterator aResult =
+    ::std::map<String,String,SwWW8::ltstr>::const_iterator aResult =
             pReffingStck->aFieldVarNames.find(sName);
 
     const String &rBkmName = (aResult == pReffingStck->aFieldVarNames.end())
@@ -2156,18 +2168,32 @@ eF_ResT SwWW8ImplReader::Read_F_PgRef( W
         }
     }
 
-    String sName(GetMappedBookmark(sOrigName));
+    const String sName(GetMappedBookmark(sOrigName));
 
-    //loading page reference field in TOC
+    // loading page reference field in TOC
     if (mbLoadingTOCCache )
     {
-        //Step 1. Insert page ref representation as plain text
-        //Step 2. If there is no hyperlink settings for current toc, assign link to current ref area
-        if ( !mbLoadingTOCHyperlink)
-        {
-            String sURL,sTarget;
-            if( sName.Len() )
-                ( sURL += INET_MARK_TOKEN ) += sName;
+        // insert page ref representation as plain text --> return FLD_TEXT
+        // if there is no hyperlink settings for current toc and referenced bookmark is available, 
+        // assign link to current ref area
+        if ( !mbLoadingTOCHyperlink && sName.Len() > 0 )
+        {
+            // #120879# add cross reference bookmark name prefix, if it matches internal TOC bookmark naming convention
+            String sBookmarkName;
+            if ( IsTOCBookmarkName( sName ) )
+            {
+                sBookmarkName = String( IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix() );
+                sBookmarkName += sName;
+                // track <sBookmarkName> as referenced TOC bookmark.
+                pReffedStck->aReferencedTOCBookmarks.insert( sBookmarkName );
+            }
+            else
+            {
+                sBookmarkName = sName;
+            }
+            String sURL = INET_MARK_TOKEN;
+            sURL += sBookmarkName;
+            const String sTarget;
             SwFmtINetFmt aURL( sURL, sTarget );
             String sLinkStyle = String::CreateFromAscii("Index Link");
             sal_uInt16 nPoolId =
@@ -2181,11 +2207,23 @@ eF_ResT SwWW8ImplReader::Read_F_PgRef( W
         return FLD_TEXT;
     }
 
-    SwGetRefField aFld(
-        (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ), sName,
-        REF_BOOKMARK, 0, REF_PAGE );
-
+    // #120879# add cross reference bookmark name prefix, if it matches internal TOC bookmark naming convention
+    String sPageRefBookmarkName;
+    if ( IsTOCBookmarkName( sName ) )
+    {
+        sPageRefBookmarkName = IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix();
+        sPageRefBookmarkName += sName;
+        // track <sPageRefBookmarkName> as referenced TOC bookmark.
+        pReffedStck->aReferencedTOCBookmarks.insert( sPageRefBookmarkName );
+    }
+    else
+    {
+        sPageRefBookmarkName = sName;
+    }
+    SwGetRefField aFld( (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ), 
+                        sPageRefBookmarkName, REF_BOOKMARK, 0, REF_PAGE );
     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
+
     return FLD_OK;
 }
 //helper function
@@ -3572,8 +3610,19 @@ eF_ResT SwWW8ImplReader::Read_F_Hyperlin
                     if( -2 == nRet )
                     {
                         sMark = aReadParam.GetResult();
-                        if( sMark.Len() && '"' == sMark.GetChar( sMark.Len()-1 ))
+                        if( sMark.Len() > 0 && '"' == sMark.GetChar( sMark.Len()-1 ) )
+                        {
                             sMark.Erase( sMark.Len() - 1 );
+                        }
+                        // #120879# add cross reference bookmark name prefix, if it matches internal TOC bookmark naming convention
+                        if ( IsTOCBookmarkName( sMark ) )
+                        {
+                            String sTmp = IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix();
+                            sTmp += sMark;
+                            sMark = sTmp;
+                            // track <sMark> as referenced TOC bookmark.
+                            pReffedStck->aReferencedTOCBookmarks.insert( sMark );
+                        }
 
                         if (mbLoadingTOCCache)
                         {