Return-Path: X-Original-To: apmail-incubator-ooo-commits-archive@minotaur.apache.org Delivered-To: apmail-incubator-ooo-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 00CBDD740 for ; Mon, 17 Sep 2012 12:47:06 +0000 (UTC) Received: (qmail 54127 invoked by uid 500); 17 Sep 2012 12:47:05 -0000 Delivered-To: apmail-incubator-ooo-commits-archive@incubator.apache.org Received: (qmail 54085 invoked by uid 500); 17 Sep 2012 12:47:05 -0000 Mailing-List: contact ooo-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: ooo-dev@incubator.apache.org Delivered-To: mailing list ooo-commits@incubator.apache.org Received: (qmail 54066 invoked by uid 99); 17 Sep 2012 12:47:05 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 17 Sep 2012 12:47:05 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 17 Sep 2012 12:47:01 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 55CCE23888CD; Mon, 17 Sep 2012 12:46:18 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1386590 - in /incubator/ooo/trunk: ./ main/sw/inc/ main/sw/source/core/doc/ main/sw/source/core/tox/ main/sw/source/filter/ww8/ main/sw/source/filter/ww8/dump/ main/sw/source/ui/index/ test/ test/testcommon/source/org/openoffice/test/vcl/ Date: Mon, 17 Sep 2012 12:46:17 -0000 To: ooo-commits@incubator.apache.org From: orw@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120917124618.55CCE23888CD@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: orw Date: Mon Sep 17 12:46:16 2012 New Revision: 1386590 URL: http://svn.apache.org/viewvc?rev=1386590&view=rev Log: #119963#,#120877# - WW8 filter enhancement: import and export actual TOC content Patch by: zhengfan, Oliver Review by: Oliver reintegrate from branch writer001 Modified: incubator/ooo/trunk/ (props changed) incubator/ooo/trunk/main/sw/inc/tox.hxx incubator/ooo/trunk/main/sw/source/core/doc/doctxm.cxx incubator/ooo/trunk/main/sw/source/core/tox/tox.cxx incubator/ooo/trunk/main/sw/source/filter/ww8/attributeoutputbase.hxx incubator/ooo/trunk/main/sw/source/filter/ww8/dump/ww8scan.cxx incubator/ooo/trunk/main/sw/source/filter/ww8/writerwordglue.cxx incubator/ooo/trunk/main/sw/source/filter/ww8/wrtw8nds.cxx incubator/ooo/trunk/main/sw/source/filter/ww8/wrtww8.cxx incubator/ooo/trunk/main/sw/source/filter/ww8/ww8atr.cxx incubator/ooo/trunk/main/sw/source/filter/ww8/ww8attributeoutput.hxx 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 incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par6.cxx incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.cxx incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.hxx incubator/ooo/trunk/main/sw/source/ui/index/toxmgr.cxx incubator/ooo/trunk/test/ (props changed) incubator/ooo/trunk/test/testcommon/source/org/openoffice/test/vcl/ (props changed) Propchange: incubator/ooo/trunk/ ------------------------------------------------------------------------------ Merged /incubator/ooo/branches/writer001:r1356067-1386577 Modified: incubator/ooo/trunk/main/sw/inc/tox.hxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/inc/tox.hxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/inc/tox.hxx (original) +++ incubator/ooo/trunk/main/sw/inc/tox.hxx Mon Sep 17 12:46:16 2012 @@ -501,6 +501,13 @@ class SW_DLLPUBLIC SwTOXBase : public Sw sal_Bool bFromObjectNames : 1; // create a table or object index // from the names rather than the caption sal_Bool bLevelFromChapter : 1; // User index: get the level from the source chapter + +protected: + // Add a data member, for record the TOC field expression of MS Word binary format + // For keeping fedality and may giving a better exporting performance + String maMSTOCExpression; + sal_Bool mbKeepExpression; + public: SwTOXBase( const SwTOXType* pTyp, const SwForm& rForm, sal_uInt16 nCreaType, const String& rTitle ); @@ -520,6 +527,12 @@ public: const String& GetTOXName() const {return aName;} void SetTOXName(const String& rSet) {aName = rSet;} + // for record the TOC field expression of MS Word binary format + const String& GetMSTOCExpression() const{return maMSTOCExpression;} + void SetMSTOCExpression(const String& rExp) {maMSTOCExpression = rExp;} + void EnableKeepExpression() {mbKeepExpression = sal_True;} + void DisableKeepExpression() {mbKeepExpression = sal_False;} + const String& GetTitle() const; // Title const String& GetTypeName() const; // Name const SwForm& GetTOXForm() const; // description of the lines Modified: incubator/ooo/trunk/main/sw/source/core/doc/doctxm.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/core/doc/doctxm.cxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/core/doc/doctxm.cxx (original) +++ incubator/ooo/trunk/main/sw/source/core/doc/doctxm.cxx Mon Sep 17 12:46:16 2012 @@ -793,19 +793,26 @@ sal_Bool SwTOXBaseSection::SetPosAtStart void SwTOXBaseSection::Update(const SfxItemSet* pAttr, const bool _bNewTOX )//swmodtest 080307 { - const SwSectionNode* pSectNd; - if( !SwTOXBase::GetRegisteredIn()->GetDepends() || - !GetFmt() || 0 == (pSectNd = GetFmt()->GetSectionNode() ) || - !pSectNd->GetNodes().IsDocNodes() || - IsHiddenFlag() ) - return; + const SwSectionNode* pSectNd; + if( !SwTOXBase::GetRegisteredIn()->GetDepends() || + !GetFmt() || 0 == (pSectNd = GetFmt()->GetSectionNode() ) || + !pSectNd->GetNodes().IsDocNodes() || + IsHiddenFlag() ) + { + return; + } + + if ( !mbKeepExpression ) + { + maMSTOCExpression = String(); + } - SwDoc* pDoc = (SwDoc*)pSectNd->GetDoc(); + SwDoc* pDoc = (SwDoc*)pSectNd->GetDoc(); DBG_ASSERT(pDoc != NULL, "Where is the document?"); - if(pAttr && pDoc && GetFmt()) - pDoc->ChgFmt(*GetFmt(), *pAttr); + if(pAttr && pDoc && GetFmt()) + pDoc->ChgFmt(*GetFmt(), *pAttr); // OD 18.03.2003 #106329# - determine default page description, which // will be used by the content nodes, if no approriate one is found. Modified: incubator/ooo/trunk/main/sw/source/core/tox/tox.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/core/tox/tox.cxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/core/tox/tox.cxx (original) +++ incubator/ooo/trunk/main/sw/source/core/tox/tox.cxx Mon Sep 17 12:46:16 2012 @@ -510,17 +510,19 @@ void SwForm::AdjustTabStops(SwDoc& rDoc, SwTOXBase::SwTOXBase(const SwTOXType* pTyp, const SwForm& rForm, sal_uInt16 nCreaType, const String& rTitle ) - : SwClient((SwModify*)pTyp), - aForm(rForm), - aTitle(rTitle), - eLanguage((LanguageType)::GetAppLanguage()), - nCreateType(nCreaType), - nOLEOptions(0), - eCaptionDisplay(CAPTION_COMPLETE), - bProtected( sal_True ), - bFromChapter(sal_False), - bFromObjectNames(sal_False), - bLevelFromChapter(sal_False) + : SwClient((SwModify*)pTyp) + , aForm(rForm) + , aTitle(rTitle) + , eLanguage((LanguageType)::GetAppLanguage()) + , nCreateType(nCreaType) + , nOLEOptions(0) + , eCaptionDisplay(CAPTION_COMPLETE) + , bProtected( sal_True ) + , bFromChapter(sal_False) + , bFromObjectNames(sal_False) + , bLevelFromChapter(sal_False) + , maMSTOCExpression() + , mbKeepExpression(sal_True) { aData.nOptions = 0; } @@ -528,6 +530,7 @@ SwTOXBase::SwTOXBase(const SwTOXType* pT SwTOXBase::SwTOXBase( const SwTOXBase& rSource, SwDoc* pDoc ) : SwClient( rSource.GetRegisteredInNonConst() ) + , mbKeepExpression(sal_True) { CopyTOXBase( pDoc, rSource ); } @@ -539,6 +542,7 @@ void SwTOXBase::RegisterToTOXType( SwTOX SwTOXBase& SwTOXBase::CopyTOXBase( SwDoc* pDoc, const SwTOXBase& rSource ) { + maMSTOCExpression = rSource.maMSTOCExpression; SwTOXType* pType = (SwTOXType*)rSource.GetTOXType(); if( pDoc && USHRT_MAX == pDoc->GetTOXTypes().GetPos( pType )) { Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/attributeoutputbase.hxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/attributeoutputbase.hxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/attributeoutputbase.hxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/attributeoutputbase.hxx Mon Sep 17 12:46:16 2012 @@ -187,7 +187,9 @@ public: void StartTOX( const SwSection& rSect ); - void EndTOX( const SwSection& rSect ); + void EndTOX( const SwSection& rSect,bool bCareEnd=true ); + + virtual void OnTOXEnding() {} virtual void TOXMark( const SwTxtNode& rNode, const SwTOXMark& rAttr ); Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/dump/ww8scan.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/dump/ww8scan.cxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/dump/ww8scan.cxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/dump/ww8scan.cxx Mon Sep 17 12:46:16 2012 @@ -3541,7 +3541,7 @@ bool WW8PLCFx_FLD::StartPosIsFieldStart( return true; } -bool WW8PLCFx_FLD::EndPosIsFieldEnd() +bool WW8PLCFx_FLD::EndPosIsFieldEnd(WW8_CP& nCP) { bool bRet = false; @@ -3554,7 +3554,10 @@ bool WW8PLCFx_FLD::EndPosIsFieldEnd() void* pData; long nTest; if ( pPLCF->Get(nTest, pData) && ((((sal_uInt8*)pData)[0] & 0x1f) == 0x15) ) + { + nCP = nTest; bRet = true; + } pPLCF->SetIdx(n); } Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/writerwordglue.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/writerwordglue.cxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/writerwordglue.cxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/writerwordglue.cxx Mon Sep 17 12:46:16 2012 @@ -522,6 +522,10 @@ namespace sw return true; if (nB == RES_TXTATR_CHARFMT) return false; + if (nA == RES_TXTATR_INETFMT) + return true; + if (nB == RES_TXTATR_INETFMT) + return false; return nA < nB; } Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/wrtw8nds.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/wrtw8nds.cxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/wrtw8nds.cxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/wrtw8nds.cxx Mon Sep 17 12:46:16 2012 @@ -1955,7 +1955,7 @@ void MSWordExportBase::OutputTextNode( c if ( pTOXSect ) { m_aCurrentCharPropStarts.pop(); - AttrOutput().EndTOX( *pTOXSect ); + AttrOutput().EndTOX( *pTOXSect ,false); } WriteCR( pTextNodeInfoInner ); } @@ -1993,6 +1993,7 @@ void MSWordExportBase::OutputTextNode( c aAttrIter.OutFlys( nEnd ); // insert final bookmarks if any before CR and after flys AppendBookmarks( rNode, nEnd, 1 ); + WriteCR( pTextNodeInfoInner ); if ( pTOXSect ) { @@ -2000,8 +2001,6 @@ void MSWordExportBase::OutputTextNode( c AttrOutput().EndTOX( *pTOXSect ); } - WriteCR( pTextNodeInfoInner ); - if ( bRedlineAtEnd ) { AttrOutput().Redline( aAttrIter.GetRedline( nEnd ) ); @@ -2523,7 +2522,8 @@ void MSWordExportBase::OutputSectionNode SwNodeIndex aIdx( rSectionNode, 1 ); const SwNode& rNd = aIdx.GetNode(); - if ( !rNd.IsSectionNode() && !IsInTable() ) //No sections in table + if ( !rNd.IsSectionNode() && !IsInTable() + && rSection.GetType() != TOX_CONTENT_SECTION && rSection.GetType() != TOX_HEADER_SECTION) //No sections in table { // Bug 74245 - if the first Node inside the section has an own // PageDesc or PageBreak attribut, then dont write Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/wrtww8.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/wrtww8.cxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/wrtww8.cxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/wrtww8.cxx Mon Sep 17 12:46:16 2012 @@ -33,6 +33,9 @@ #include +#include +#include + #include #include // memcpy() #include @@ -187,30 +190,143 @@ public: WW8_FC GetStartFc() const { return nStartFc; } }; +typedef std::map BKMKNames; +typedef BKMKNames::iterator BKMKNmItr; +typedef std::pair BKMK; +typedef std::pair BKMKCP; +typedef std::multimap BKMKCPs; +typedef BKMKCPs::iterator CPItr; + class WW8_WrtBookmarks { private: - SvULongs aSttCps, aEndCps; // Array of Start- and End CPs - SvBools aFieldMarks; // If the bookmark is in a field result - std::vector maSwBkmkNms; // Array of Sw - Bookmarknames - typedef std::vector::iterator myIter; - - sal_uInt16 GetPos( const String& rNm ); - - //No copying + BKMKCPs aSttCps,aEndCps; + BKMKNames maSwBkmkNms; WW8_WrtBookmarks(const WW8_WrtBookmarks&); WW8_WrtBookmarks& operator=(const WW8_WrtBookmarks&); + public: WW8_WrtBookmarks(); ~WW8_WrtBookmarks(); - void Append( WW8_CP nStartCp, const String& rNm, const ::sw::mark::IMark* pBkmk=NULL ); void Write( WW8Export& rWrt ); void MoveFieldMarks(sal_uLong nFrom,sal_uLong nTo); - -// String GetWWBkmkName( const String& rName ) const; }; +WW8_WrtBookmarks::WW8_WrtBookmarks() +{} + +WW8_WrtBookmarks::~WW8_WrtBookmarks() +{ + CPItr aEnd = aSttCps.end(); + for (CPItr aItr = aSttCps.begin();aItr!=aEnd;aItr++) + { + if (aItr->second) + { + delete aItr->second; + aItr->second = NULL; + } + } +} + +void WW8_WrtBookmarks::Append( WW8_CP nStartCp, const String& rNm, const ::sw::mark::IMark*) +{ + std::pair aResult = maSwBkmkNms.insert(std::pair(rNm,0L)); + if (aResult.second) + { + BKMK aBK(false,rNm); + BKMKCP* pBKCP = new BKMKCP((long)nStartCp,aBK); + aSttCps.insert(std::pair(nStartCp,pBKCP)); + aResult.first->second = (long)nStartCp; + } + else + { + std::pair aRange = aSttCps.equal_range(aResult.first->second); + for (CPItr aItr = aRange.first;aItr != aRange.second;aItr++) + { + if (aItr->second && aItr->second->second.second == rNm) + { + if (aItr->second->second.first) + nStartCp--; + aItr->second->first = (long)nStartCp; + break; + } + } + } +} + +void WW8_WrtBookmarks::Write( WW8Export& rWrt) +{ + if (!aSttCps.size()) + return; + CPItr aItr; + long n; + std::vector aNames; + SvMemoryStream aTempStrm1(65535,65535); + SvMemoryStream aTempStrm2(65535,65535); + for (aItr = aSttCps.begin();aItr!=aSttCps.end();aItr++) + { + if (aItr->second) + { + aEndCps.insert(std::pair(aItr->second->first,aItr->second)); + aNames.push_back(aItr->second->second.second); + SwWW8Writer::WriteLong( aTempStrm1, aItr->first); + } + } + + aTempStrm1.Seek(0L); + for (aItr = aEndCps.begin(), n = 0;aItr != aEndCps.end();aItr++,n++) + { + if (aItr->second) + { + aItr->second->first = n; + SwWW8Writer::WriteLong( aTempStrm2, aItr->first); + } + } + + aTempStrm2.Seek(0L); + rWrt.WriteAsStringTable(aNames, rWrt.pFib->fcSttbfbkmk,rWrt.pFib->lcbSttbfbkmk); + SvStream& rStrm = rWrt.bWrtWW8 ? *rWrt.pTableStrm : rWrt.Strm(); + rWrt.pFib->fcPlcfbkf = rStrm.Tell(); + rStrm<ccpText + rWrt.pFib->ccpTxbx); + for (aItr = aSttCps.begin();aItr!=aSttCps.end();aItr++) + { + if (aItr->second) + { + SwWW8Writer::WriteLong(rStrm, aItr->second->first); + } + } + rWrt.pFib->lcbPlcfbkf = rStrm.Tell() - rWrt.pFib->fcPlcfbkf; + rWrt.pFib->fcPlcfbkl = rStrm.Tell(); + rStrm<ccpText + rWrt.pFib->ccpTxbx); + rWrt.pFib->lcbPlcfbkl = rStrm.Tell() - rWrt.pFib->fcPlcfbkl; +} + +void WW8_WrtBookmarks::MoveFieldMarks(sal_uLong nFrom,sal_uLong nTo) +{ + std::pair aRange = aSttCps.equal_range(nFrom); + CPItr aItr = aRange.first; + while (aItr != aRange.second) + { + if (aItr->second) + { + if (aItr->second->first == nFrom) + { + aItr->second->second.first = true; + aItr->second->first = nTo; + } + aSttCps.insert(std::pair(nTo,aItr->second)); + aItr->second = NULL; + aRange = aSttCps.equal_range(nFrom); + aItr = aRange.first; + continue; + } + aItr++; + } +} + #define ANZ_DEFAULT_STYLES 16 // die Namen der StorageStreams @@ -1253,136 +1369,6 @@ WW8_CP WW8_WrPct::Fc2Cp( sal_uLong nFc ) return nFc + pPcts->GetObject( pPcts->Count() - 1 )->GetStartCp(); } -//-------------------------------------------------------------------------- -/* */ - -WW8_WrtBookmarks::WW8_WrtBookmarks() - : aSttCps( 0, 16 ), aEndCps( 0, 16 ) -{ -} - -WW8_WrtBookmarks::~WW8_WrtBookmarks() -{ -} - -void WW8_WrtBookmarks::Append( WW8_CP nStartCp, const String& rNm, const ::sw::mark::IMark* ) -{ - sal_uInt16 nPos = GetPos( rNm ); - if( USHRT_MAX == nPos ) - { - // new -> insert as start position - nPos = aSttCps.Count(); - myIter aIter = maSwBkmkNms.end(); - // sort by startposition - // theory: write continuous -> then the new position is at end - while( nPos && aSttCps[ nPos - 1 ] > sal_uLong( nStartCp )) - { - --nPos; - --aIter; - } - - aSttCps.Insert(nStartCp, nPos); - aEndCps.Insert(nStartCp, nPos); - aFieldMarks.insert(aFieldMarks.begin() + nPos, sal_Bool(false)); - maSwBkmkNms.insert(aIter, rNm); - } - else - { - // old -> its the end position - ASSERT( aEndCps[ nPos ] == aSttCps[ nPos ], "end position is valid" ); - - //If this bookmark was around a field in writer, then we want to move - //it to the field result in word. The end is therefore one cp - //backwards from the 0x15 end mark that was inserted. - if (aFieldMarks[nPos]) - --nStartCp; - - aEndCps.Replace( nStartCp, nPos ); - } -} - - -void WW8_WrtBookmarks::Write( WW8Export& rWrt ) -{ - sal_uInt16 nCount = aSttCps.Count(), i; - if( nCount ) - { - SvULongs aEndSortTab( 255 < nCount ? 255 : nCount, 4 ); - // sort then endpositions - for( i = 0; i < nCount; ++i ) - { - sal_uLong nCP = aEndCps[ i ]; - sal_uInt16 nPos = i; - while( nPos && aEndSortTab[ nPos - 1 ] > nCP ) - --nPos; - aEndSortTab.Insert( nCP, nPos ); - } - - // we have some bookmarks found in the document -> write them - // first the Bookmark Name Stringtable - rWrt.WriteAsStringTable(maSwBkmkNms, rWrt.pFib->fcSttbfbkmk, - rWrt.pFib->lcbSttbfbkmk); - - // second the Bookmark start positions as pcf of longs - SvStream& rStrm = rWrt.bWrtWW8 ? *rWrt.pTableStrm : rWrt.Strm(); - rWrt.pFib->fcPlcfbkf = rStrm.Tell(); - for( i = 0; i < nCount; ++i ) - SwWW8Writer::WriteLong( rStrm, aSttCps[ i ] ); - SwWW8Writer::WriteLong(rStrm, rWrt.pFib->ccpText + rWrt.pFib->ccpTxbx); - for( i = 0; i < nCount; ++i ) - { - sal_uLong nEndCP = aEndCps[ i ]; - sal_uInt16 nPos = i; - if( aEndSortTab[ nPos ] > nEndCP ) - { - while( aEndSortTab[ --nPos ] != nEndCP ) - ; - } - else if( aEndSortTab[ nPos ] < nEndCP ) - while( aEndSortTab[ ++nPos ] != nEndCP ) - ; - - SwWW8Writer::WriteLong( rStrm, nPos ); - } - rWrt.pFib->lcbPlcfbkf = rStrm.Tell() - rWrt.pFib->fcPlcfbkf; - - // third the Bookmark end positions - rWrt.pFib->fcPlcfbkl = rStrm.Tell(); - for( i = 0; i < nCount; ++i ) - SwWW8Writer::WriteLong( rStrm, aEndSortTab[ i ] ); - SwWW8Writer::WriteLong(rStrm, rWrt.pFib->ccpText + rWrt.pFib->ccpTxbx); - rWrt.pFib->lcbPlcfbkl = rStrm.Tell() - rWrt.pFib->fcPlcfbkl; - } -} - -sal_uInt16 WW8_WrtBookmarks::GetPos( const String& rNm ) -{ - sal_uInt16 nRet = USHRT_MAX, n; - for (n = 0; n < aSttCps.Count(); ++n) - if (rNm == maSwBkmkNms[n]) - { - nRet = n; - break; - } - return nRet; -} - -void WW8_WrtBookmarks::MoveFieldMarks(sal_uLong nFrom, sal_uLong nTo) -{ - for (sal_uInt16 nI=0;nIAppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->Count(), m_rWW8Export.pO->GetData() ); + m_rWW8Export.pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell() - (mbOnTOXEnding?2:0), m_rWW8Export.pO->Count(), m_rWW8Export.pO->GetData() ); + mbOnTOXEnding = false; m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() ); // delete if ( pTextNodeInfoInner.get() != NULL ) @@ -1014,6 +1015,11 @@ void WW8AttributeOutput::StartRun( const } } +void WW8AttributeOutput::OnTOXEnding() +{ + mbOnTOXEnding = true; +} + void WW8AttributeOutput::EndRunProperties( const SwRedlineData* pRedlineData ) { Redline( pRedlineData ); @@ -2106,347 +2112,289 @@ void AttributeOutputBase::StartTOX( cons static const sal_Char sEntryEnd[] = "\" "; ww::eField eCode = ww::eTOC; - String sStr; - switch (pTOX->GetType()) + String sStr = pTOX->GetMSTOCExpression(); + if ( !sStr.Len() ) { - case TOX_INDEX: - eCode = ww::eINDEX; - sStr = FieldString(eCode); - - if (pTOX->GetTOXForm().IsCommaSeparated()) - sStr.APPEND_CONST_ASC("\\r "); - - if (nsSwTOIOptions::TOI_ALPHA_DELIMITTER & pTOX->GetOptions()) - sStr.APPEND_CONST_ASC("\\h \"A\" "); - + switch (pTOX->GetType()) { - String aFillTxt; - for (sal_uInt8 n = 1; n <= 3; ++n) - { - String aTxt; - int nRet = ::lcl_CheckForm(pTOX->GetTOXForm(), n, aTxt); + case TOX_INDEX: + eCode = ww::eINDEX; + sStr = FieldString(eCode); - if( 3 == nRet ) - aFillTxt = aTxt; - else if ((4 == nRet) || (2 == nRet)) //#109414# - aFillTxt = '\t'; - else - aFillTxt.Erase(); - } - sStr.APPEND_CONST_ASC("\\e \""); - sStr += aFillTxt; - sStr.AppendAscii(sEntryEnd); - } - break; + if (pTOX->GetTOXForm().IsCommaSeparated()) + sStr.APPEND_CONST_ASC("\\r "); -// case TOX_AUTHORITIES: eCode = eTOA; sStr = ???; break; + if (nsSwTOIOptions::TOI_ALPHA_DELIMITTER & pTOX->GetOptions()) + sStr.APPEND_CONST_ASC("\\h \"A\" "); - case TOX_ILLUSTRATIONS: - case TOX_OBJECTS: - case TOX_TABLES: - if (!pTOX->IsFromObjectNames()) - { - sStr = FieldString(eCode); - - sStr.APPEND_CONST_ASC("\\c \""); - sStr += pTOX->GetSequenceName(); - sStr.AppendAscii(sEntryEnd); - - String aTxt; - int nRet = ::lcl_CheckForm( pTOX->GetTOXForm(), 1, aTxt ); - if (1 == nRet) - sStr.APPEND_CONST_ASC("\\n "); - else if( 3 == nRet || 4 == nRet ) { - sStr.APPEND_CONST_ASC("\\p \""); - sStr += aTxt; + String aFillTxt; + for (sal_uInt8 n = 1; n <= 3; ++n) + { + String aTxt; + int nRet = ::lcl_CheckForm(pTOX->GetTOXForm(), n, aTxt); + + if( 3 == nRet ) + aFillTxt = aTxt; + else if ((4 == nRet) || (2 == nRet)) //#109414# + aFillTxt = '\t'; + else + aFillTxt.Erase(); + } + sStr.APPEND_CONST_ASC("\\e \""); + sStr += aFillTxt; sStr.AppendAscii(sEntryEnd); } - } - break; - -// case TOX_USER: -// case TOX_CONTENT: - default: - { - sStr = FieldString(eCode); + break; - String sTOption; - sal_uInt16 n, nTOXLvl = pTOX->GetLevel(); - if( !nTOXLvl ) - ++nTOXLvl; + // case TOX_AUTHORITIES: eCode = eTOA; sStr = ???; break; - if( nsSwTOXElement::TOX_MARK & pTOX->GetCreateType() ) + case TOX_ILLUSTRATIONS: + case TOX_OBJECTS: + case TOX_TABLES: + if (!pTOX->IsFromObjectNames()) { - sStr.APPEND_CONST_ASC( "\\f " ); + sStr = FieldString(eCode); + + sStr.APPEND_CONST_ASC("\\c \""); + sStr += pTOX->GetSequenceName(); + sStr.AppendAscii(sEntryEnd); - if( TOX_USER == pTOX->GetType() ) + String aTxt; + int nRet = ::lcl_CheckForm( pTOX->GetTOXForm(), 1, aTxt ); + if (1 == nRet) + sStr.APPEND_CONST_ASC("\\n "); + else if( 3 == nRet || 4 == nRet ) { - sStr += '\"'; - sStr += (sal_Char)( 'A' + GetExport( ).GetId( *pTOX->GetTOXType() ) ); - sStr.AppendAscii( sEntryEnd ); + sStr.APPEND_CONST_ASC("\\p \""); + sStr += aTxt; + sStr.AppendAscii(sEntryEnd); } + } + break; - if( nsSwTOXElement::TOX_OUTLINELEVEL & pTOX->GetCreateType() ) + // case TOX_USER: + // case TOX_CONTENT: + default: { - // --> OD 2009-02-27 #i99641# - // The following code does not determine the minimum outline - // level for the TOC -// // Search over all the outline styles used and figure out -// // what is the minimum outline level we need to display -// // (ignoring headline styles 1-9) -// //sal_uInt8 nLvl = 0, nMinLvl = 0; //#outline level, removed by zhaojianwei -// int nLvl = 0, nMinLvl = 0; //<-end,add by zhaojianwei -// const SwTxtFmtColls& rColls = *GetExport().pDoc->GetTxtFmtColls(); -// const SwTxtFmtColl* pColl; -// for( n = rColls.Count(); n; ) -// { -// pColl = rColls[ --n ]; -// //nLvl = pColl->GetOutlineLevel(); //#outline level,zhaojianwei -// //sal_uInt16 nPoolId = pColl->GetPoolFmtId(); -// //if( MAXLEVEL > nLvl && nMinLvl < nLvl && //<-end, ->add by zhaojianwei -// sal_uInt16 nPoolId = pColl->GetPoolFmtId(); -// if( pColl->IsAssignedToListLevelOfOutlineStyle() && -// nMinLvl < (nLvl = pColl->GetAssignedOutlineStyleLevel()) && //<-end,zhaojianwei -// ( RES_POOLCOLL_HEADLINE1 > nPoolId || -// RES_POOLCOLL_HEADLINE9 < nPoolId )) -// { -// // If we are using the default heading styles then use nTOXLvl -// if(!nMinLvl) -// nLvl = nTOXLvl; -// else -// nLvl = nMinLvl < nTOXLvl ? nMinLvl : (sal_uInt8)nTOXLvl; -// nMinLvl = nLvl; -// } -// } - const int nMinLvl = nTOXLvl; + sStr = FieldString(eCode); + + String sTOption; + sal_uInt16 n, nTOXLvl = pTOX->GetLevel(); + if( !nTOXLvl ) + ++nTOXLvl; -// if( nLvl ) - if ( nMinLvl > 0 ) + if( nsSwTOXElement::TOX_MARK & pTOX->GetCreateType() ) { - int nTmpLvl = nMinLvl; - if (nTmpLvl > WW8ListManager::nMaxLevel) - nTmpLvl = WW8ListManager::nMaxLevel; + sStr.APPEND_CONST_ASC( "\\f " ); - sStr.APPEND_CONST_ASC( "\\o \"1-" ); - sStr += String::CreateFromInt32( nTmpLvl ); - sStr.AppendAscii(sEntryEnd); + if( TOX_USER == pTOX->GetType() ) + { + sStr += '\"'; + sStr += (sal_Char)( 'A' + GetExport( ).GetId( *pTOX->GetTOXType() ) ); + sStr.AppendAscii( sEntryEnd ); + } - } - // <-- + if( nsSwTOXElement::TOX_OUTLINELEVEL & pTOX->GetCreateType() ) + { + const int nMinLvl = nTOXLvl; + if ( nMinLvl > 0 ) + { + int nTmpLvl = nMinLvl; + if (nTmpLvl > WW8ListManager::nMaxLevel) + nTmpLvl = WW8ListManager::nMaxLevel; + + sStr.APPEND_CONST_ASC( "\\o \"1-" ); + sStr += String::CreateFromInt32( nTmpLvl ); + sStr.AppendAscii(sEntryEnd); - // --> OD 2009-02-27 #i99641# - // not needed to additional export paragraph style with - // an outline level to the /t option -// if( nMinLvl > 0 ) -// // <-- -// { -// // collect this templates into the \t otion -// const SwTxtFmtColls& rColls = *pDoc->GetTxtFmtColls(); -// const SwTxtFmtColl* pColl; -// int nLvl = 0; -// for( n = rColls.Count(); n;) -// { -// pColl = rColls[--n]; -// //nLvl = pColl->GetOutlineLevel(); //#outline level, removed by zhaojianwei -// //if (MAXLEVEL > nLvl && nMinLvl <= nLvl) -// //{ //<-end, ->add by zhaojianwei -// if( pColl->IsAssignedToListLevelOfOutlineStyle() && -// nMinLvl <= ( nLvl = pColl->GetAssignedOutlineStyleLevel())) -// { //<-end,zhaojianwei -// if( sTOption.Len() ) -// sTOption += ';'; -// (( sTOption += pColl->GetName() ) += ';' ) -// += String::CreateFromInt32( nLvl + 1 ); -// } -// } -// } + } + } - } - - if( nsSwTOXElement::TOX_OUTLINELEVEL & pTOX->GetCreateType() ) - { - // Take the TOC value of the max level to evaluate to as - // the starting point for the \o flag, but reduce it to the - // value of the highest outline level filled by a *standard* - // Heading 1 - 9 style because \o "Builds a table of - // contents from paragraphs formatted with built-in heading - // styles". And afterward fill in any outline styles left - // uncovered by that range to the \t flag - // - // i.e. for - // Heading 1 - // Heading 2 - // custom-style - // Heading 4 - // output - // \o 1-2 \tcustom-style,3,Heading 3,4 - - // Search over all the outline styles used and figure out - // what is the minimum outline level (if any) filled by a - // non-standard style for that level, i.e. ignore headline - // styles 1-9 and find the lowest valid outline level - sal_uInt8 nPosOfLowestNonStandardLvl = MAXLEVEL; - const SwTxtFmtColls& rColls = *GetExport().pDoc->GetTxtFmtColls(); - for( n = rColls.Count(); n; ) - { - const SwTxtFmtColl* pColl = rColls[ --n ]; - sal_uInt16 nPoolId = pColl->GetPoolFmtId(); - if ( - //Is a Non-Standard Outline Style - (RES_POOLCOLL_HEADLINE1 > nPoolId || RES_POOLCOLL_HEADLINE9 < nPoolId) && - //Has a valid outline level - (pColl->IsAssignedToListLevelOfOutlineStyle()) && - // Is less than the lowest known non-standard level - (pColl->GetAssignedOutlineStyleLevel() < nPosOfLowestNonStandardLvl) - ) - { - nPosOfLowestNonStandardLvl = ::sal::static_int_cast(pColl->GetAssignedOutlineStyleLevel()); - } - } - - sal_uInt8 nMaxMSAutoEvaluate = nPosOfLowestNonStandardLvl < nTOXLvl ? nPosOfLowestNonStandardLvl : (sal_uInt8)nTOXLvl; - - //output \o 1-X where X is the highest normal outline style to be included in the toc - if ( nMaxMSAutoEvaluate ) - { - if (nMaxMSAutoEvaluate > WW8ListManager::nMaxLevel) - nMaxMSAutoEvaluate = WW8ListManager::nMaxLevel; - - sStr.APPEND_CONST_ASC( "\\o \"1-" ); - sStr += String::CreateFromInt32( nMaxMSAutoEvaluate ); - sStr.AppendAscii(sEntryEnd); - } - - //collect up any other styles in the writer TOC which will - //not already appear in the MS TOC and place then into the - //\t option - if( nMaxMSAutoEvaluate < nTOXLvl ) - { - // collect this templates into the \t otion - for( n = rColls.Count(); n;) - { - const SwTxtFmtColl* pColl = rColls[ --n ]; - if (!pColl->IsAssignedToListLevelOfOutlineStyle()) - continue; - sal_uInt8 nTestLvl = ::sal::static_int_cast(pColl->GetAssignedOutlineStyleLevel()); - if (nTestLvl < nTOXLvl && nTestLvl >= nMaxMSAutoEvaluate) - { - if( sTOption.Len() ) - sTOption += ','; - (( sTOption += pColl->GetName() ) += ',' ) - += String::CreateFromInt32( nTestLvl + 1 ); - } - } - } - } - - if( nsSwTOXElement::TOX_TEMPLATE & pTOX->GetCreateType() ) - // --> OD 2009-02-27 #i99641# - // Consider additional styles regardless of TOX-outlinelevel - for( n = 0; n < MAXLEVEL; ++n ) - // <-- - { - const String& rStyles = pTOX->GetStyleNames( n ); - if( rStyles.Len() ) + if( nsSwTOXElement::TOX_OUTLINELEVEL & pTOX->GetCreateType() ) { - xub_StrLen nPos = 0; - String sLvl( ',' ); - sLvl += String::CreateFromInt32( n + 1 ); - do { - String sStyle( rStyles.GetToken( 0, - TOX_STYLE_DELIMITER, nPos )); - if( sStyle.Len() ) + // Take the TOC value of the max level to evaluate to as + // the starting point for the \o flag, but reduce it to the + // value of the highest outline level filled by a *standard* + // Heading 1 - 9 style because \o "Builds a table of + // contents from paragraphs formatted with built-in heading + // styles". And afterward fill in any outline styles left + // uncovered by that range to the \t flag + // + // i.e. for + // Heading 1 + // Heading 2 + // custom-style + // Heading 4 + // output + // \o 1-2 \tcustom-style,3,Heading 3,4 + + // Search over all the outline styles used and figure out + // what is the minimum outline level (if any) filled by a + // non-standard style for that level, i.e. ignore headline + // styles 1-9 and find the lowest valid outline level + sal_uInt8 nPosOfLowestNonStandardLvl = MAXLEVEL; + const SwTxtFmtColls& rColls = *GetExport().pDoc->GetTxtFmtColls(); + for( n = rColls.Count(); n; ) + { + const SwTxtFmtColl* pColl = rColls[ --n ]; + sal_uInt16 nPoolId = pColl->GetPoolFmtId(); + if ( + //Is a Non-Standard Outline Style + (RES_POOLCOLL_HEADLINE1 > nPoolId || RES_POOLCOLL_HEADLINE9 < nPoolId) && + //Has a valid outline level + (pColl->IsAssignedToListLevelOfOutlineStyle()) && + // Is less than the lowest known non-standard level + (pColl->GetAssignedOutlineStyleLevel() < nPosOfLowestNonStandardLvl) + ) { - SwTxtFmtColl* pColl = GetExport().pDoc->FindTxtFmtCollByName(sStyle); - if (!pColl->IsAssignedToListLevelOfOutlineStyle() || pColl->GetAssignedOutlineStyleLevel() < nTOXLvl) + nPosOfLowestNonStandardLvl = ::sal::static_int_cast(pColl->GetAssignedOutlineStyleLevel()); + } + } + + sal_uInt8 nMaxMSAutoEvaluate = nPosOfLowestNonStandardLvl < nTOXLvl ? nPosOfLowestNonStandardLvl : (sal_uInt8)nTOXLvl; + + //output \o 1-X where X is the highest normal outline style to be included in the toc + if ( nMaxMSAutoEvaluate ) + { + if (nMaxMSAutoEvaluate > WW8ListManager::nMaxLevel) + nMaxMSAutoEvaluate = WW8ListManager::nMaxLevel; + + sStr.APPEND_CONST_ASC( "\\o \"1-" ); + sStr += String::CreateFromInt32( nMaxMSAutoEvaluate ); + sStr.AppendAscii(sEntryEnd); + } + + //collect up any other styles in the writer TOC which will + //not already appear in the MS TOC and place then into the + //\t option + if( nMaxMSAutoEvaluate < nTOXLvl ) + { + // collect this templates into the \t otion + for( n = rColls.Count(); n;) + { + const SwTxtFmtColl* pColl = rColls[ --n ]; + if (!pColl->IsAssignedToListLevelOfOutlineStyle()) + continue; + sal_uInt8 nTestLvl = ::sal::static_int_cast(pColl->GetAssignedOutlineStyleLevel()); + if (nTestLvl < nTOXLvl && nTestLvl >= nMaxMSAutoEvaluate) { if( sTOption.Len() ) sTOption += ','; - ( sTOption += sStyle ) += sLvl; + (( sTOption += pColl->GetName() ) += ',' ) + += String::CreateFromInt32( nTestLvl + 1 ); } } - } while( STRING_NOTFOUND != nPos ); + } } - } - { - String aFillTxt; - sal_uInt8 nNoPgStt = MAXLEVEL, nNoPgEnd = MAXLEVEL; - bool bFirstFillTxt = true, bOnlyText = true; - for( n = 0; n < nTOXLvl; ++n ) - { - String aTxt; - int nRet = ::lcl_CheckForm( pTOX->GetTOXForm(), - static_cast< sal_uInt8 >(n+1), aTxt ); - if( 1 == nRet ) - { - bOnlyText = false; - if( MAXLEVEL == nNoPgStt ) - nNoPgStt = static_cast< sal_uInt8 >(n+1); - } - else - { - if( MAXLEVEL != nNoPgStt && - MAXLEVEL == nNoPgEnd ) - nNoPgEnd = sal_uInt8(n); + if( nsSwTOXElement::TOX_TEMPLATE & pTOX->GetCreateType() ) + // --> OD 2009-02-27 #i99641# + // Consider additional styles regardless of TOX-outlinelevel + for( n = 0; n < MAXLEVEL; ++n ) + // <-- + { + const String& rStyles = pTOX->GetStyleNames( n ); + if( rStyles.Len() ) + { + xub_StrLen nPos = 0; + String sLvl( ',' ); + sLvl += String::CreateFromInt32( n + 1 ); + do { + String sStyle( rStyles.GetToken( 0, + TOX_STYLE_DELIMITER, nPos )); + if( sStyle.Len() ) + { + SwTxtFmtColl* pColl = GetExport().pDoc->FindTxtFmtCollByName(sStyle); + if (!pColl->IsAssignedToListLevelOfOutlineStyle() || pColl->GetAssignedOutlineStyleLevel() < nTOXLvl) + { + if( sTOption.Len() ) + sTOption += ','; + ( sTOption += sStyle ) += sLvl; + } + } + } while( STRING_NOTFOUND != nPos ); + } + } + + { + String aFillTxt; + sal_uInt8 nNoPgStt = MAXLEVEL, nNoPgEnd = MAXLEVEL; + bool bFirstFillTxt = true, bOnlyText = true; + for( n = 0; n < nTOXLvl; ++n ) + { + String aTxt; + int nRet = ::lcl_CheckForm( pTOX->GetTOXForm(), + static_cast< sal_uInt8 >(n+1), aTxt ); + if( 1 == nRet ) + { + bOnlyText = false; + if( MAXLEVEL == nNoPgStt ) + nNoPgStt = static_cast< sal_uInt8 >(n+1); + } + else + { + if( MAXLEVEL != nNoPgStt && + MAXLEVEL == nNoPgEnd ) + nNoPgEnd = sal_uInt8(n); + + bOnlyText = bOnlyText && 3 == nRet; + if( 3 == nRet || 4 == nRet ) + { + if( bFirstFillTxt ) + aFillTxt = aTxt; + else if( aFillTxt != aTxt ) + aFillTxt.Erase(); + bFirstFillTxt = false; + } + } + } + if( MAXLEVEL != nNoPgStt ) + { + if (WW8ListManager::nMaxLevel < nNoPgEnd) + nNoPgEnd = WW8ListManager::nMaxLevel; + sStr.APPEND_CONST_ASC( "\\n " ); + sStr += String::CreateFromInt32( nNoPgStt ); + sStr += '-'; + sStr += String::CreateFromInt32( nNoPgEnd ); + sStr += ' '; + } + if( bOnlyText ) + { + sStr.APPEND_CONST_ASC( "\\p \"" ); + sStr += aFillTxt; + sStr.AppendAscii(sEntryEnd); + } + } - bOnlyText = bOnlyText && 3 == nRet; - if( 3 == nRet || 4 == nRet ) + if( sTOption.Len() ) { - if( bFirstFillTxt ) - aFillTxt = aTxt; - else if( aFillTxt != aTxt ) - aFillTxt.Erase(); - bFirstFillTxt = false; + sStr.APPEND_CONST_ASC( "\\t \"" ); + sStr += sTOption; + sStr.AppendAscii(sEntryEnd); } - } - } - if( MAXLEVEL != nNoPgStt ) - { - if (WW8ListManager::nMaxLevel < nNoPgEnd) - nNoPgEnd = WW8ListManager::nMaxLevel; - sStr.APPEND_CONST_ASC( "\\n " ); - sStr += String::CreateFromInt32( nNoPgStt ); - sStr += '-'; - sStr += String::CreateFromInt32( nNoPgEnd ); - sStr += ' '; - } - if( bOnlyText ) - { - sStr.APPEND_CONST_ASC( "\\p \"" ); - sStr += aFillTxt; - sStr.AppendAscii(sEntryEnd); - } - } - if( sTOption.Len() ) - { - sStr.APPEND_CONST_ASC( "\\t \"" ); - sStr += sTOption; - sStr.AppendAscii(sEntryEnd); + if (lcl_IsHyperlinked(pTOX->GetTOXForm(), nTOXLvl)) + sStr.APPEND_CONST_ASC("\\h"); + } + break; } - - if (lcl_IsHyperlinked(pTOX->GetTOXForm(), nTOXLvl)) - sStr.APPEND_CONST_ASC("\\h"); } - break; - } - } + } - if( sStr.Len() ) + if ( sStr.Len() ) { GetExport( ).bInWriteTOX = true; - GetExport( ).OutputField( 0, eCode, sStr, WRITEFIELD_START | WRITEFIELD_CMD_START | - WRITEFIELD_CMD_END ); + GetExport( ).OutputField( 0, eCode, sStr, + WRITEFIELD_START | WRITEFIELD_CMD_START | WRITEFIELD_CMD_END ); } } - + GetExport( ).bStartTOX = false; } -void AttributeOutputBase::EndTOX( const SwSection& rSect ) +void AttributeOutputBase::EndTOX( const SwSection& rSect,bool bCareEnd ) { const SwTOXBase* pTOX = rSect.GetTOXBase(); if ( pTOX ) @@ -2455,6 +2403,8 @@ void AttributeOutputBase::EndTOX( const GetExport( ).OutputField( 0, eCode, aEmptyStr, WRITEFIELD_CLOSE ); } GetExport( ).bInWriteTOX = false; + if (bCareEnd) + OnTOXEnding(); } bool MSWordExportBase::GetNumberFmt(const SwField& rFld, String& rStr) Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/ww8attributeoutput.hxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/ww8attributeoutput.hxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8attributeoutput.hxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8attributeoutput.hxx Mon Sep 17 12:46:16 2012 @@ -52,6 +52,8 @@ public: /// virtual void StartRun( const SwRedlineData* pRedlineData ); + virtual void OnTOXEnding(); + /// End of the text run. /// /// No-op for binary filters. @@ -435,8 +437,10 @@ protected: /// of the field results if we were forced to split text. sal_uInt16 m_nFieldResults; + bool mbOnTOXEnding; + public: - WW8AttributeOutput( WW8Export &rWW8Export ) : AttributeOutputBase(), m_rWW8Export( rWW8Export ) {} + WW8AttributeOutput( WW8Export &rWW8Export ) : AttributeOutputBase(), m_rWW8Export( rWW8Export ),mbOnTOXEnding(false) {} virtual ~WW8AttributeOutput() {} /// Return the right export class. 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=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.cxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.cxx Mon Sep 17 12:46:16 2012 @@ -2747,7 +2747,13 @@ bool SwWW8ImplReader::ReadChar(long nPos break; case 0x15: if( !bSpec ) // Juristenparagraph - cInsert = '\xa7'; + { + cp_set::iterator aItr = maTOXEndCps.find((WW8_CP)nPosCp); + if (aItr == maTOXEndCps.end()) + cInsert = '\xa7'; + else + maTOXEndCps.erase(aItr); + } break; case 0x9: cInsert = '\x9'; // Tab @@ -3166,14 +3172,28 @@ bool SwWW8ImplReader::ReadText(long nSta // create a new txtnode and join the two paragraphs together if (bStartLine && !pPreviousNode) // Zeilenende - { - //Modify here for #119405, by easyfan, 2012-05-24 - //We will record the CP of a paragraph end ('0x0D'), if current loading contents is from main stream; - if (mbOnLoadingMain) - maEndParaPos.push_back(l-1); - //End of modification, by easyfan - AppendTxtNode(*pPaM->GetPoint()); - } + { + bool bSplit = true; + if (mbCareFirstParaEndInToc) + { + mbCareFirstParaEndInToc = false; + if (pPaM->End() && pPaM->End()->nNode.GetNode().GetTxtNode() && pPaM->End()->nNode.GetNode().GetTxtNode()->Len() == 0) + bSplit = false; + } + if (mbCareLastParaEndInToc) + { + mbCareLastParaEndInToc = false; + if (pPaM->End() && pPaM->End()->nNode.GetNode().GetTxtNode() && pPaM->End()->nNode.GetNode().GetTxtNode()->Len() == 0) + bSplit = false; + } + if (bSplit) + { + // #119405# - We will record the CP of a paragraph end ('0x0D'), if current loading contents is from main stream; + if (mbOnLoadingMain) + maEndParaPos.push_back(l-1); + AppendTxtNode(*pPaM->GetPoint()); + } + } if (pPreviousNode && bStartLine) { @@ -3310,31 +3330,37 @@ bool SwWW8ImplReader::ReadText(long nSta SwWW8ImplReader::SwWW8ImplReader(sal_uInt8 nVersionPara, SvStorage* pStorage, SvStream* pSt, SwDoc& rD, const String& rBaseURL, bool bNewDoc) - : mpDocShell(rD.GetDocShell()), - maTracer(*(mpDocShell->GetMedium())), - pStg(pStorage), - pStrm(pSt), - pTableStream(0), - pDataStream(0), - rDoc(rD), - maSectionManager(*this), - maInsertedTables(rD), - maSectionNameGenerator(rD,CREATE_CONST_ASC("WW")), - maGrfNameGenerator(bNewDoc,String('G')), - maParaStyleMapper(rD), - maCharStyleMapper(rD), - maTxtNodesHavingFirstLineOfstSet(), - maTxtNodesHavingLeftIndentSet(), - pMSDffManager(0), - mpAtnNames(0), - pAuthorInfos(0), - sBaseURL(rBaseURL), - m_bRegardHindiDigits( false ), - mbNewDoc(bNewDoc), - nDropCap(0), - nIdctHint(0), - bBidi(false), - bReadTable(false) + : mpDocShell(rD.GetDocShell()) + , maTracer(*(mpDocShell->GetMedium())) + , pStg(pStorage) + , pStrm(pSt) + , pTableStream(0) + , pDataStream(0) + , rDoc(rD) + , maSectionManager(*this) + , maInsertedTables(rD) + , maSectionNameGenerator(rD,CREATE_CONST_ASC("WW")) + , maGrfNameGenerator(bNewDoc,String('G')) + , maParaStyleMapper(rD) + , maCharStyleMapper(rD) + , maTxtNodesHavingFirstLineOfstSet() + , maTxtNodesHavingLeftIndentSet() + , pMSDffManager(0) + , mpAtnNames(0) + , pAuthorInfos(0) + , sBaseURL(rBaseURL) + , m_bRegardHindiDigits( false ) + , mbNewDoc(bNewDoc) + , nDropCap(0) + , nIdctHint(0) + , bBidi(false) + , bReadTable(false) + , mbLoadingTOCCache(false) + , mbLoadingTOCHyperlink(false) + , mpPosAfterTOC(0) + , mbCareFirstParaEndInToc(false) + , mbCareLastParaEndInToc(false) + , maTOXEndCps() //Modify here for #119405, by easyfan, 2012-05-24 ,maCurrAttrCP(-1), mbOnLoadingMain(false) @@ -3660,11 +3686,11 @@ void wwSectionManager::InsertSegments() bool bInsertSection = (aIter != aStart) ? (aIter->IsContinous() && bThisAndPreviousAreCompatible): false; bool bInsertPageDesc = !bInsertSection; bool bProtected = SectionIsProtected(*aIter); // do we really need this ?? I guess I have a different logic in editshell which disales this... - if (bUseEnhFields && mrReader.pWDop->fProtEnabled && aIter->IsNotProtected()) { - // here we have the special case that the whole document is protected, with the execption of this section. - // I want to address this when I do the section rework, so for the moment we disable the overall protection then... - mrReader.rDoc.set(IDocumentSettingAccess::PROTECT_FORM, false ); - } + if (bUseEnhFields && mrReader.pWDop->fProtEnabled && aIter->IsNotProtected()) { + // here we have the special case that the whole document is protected, with the execption of this section. + // I want to address this when I do the section rework, so for the moment we disable the overall protection then... + mrReader.rDoc.set(IDocumentSettingAccess::PROTECT_FORM, false ); + } if (bInsertPageDesc) 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=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.hxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par.hxx Mon Sep 17 12:46:16 2012 @@ -798,9 +798,9 @@ struct WW8PostProcessAttrsInfo //----------------------------------------- // Storage-Reader //----------------------------------------- -//Modify here for #119405, by easyfan, 2012-05-24 +typedef std::set cp_set; + typedef std::vector cp_vector; -//End of modification, by easyfan class SwWW8ImplReader { @@ -1092,7 +1092,7 @@ private: // the very 1st Line Numbering and ignore the rest) bool bFirstPara; // first paragraph? - bool bFirstParaOfPage;//cs2c--xushanchuan add for bug11210 + bool bFirstParaOfPage;//cs2c--xushanchuan add for bug11210 bool bParaAutoBefore; bool bParaAutoAfter; @@ -1100,15 +1100,23 @@ private: int nDropCap; int nIdctHint; - bool bBidi; + bool bBidi; bool bReadTable; boost::shared_ptr mpTableEndPaM; - - //Modify here for #119405, by easyfan, 2012-05-24 - cp_vector maEndParaPos; - WW8_CP maCurrAttrCP; - bool mbOnLoadingMain:1; - //End of modification, by easyfan + // Indicate that currently on loading a TOC, managed by Read_F_TOX() and End_Field() + bool mbLoadingTOCCache; + // Indicate that current on loading a hyperlink, which is inside a TOC; Managed by Read_F_Hyperlink() and End_Field() + bool mbLoadingTOCHyperlink; + // a document position recorded the after-position of TOC section, managed by Read_F_TOX() and End_Field() + SwPaM* mpPosAfterTOC; + + bool mbCareFirstParaEndInToc; + bool mbCareLastParaEndInToc; + cp_set maTOXEndCps; + + cp_vector maEndParaPos; + WW8_CP maCurrAttrCP; + bool mbOnLoadingMain:1; //--------------------------------------------- const SprmReadInfo& GetSprmReadInfo(sal_uInt16 nId) const; 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=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par5.cxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par5.cxx Mon Sep 17 12:46:16 2012 @@ -86,8 +86,6 @@ #include // #i24377# -//#define WW_NATIVE_TOC 0 - #define MAX_FIELDLEN 64000 #define WW8_TOX_LEVEL_DELIM ':' @@ -317,13 +315,15 @@ long SwWW8ImplReader::Read_Book(WW8PLCFM return 0; } - //"_Toc*" and "_Hlt*" are unnecessary + // "_Hlt*" are unnecessary const String* pName = pB->GetName(); -#if !defined(WW_NATIVE_TOC) - if( !pName || pName->EqualsIgnoreCaseAscii( "_Toc", 0, 4 ) - || pName->EqualsIgnoreCaseAscii( "_Hlt", 0, 4 ) ) + // Now, as we read the TOC field completely, we also need the hyperlinks inside keep available. + // So the hidden bookmarks inside for hyperlink jumping also should be kept. + if ( !pName || + pName->EqualsIgnoreCaseAscii( "_Hlt", 0, 4 ) ) + { return 0; -#endif + } //JP 16.11.98: ToUpper darf auf keinen Fall gemacht werden, weil der //Bookmark- name ein Hyperlink-Ziel sein kann! @@ -662,7 +662,8 @@ sal_uInt16 SwWW8ImplReader::End_Field() sal_uInt16 nRet = 0; WW8PLCFx_FLD* pF = pPlcxMan->GetFld(); ASSERT(pF, "WW8PLCFx_FLD - Pointer nicht da"); - if (!pF || !pF->EndPosIsFieldEnd()) + WW8_CP nCP = 0; + if (!pF || !pF->EndPosIsFieldEnd(nCP)) return nRet; const SvtFilterOptions* pOpt = SvtFilterOptions::Get(); @@ -693,28 +694,43 @@ sal_uInt16 SwWW8ImplReader::End_Field() } } break; -#if defined(WW_NATIVE_TOC) - case 8: // TOX_INDEX - case 13: // TOX_CONTENT - case 88: // HYPERLINK - case 37: // REF - if (pPaM!=NULL && pPaM->GetPoint()!=NULL) { - - SwPosition aEndPos = *pPaM->GetPoint(); - SwPaM aFldPam( maFieldStack.back().GetPtNode(), maFieldStack.back().GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex()); - SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeFieldBookmark(aFldPam, maFieldStack.back().GetBookmarkName(), maFieldStack.back().GetBookmarkType()); - ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?"); - if (pFieldmark!=NULL) { - const IFieldmark::parameter_map_t& pParametersToAdd = maFieldStack.back().getParameters(); - pFieldmark->GetParameters()->insert(pParameters.begin(), pParameters.end()); - } - } - break; -#else + // Doing corresponding status management for TOC field, index field, hyperlink field and page reference field + case 13://TOX + case 8://index + if (mbLoadingTOCCache) + { + maTOXEndCps.insert(nCP); + mbLoadingTOCCache = false; + if ( pPaM->End() && + pPaM->End()->nNode.GetNode().GetTxtNode() && + pPaM->End()->nNode.GetNode().GetTxtNode()->Len() == 0 ) + { + JoinNode(*pPaM); + } + else + { + mbCareLastParaEndInToc = true; + } + + if (mpPosAfterTOC) + { + *pPaM = *mpPosAfterTOC; + delete mpPosAfterTOC; + mpPosAfterTOC = 0; + } + } + break; + case 37://REF + if (mbLoadingTOCCache && !mbLoadingTOCHyperlink) + { + pCtrlStck->SetAttr(*pPaM->GetPoint(),RES_TXTATR_INETFMT); + } + break; case 88: + if (mbLoadingTOCHyperlink) + mbLoadingTOCHyperlink = false; pCtrlStck->SetAttr(*pPaM->GetPoint(),RES_TXTATR_INETFMT); - break; -#endif + break; case 36: case 68: //Move outside the section associated with this type of field @@ -732,19 +748,15 @@ bool AcceptableNestedField(sal_uInt16 nF { switch (nFieldCode) { -#if defined(WW_NATIVE_TOC) - case 8: // allow recursive field in TOC... - case 13: // allow recursive field in TOC... -#endif + case 8: // allow recursive field in TOC... + case 13: // allow recursive field in TOC... case 36: case 68: case 79: case 88: - // --> OD 2007-01-02 #b6504125# // Accept AutoTextList field as nested field. // Thus, the field result is imported as plain text. case 89: - // <-- return true; default: return false; @@ -2137,27 +2149,37 @@ eF_ResT SwWW8ImplReader::Read_F_PgRef( W _ReadFieldParams aReadParam( rStr ); while( -1 != ( nRet = aReadParam.SkipToNextToken() )) { - switch( nRet ) + if ( nRet == -2 && + !sOrigName.Len() ) { - case -2: - if( !sOrigName.Len() ) - sOrigName = aReadParam.GetResult(); - break; + sOrigName = aReadParam.GetResult(); } } String sName(GetMappedBookmark(sOrigName)); -#if defined(WW_NATIVE_TOC) - if (1) { - ::rtl::OUString aBookmarkName=::rtl::OUString::createFromAscii("_REF"); - maFieldStack.back().SetBookmarkName(aBookmarkName); - maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ODF_PAGEREF)); - maFieldStack.back().AddParam(rtl::OUString(), sName); - return FLD_TEXT; + //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; + SwFmtINetFmt aURL( sURL, sTarget ); + String sLinkStyle = String::CreateFromAscii("Index Link"); + sal_uInt16 nPoolId = + SwStyleNameMapper::GetPoolIdFromUIName( sLinkStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ); + aURL.SetVisitedFmt(sLinkStyle); + aURL.SetINetFmt(sLinkStyle); + aURL.SetVisitedFmtId(nPoolId); + aURL.SetINetFmtId(nPoolId); + pCtrlStck->NewAttr( *pPaM->GetPoint(), aURL ); + } + return FLD_TEXT; } -#endif - SwGetRefField aFld( (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ), sName, @@ -2175,7 +2197,7 @@ bool ConvertMacroSymbol( const String& r if( rReference.EqualsAscii( "(" ) ) { bConverted = true; - sal_Unicode cSymbol; + sal_Unicode cSymbol = 0x0000; if( rName.EqualsAscii( "CheckIt" ) ) cSymbol = 0xF06F; else if( rName.EqualsAscii( "UncheckIt" ) ) @@ -2966,15 +2988,7 @@ sal_uInt16 lcl_GetMaxValidWordTOCLevel(c eF_ResT SwWW8ImplReader::Read_F_Tox( WW8FieldDesc* pF, String& rStr ) { -#if defined(WW_NATIVE_TOC) - if (1) { - ::rtl::OUString aBookmarkName=::rtl::OUString::createFromAscii("_TOC"); - maFieldStack.back().SetBookmarkName(aBookmarkName); - maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ODF_TOC)); -// maFieldStack.back().AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip); - return FLD_TEXT; - } -#endif + mbLoadingTOCCache = true; if (pF->nLRes < 3) return FLD_TEXT; // ignore (#i25440#) @@ -3105,6 +3119,7 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8 case TOX_CONTENT: { bool bIsHyperlink = false; + bool bShowPage = true; // TOX_OUTLINELEVEL setzen wir genau dann, wenn // die Parameter \o in 1 bis 9 liegen // oder der Parameter \f existiert @@ -3214,6 +3229,7 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8 case 'n': // don't print page numbers { // read START and END param + bShowPage = false; sal_uInt16 nStart, nEnd; if( !aReadParam.GetTokenSttFromTo( &nStart, &nEnd, WW8ListManager::nMaxLevel ) ) @@ -3276,27 +3292,37 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8 } } - if (bIsHyperlink) - { - SwForm aForm(pBase->GetTOXForm()); - sal_uInt16 nEnd = aForm.GetFormMax()-1; - SwFormToken aLinkStart(TOKEN_LINK_START); - SwFormToken aLinkEnd(TOKEN_LINK_END); + // For loading the expression of TOC field, we need to mapping its parameters to TOX entries tokens + // also include the hyperlinks and page references + SwFormToken aLinkStart(TOKEN_LINK_START); + SwFormToken aLinkEnd(TOKEN_LINK_END); + aLinkStart.sCharStyleName = String::CreateFromAscii("Index Link"); + aLinkEnd.sCharStyleName = String::CreateFromAscii("Index Link"); + SwForm aForm(pBase->GetTOXForm()); + sal_uInt16 nEnd = aForm.GetFormMax()-1; - // -> #i21237# - for(sal_uInt16 nLevel = 1; nLevel <= nEnd; ++nLevel) + for(sal_uInt16 nLevel = 1; nLevel <= nEnd; ++nLevel) + { + SwFormTokens aPattern = aForm.GetPattern(nLevel); + if ( bIsHyperlink ) { - SwFormTokens aPattern = aForm.GetPattern(nLevel); - aPattern.insert(aPattern.begin(), aLinkStart); - aPattern.push_back(aLinkEnd); - - aForm.SetPattern(nLevel, aPattern); - } - // <- #i21237# - pBase->SetTOXForm(aForm); + else if ( bShowPage ) + { + for (SwFormTokens::iterator aItr = aPattern.begin();aItr!= aPattern.end();aItr++) + { + if (aItr->eTokenType == TOKEN_PAGE_NUMS) + { + aPattern.insert(aItr,aLinkStart); + break; + } + } + } + aPattern.push_back(aLinkEnd); + aForm.SetPattern(nLevel, aPattern); } + pBase->SetTOXForm(aForm); if (!nMaxLevel) nMaxLevel = WW8ListManager::nMaxLevel; @@ -3413,8 +3439,8 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8 break; } // ToxBase fertig - // Update fuer TOX anstossen - rDoc.SetUpdateTOX(true); + // no Update of TOC anymore as its actual content is imported and kept. + //rDoc.SetUpdateTOX(true); // #i21237# // propagate tab stops from paragraph styles used in TOX to @@ -3423,6 +3449,14 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8 //#i10028# inserting a toc implicltly acts like a parabreak //in word and writer + + if ( pPaM->End() && + pPaM->End()->nNode.GetNode().GetTxtNode() && + pPaM->End()->nNode.GetNode().GetTxtNode()->Len() != 0 ) + { + mbCareFirstParaEndInToc = true; + } + if (pPaM->GetPoint()->nContent.GetIndex()) AppendTxtNode(*pPaM->GetPoint()); @@ -3453,14 +3487,22 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8 rDoc.InsertTableOf(*pPaM->GetPoint(), *aFltTOX.GetBase()); - //inserting a toc inserts a section before this point, so adjust pos - //for future page/section segment insertion + //The TOC field representation contents should be inserted into TOC section, but not after TOC section. + //So we need update the document position when loading TOC representation and after loading TOC; + if (mpPosAfterTOC) + { + delete mpPosAfterTOC; + } + mpPosAfterTOC = new SwPaM(*pPaM); + (*pPaM).Move(fnMoveBackward); SwPaM aRegion(*pPaM); - aRegion.Move(fnMoveBackward); + ASSERT(rDoc.GetCurTOX(*aRegion.GetPoint()), "Misunderstood how toc works"); if (SwTOXBase* pBase2 = (SwTOXBase*)rDoc.GetCurTOX(*aRegion.GetPoint())) { - if(nIndexCols>1) + pBase2->SetMSTOCExpression(rStr); + + if ( nIndexCols > 1 ) { // Set the column number for index SfxItemSet aSet( rDoc.GetAttrPool(), RES_COL, RES_COL ); @@ -3470,8 +3512,9 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8 pBase2->SetAttrSet( aSet ); } - maSectionManager.PrependedInlineNode(*pPaM->GetPoint(), - *aRegion.GetNode()); + // inserting a toc inserts a section before this point, so adjust pos + // for future page/section segment insertion + maSectionManager.PrependedInlineNode( *mpPosAfterTOC->GetPoint(), *aRegion.GetNode() ); } // Setze Ende in Stack @@ -3479,7 +3522,11 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8 if (!maApos.back()) //a para end in apo doesn't count bWasParaEnd = true; - return FLD_OK; + + //Return FLD_TEXT, instead of FLD_OK + //FLD_TEXT means the following content, commonly indicate the field representation content should be parsed + //FLD_OK means the current field loading is finished. The rest part should be ignored. + return FLD_TEXT; } eF_ResT SwWW8ImplReader::Read_F_Shape(WW8FieldDesc* /*pF*/, String& /*rStr*/) @@ -3494,16 +3541,6 @@ eF_ResT SwWW8ImplReader::Read_F_Shape(WW eF_ResT SwWW8ImplReader::Read_F_Hyperlink( WW8FieldDesc* /*pF*/, String& rStr ) { -#if defined(WW_NATIVE_TOC) - if (1) { - ::rtl::OUString aBookmarkName=::rtl::OUString::createFromAscii("_HYPERLINK"); - maFieldStack.back().SetBookmarkName(aBookmarkName); - maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ODF_HYPERLINK)); -// maFieldStack.back().AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip); - return FLD_TEXT; - } -#endif - String sURL, sTarget, sMark; bool bDataImport = false; //HYPERLINk "filename" [switches] @@ -3538,6 +3575,10 @@ eF_ResT SwWW8ImplReader::Read_F_Hyperlin if( sMark.Len() && '"' == sMark.GetChar( sMark.Len()-1 )) sMark.Erase( sMark.Len() - 1 ); + if (mbLoadingTOCCache) + { + mbLoadingTOCHyperlink = true;//on loading a TOC field nested hyperlink field + } } break; case 't': @@ -3563,6 +3604,17 @@ eF_ResT SwWW8ImplReader::Read_F_Hyperlin ( sURL += INET_MARK_TOKEN ) += sMark; SwFmtINetFmt aURL( sURL, sTarget ); + // If on loading TOC field, change the default style into the "index link" + if (mbLoadingTOCCache) + { + String sLinkStyle = String::CreateFromAscii("Index Link"); + sal_uInt16 nPoolId = + SwStyleNameMapper::GetPoolIdFromUIName( sLinkStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ); + aURL.SetVisitedFmt(sLinkStyle); + aURL.SetINetFmt(sLinkStyle); + aURL.SetVisitedFmtId(nPoolId); + aURL.SetINetFmtId(nPoolId); + } //As an attribute this needs to be closed, and that'll happen from //EndExtSprm in conjunction with the maFieldStack If there are are flyfrms Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par6.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par6.cxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par6.cxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8par6.cxx Mon Sep 17 12:46:16 2012 @@ -3884,6 +3884,15 @@ void SwWW8ImplReader::Read_CColl( sal_uI || pCollA[nId].bColl ) // oder Para-Style ? return; // dann ignorieren + // if current on loading a TOC field, and current trying to apply a hyperlink character style, + // just ignore. For the hyperlinks inside TOC in MS Word is not same with a common hyperlink + // Character styles: without underline and blue font color. And such type style will be applied in others + // processes. + if (mbLoadingTOCCache && pCollA[nId].GetWWStyleId() == ww::stiHyperlink) + { + return; + } + NewAttr( SwFmtCharFmt( (SwCharFmt*)pCollA[nId].pFmt ) ); nCharFmt = (short) nId; } Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.cxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.cxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.cxx Mon Sep 17 12:46:16 2012 @@ -3786,7 +3786,7 @@ bool WW8PLCFx_FLD::StartPosIsFieldStart( return true; } -bool WW8PLCFx_FLD::EndPosIsFieldEnd() +bool WW8PLCFx_FLD::EndPosIsFieldEnd(WW8_CP& nCP) { bool bRet = false; @@ -3799,7 +3799,10 @@ bool WW8PLCFx_FLD::EndPosIsFieldEnd() void* pData; sal_Int32 nTest; if ( pPLCF->Get(nTest, pData) && ((((sal_uInt8*)pData)[0] & 0x1f) == 0x15) ) + { + nCP = nTest; bRet = true; + } pPLCF->SetIdx(n); } @@ -4116,7 +4119,14 @@ WW8PLCFx& WW8PLCFx_Book::operator ++( in else if( l1 < l0 ) nIsEnd = 1; else - nIsEnd = ( nIsEnd ) ? 0 : 1; + { + const void * p = pBook[0]->GetData(pBook[0]->GetIdx()); + long nPairFor = (p == NULL)? 0L : SVBT16ToShort(*((SVBT16*) p)); + if (nPairFor == pBook[1]->GetIdx()) + nIsEnd = 0; + else + nIsEnd = ( nIsEnd ) ? 0 : 1; + } } return *this; } Modified: incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.hxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.hxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.hxx (original) +++ incubator/ooo/trunk/main/sw/source/filter/ww8/ww8scan.hxx Mon Sep 17 12:46:16 2012 @@ -701,7 +701,7 @@ public: virtual void GetSprms(WW8PLCFxDesc* p); virtual WW8PLCFx& operator ++( int ); bool StartPosIsFieldStart(); - bool EndPosIsFieldEnd(); + bool EndPosIsFieldEnd(WW8_CP&); bool GetPara(long nIdx, WW8FieldDesc& rF); }; Modified: incubator/ooo/trunk/main/sw/source/ui/index/toxmgr.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/ui/index/toxmgr.cxx?rev=1386590&r1=1386589&r2=1386590&view=diff ============================================================================== --- incubator/ooo/trunk/main/sw/source/ui/index/toxmgr.cxx (original) +++ incubator/ooo/trunk/main/sw/source/ui/index/toxmgr.cxx Mon Sep 17 12:46:16 2012 @@ -459,7 +459,9 @@ sal_Bool SwTOXMgr::UpdateOrInsertTOX(con if (pNewTOX != NULL) // => pTOX != NULL pDoc->ChgTOX(*pTOX, *pNewTOX); - bRet = pSh->UpdateTableOf(*pTOX, pSet); + pTOX->DisableKeepExpression(); + bRet = pSh->UpdateTableOf(*pTOX, pSet); + pTOX->EnableKeepExpression(); if (pDoc->GetIDocumentUndoRedo().DoesUndo()) { Propchange: incubator/ooo/trunk/test/ ------------------------------------------------------------------------------ Merged /incubator/ooo/branches/AOO34/test:r1346776-1346777,1347535,1348052,1350569,1352456,1369110,1371068 Merged /incubator/ooo/branches/writer001/test:r1386501-1386577 Merged /incubator/ooo/branches/alg/svgreplacement/test:r1205420-1220782 Merged /incubator/ooo/branches/alg/linecap/test:r1226811-1232461 Merged /incubator/ooo/trunk/test:r1353792-1374969 Propchange: incubator/ooo/trunk/test/testcommon/source/org/openoffice/test/vcl/ ------------------------------------------------------------------------------ Merged /incubator/ooo/branches/alg/linecap/main/test/testcommon/source/org/openoffice/test/vcl:r1226811-1232461 Merged /incubator/ooo/branches/AOO34/main/test/testcommon/source/org/openoffice/test/vcl:r1346776-1346777,1347535,1348052,1350569,1352456,1369110,1371068 Merged /incubator/ooo/branches/alg/svgreplacement/main/test/testcommon/source/org/openoffice/test/vcl:r1205420-1220782 Merged /incubator/ooo/branches/writer001/test/testcommon/source/org/openoffice/test/vcl:r1386501-1386577