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 A559ED26E for ; Tue, 28 Aug 2012 09:27:50 +0000 (UTC) Received: (qmail 31544 invoked by uid 500); 28 Aug 2012 09:27:50 -0000 Delivered-To: apmail-incubator-ooo-commits-archive@incubator.apache.org Received: (qmail 31387 invoked by uid 500); 28 Aug 2012 09:27:48 -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 31358 invoked by uid 99); 28 Aug 2012 09:27:48 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 28 Aug 2012 09:27:48 +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; Tue, 28 Aug 2012 09:27:46 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 9DE782388994; Tue, 28 Aug 2012 09:27:03 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1378038 - in /incubator/ooo/branches/writer001/main/sw/source/filter/ww8: ww8par.cxx ww8par.hxx ww8par5.cxx ww8par6.cxx Date: Tue, 28 Aug 2012 09:27:03 -0000 To: ooo-commits@incubator.apache.org From: orw@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120828092703.9DE782388994@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: orw Date: Tue Aug 28 09:27:02 2012 New Revision: 1378038 URL: http://svn.apache.org/viewvc?rev=1378038&view=rev Log: #119963# - WW8 import: import of actual TOC content - first part of TOC enhancement Patch by: zhengfan Review by: Oliver. Modified: incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.cxx incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.hxx incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par5.cxx incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par6.cxx Modified: incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.cxx?rev=1378038&r1=1378037&r2=1378038&view=diff ============================================================================== --- incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.cxx (original) +++ incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.cxx Tue Aug 28 09:27:02 2012 @@ -3245,31 +3245,34 @@ 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) { pStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); nWantedVersion = nVersionPara; Modified: incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.hxx URL: http://svn.apache.org/viewvc/incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.hxx?rev=1378038&r1=1378037&r2=1378038&view=diff ============================================================================== --- incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.hxx (original) +++ incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par.hxx Tue Aug 28 09:27:02 2012 @@ -1079,7 +1079,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; @@ -1087,9 +1087,15 @@ private: int nDropCap; int nIdctHint; - bool bBidi; + bool bBidi; bool bReadTable; boost::shared_ptr mpTableEndPaM; + // 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; //--------------------------------------------- Modified: incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par5.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par5.cxx?rev=1378038&r1=1378037&r2=1378038&view=diff ============================================================================== --- incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par5.cxx (original) +++ incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par5.cxx Tue Aug 28 09:27:02 2012 @@ -317,12 +317,16 @@ 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 @@ -711,9 +715,34 @@ sal_uInt16 SwWW8ImplReader::End_Field() } 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) + { + mbLoadingTOCCache = false; + if (pPaM->End() && pPaM->End()->nNode.GetNode().GetTxtNode() && pPaM->End()->nNode.GetNode().GetTxtNode()->Len() == 0) + JoinNode(*pPaM); + + 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; + break; #endif case 36: case 68: @@ -732,10 +761,10 @@ bool AcceptableNestedField(sal_uInt16 nF { switch (nFieldCode) { -#if defined(WW_NATIVE_TOC) +//#if defined(WW_NATIVE_TOC) case 8: // allow recursive field in TOC... case 13: // allow recursive field in TOC... -#endif +//#endif case 36: case 68: case 79: @@ -2129,6 +2158,7 @@ eF_ResT SwWW8ImplReader::Read_F_PgRef( W case -2: if( !sOrigName.Len() ) sOrigName = aReadParam.GetResult(); + break; } } @@ -2144,7 +2174,28 @@ eF_ResT SwWW8ImplReader::Read_F_PgRef( W return FLD_TEXT; } #endif - + //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; + } SwGetRefField aFld( (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ), sName, @@ -2162,7 +2213,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" ) ) @@ -2953,12 +3004,13 @@ sal_uInt16 lcl_GetMaxValidWordTOCLevel(c eF_ResT SwWW8ImplReader::Read_F_Tox( WW8FieldDesc* pF, String& rStr ) { + mbLoadingTOCCache = true; + #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 @@ -3263,27 +3315,35 @@ 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); - - // -> #i21237# - for(sal_uInt16 nLevel = 1; nLevel <= nEnd; ++nLevel) - { - SwFormTokens aPattern = aForm.GetPattern(nLevel); + // 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; + for(sal_uInt16 nLevel = 1; nLevel <= nEnd; ++nLevel) + { + SwFormTokens aPattern = aForm.GetPattern(nLevel); + if (bIsHyperlink) aPattern.insert(aPattern.begin(), aLinkStart); - aPattern.push_back(aLinkEnd); - - aForm.SetPattern(nLevel, aPattern); - + else + { + for (SwFormTokens::iterator aItr = aPattern.begin();aItr!= aPattern.end();aItr++) + { + if (aItr->eTokenType == TOKEN_PAGE_NUMS) + { + aPattern.insert(aItr,aLinkStart); + break; + } + } } - // <- #i21237# - pBase->SetTOXForm(aForm); + aPattern.push_back(aLinkEnd); + aForm.SetPattern(nLevel, aPattern); } + pBase->SetTOXForm(aForm); if (!nMaxLevel) nMaxLevel = WW8ListManager::nMaxLevel; @@ -3400,8 +3460,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 @@ -3440,10 +3500,19 @@ 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())) { @@ -3466,7 +3535,11 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8 if (!maApos.back()) //a para end in apo doesn't count bWasParaEnd = true; - return FLD_OK; + + //Reture 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*/) @@ -3525,6 +3598,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': @@ -3551,6 +3628,18 @@ eF_ResT SwWW8ImplReader::Read_F_Hyperlin 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 //between the start and begin, their hyperlinks will be set at that time Modified: incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par6.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par6.cxx?rev=1378038&r1=1378037&r2=1378038&view=diff ============================================================================== --- incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par6.cxx (original) +++ incubator/ooo/branches/writer001/main/sw/source/filter/ww8/ww8par6.cxx Tue Aug 28 09:27:02 2012 @@ -3875,6 +3875,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; }