diff options
author | Jian Hong Cheng <chengjh@apache.org> | 2012-08-24 02:28:19 +0000 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2013-03-14 10:08:38 +0100 |
commit | 1c22545edf9085b9f2656ca92781158b6b123db3 (patch) | |
tree | 17f2fdd4c1a2e672faea9f1c79fcae0890dd5ad5 /sw | |
parent | 83d61d9f1b0c95de2cd1199d3f60be70dfa92bec (diff) |
Fix issue #i119405: Numbering text style changed after importing the *.doc
* main/sw/inc/doc.hxx
* main/sw/inc/IDocumentContentOperations.hxx
* main/sw/inc/ndtxt.hxx
* main/sw/source/core/doc/docfmt.cxx
* main/sw/source/core/txtnode/thints.cxx
* main/sw/source/filter/inc/fltshell.hxx
* main/sw/source/filter/ww1/fltshell.cxx
* main/sw/source/filter/ww8/ww8par.cxx
* main/sw/source/filter/ww8/ww8par.hxx
* main/sw/source/filter/ww8/ww8par3.cxx
MS Word Binary compatibility
Patch by: Fan Zheng,<zheng.easyfan@gmail.com>
Found by: Jian Hong Cheng,<chengjh@apache.org>
Review by: Jian Hong Cheng,<chengjh@apache.org>
Conflicts:
sw/source/filter/inc/fltshell.hxx
sw/source/filter/ww1/fltshell.cxx
sw/source/filter/ww8/ww8par.cxx
sw/source/filter/ww8/ww8par.hxx
(cherry picked from commit ee3b12ab1d62faedcd2d62fcb8011b7454ea0474)
Change-Id: I2f72969a54db53e6a51edcf3a3216647cec9424c
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/IDocumentContentOperations.hxx | 2 | ||||
-rw-r--r-- | sw/inc/doc.hxx | 3 | ||||
-rw-r--r-- | sw/inc/ndtxt.hxx | 1 | ||||
-rw-r--r-- | sw/source/core/doc/docfmt.cxx | 54 | ||||
-rw-r--r-- | sw/source/core/txtnode/thints.cxx | 70 | ||||
-rw-r--r-- | sw/source/filter/inc/fltshell.hxx | 25 | ||||
-rw-r--r-- | sw/source/filter/ww1/fltshell.cxx | 91 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par.cxx | 64 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par.hxx | 16 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par3.cxx | 15 |
10 files changed, 324 insertions, 17 deletions
diff --git a/sw/inc/IDocumentContentOperations.hxx b/sw/inc/IDocumentContentOperations.hxx index e236102164ab..998bf6f6d349 100644 --- a/sw/inc/IDocumentContentOperations.hxx +++ b/sw/inc/IDocumentContentOperations.hxx @@ -165,7 +165,7 @@ sal_False. */ virtual bool InsertPoolItem(const SwPaM &rRg, const SfxPoolItem&, - const sal_uInt16 nFlags) = 0; + const sal_uInt16 nFlags,bool bExpandCharToPara=false) = 0; virtual bool InsertItemSet (const SwPaM &rRg, const SfxItemSet&, const sal_uInt16 nFlags) = 0; diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index 7f959455e798..a4bfb58d0b79 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -874,8 +874,9 @@ public: virtual SwDrawFrmFmt* Insert(const SwPaM &rRg, SdrObject& rDrawObj, const SfxItemSet* pFlyAttrSet, SwFrmFmt*); virtual SwFlyFrmFmt* Insert(const SwPaM &rRg, const svt::EmbeddedObjectRef& xObj, const SfxItemSet* pFlyAttrSet, const SfxItemSet* pGrfAttrSet, SwFrmFmt*); + //Add a para for the char attribute exp... virtual bool InsertPoolItem(const SwPaM &rRg, const SfxPoolItem&, - const SetAttrMode nFlags); + const SetAttrMode nFlags,bool bExpandCharToPara=false); virtual bool InsertItemSet (const SwPaM &rRg, const SfxItemSet&, const SetAttrMode nFlags); virtual void ReRead(SwPaM&, const String& rGrfName, const String& rFltName, const Graphic* pGraphic, const GraphicObject* pGrfObj); diff --git a/sw/inc/ndtxt.hxx b/sw/inc/ndtxt.hxx index eba1e5d6ae5e..e76eb69776e6 100644 --- a/sw/inc/ndtxt.hxx +++ b/sw/inc/ndtxt.hxx @@ -206,6 +206,7 @@ public: /// SMARTTAGS void SetSmartTags( SwWrongList* pNew, bool bDelete = true ); SwWrongList* GetSmartTags(); + bool TryCharSetExpandToNum(const SfxItemSet& pCharSet); /// End: Data collected during idle time diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx index 9fcc618439c3..582d52d48157 100644 --- a/sw/source/core/doc/docfmt.cxx +++ b/sw/source/core/doc/docfmt.cxx @@ -495,7 +495,7 @@ void SwDoc::ResetAttrs( const SwPaM &rRg, static bool lcl_InsAttr(SwDoc *const pDoc, const SwPaM &rRg, const SfxItemSet& rChgSet, - const SetAttrMode nFlags, SwUndoAttr *const pUndo) + const SetAttrMode nFlags, SwUndoAttr *const pUndo,bool bExpandCharToPara=false) { // Divide the Sets (for selections in Nodes) const SfxItemSet* pCharSet = 0; @@ -899,6 +899,24 @@ lcl_InsAttr(SwDoc *const pDoc, const SwPaM &rRg, const SfxItemSet& rChgSet, // Only selection in a Node. if( pStt->nNode == pEnd->nNode ) { + //The data parameter flag: bExpandCharToPara, comes from the data member of SwDoc, + //Which is set in SW MS word Binary filter WW8ImplRreader. With this flag on, means that + //current setting attribute set is a character range properties set and comes from a MS word + //binary file, And the setting range include a paragraph end position (0X0D); + //More specifications, as such property inside the character range properties set recorded in + //MS word binary file are dealed and inserted into data model (SwDoc) one by one, so we + //only dealing the scenario that the char properties set with 1 item inside; + + if (bExpandCharToPara && pCharSet && pCharSet->Count() ==1 ) + { + SwTxtNode* pCurrentNd = pStt->nNode.GetNode().GetTxtNode(); + + if (pCurrentNd) + { + pCurrentNd->TryCharSetExpandToNum(*pCharSet); + + } + } DELETECHARSETS return bRet; } @@ -1002,13 +1020,41 @@ lcl_InsAttr(SwDoc *const pDoc, const SwPaM &rRg, const SfxItemSet& rChgSet, ++nNodes; } + //The data parameter flag: bExpandCharToPara, comes from the data member of SwDoc, + //Which is set in SW MS word Binary filter WW8ImplRreader. With this flag on, means that + //current setting attribute set is a character range properties set and comes from a MS word + //binary file, And the setting range include a paragraph end position (0X0D); + //More specifications, as such property inside the character range properties set recorded in + //MS word binary file are dealed and inserted into data model (SwDoc) one by one, so we + //only dealing the scenario that the char properties set with 1 item inside; + if (bExpandCharToPara && pCharSet && pCharSet->Count() ==1) + { + SwPosition aStartPos (*rRg.Start()); + SwPosition aEndPos (*rRg.End()); + + if (aEndPos.nNode.GetNode().GetTxtNode() && aEndPos.nContent != aEndPos.nNode.GetNode().GetTxtNode()->Len()) + aEndPos.nNode--; + + for (;aStartPos<=aEndPos;aStartPos.nNode++) + { + SwTxtNode* pCurrentNd = aStartPos.nNode.GetNode().GetTxtNode(); + + if (pCurrentNd) + { + pCurrentNd->TryCharSetExpandToNum(*pCharSet); + + } + + } + } + DELETECHARSETS return (nNodes != 0) || bRet; } - +//Add a para for the char attribute exp... bool SwDoc::InsertPoolItem( const SwPaM &rRg, const SfxPoolItem &rHt, - const SetAttrMode nFlags ) + const SetAttrMode nFlags, bool bExpandCharToPara) { SwDataChanged aTmp( rRg ); SwUndoAttr* pUndoAttr = 0; @@ -1020,7 +1066,7 @@ bool SwDoc::InsertPoolItem( const SwPaM &rRg, const SfxPoolItem &rHt, SfxItemSet aSet( GetAttrPool(), rHt.Which(), rHt.Which() ); aSet.Put( rHt ); - bool bRet = lcl_InsAttr( this, rRg, aSet, nFlags, pUndoAttr ); + bool bRet = lcl_InsAttr( this, rRg, aSet, nFlags, pUndoAttr,bExpandCharToPara ); if (GetIDocumentUndoRedo().DoesUndo()) { diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx index 92d43f1fadb2..96ff07de161f 100644 --- a/sw/source/core/txtnode/thints.cxx +++ b/sw/source/core/txtnode/thints.cxx @@ -1606,6 +1606,76 @@ void SwTxtNode::DelSoftHyph( const xub_StrLen nStt, const xub_StrLen nEnd ) } } +//In MS Word, the font underline setting of the paragraph end position wont affect the formatting of numbering, so we ignore it +bool lcl_IsIgnoredCharFmtForNumbering(const sal_uInt16 nWhich) +{ + return (nWhich == RES_CHRATR_UNDERLINE); +} + +//In MS Word, following properties of the paragraph end position wont affect the formatting of bullets, so we ignore them: +//Font underline; +//Font Italic of Western, CJK and CTL; +//Font Bold of Wertern, CJK and CTL; +bool lcl_IsIgnoredCharFmtForBullets(const sal_uInt16 nWhich) +{ + return (nWhich == RES_CHRATR_UNDERLINE || nWhich == RES_CHRATR_POSTURE || nWhich == RES_CHRATR_WEIGHT + || nWhich == RES_CHRATR_CJK_POSTURE || nWhich == RES_CHRATR_CJK_WEIGHT + || nWhich == RES_CHRATR_CTL_POSTURE || nWhich == RES_CHRATR_CTL_WEIGHT); +} + +//Condition for expanding char set to character style of specified number rule level: +//The item inside the set should not conflict to any exist and non-default item inside paragraph properties set (SwCntntNode::SwPAttrSet); +//The node should have applied a number rule; +//The node should be counted in a list, if not, make it to be; +//The item should not conflict to any exist and non-default item inside the character of specified number rule level; +//The item should not be ignored depend on the exact number rule type; +bool SwTxtNode::TryCharSetExpandToNum(const SfxItemSet& aCharSet) +{ + bool bRet = false; + SfxItemIter aIter( aCharSet ); + const SfxPoolItem* pItem = aIter.FirstItem(); + const sal_uInt16 nWhich = pItem->Which(); + + const SfxPoolItem& rInnerItem = GetAttr(nWhich,false); + + if (!IsDefaultItem(&rInnerItem) && !IsInvalidItem(&rInnerItem)) + return bRet; + + if ( !IsInList() && GetNumRule() && GetListId().Len() > 0 ) + { + return bRet; + } + + SwNumRule* pCurrNum = GetNumRule(false); + + int nLevel = GetActualListLevel(); + + if (nLevel != -1 && pCurrNum) + { + const SwNumFmt* pCurrNumFmt = pCurrNum->GetNumFmt(static_cast<sal_uInt16>(nLevel)); + if (pCurrNumFmt) + { + if (pCurrNumFmt->IsItemize() && lcl_IsIgnoredCharFmtForBullets(nWhich)) + return bRet; + if (pCurrNumFmt->IsEnumeration() && lcl_IsIgnoredCharFmtForNumbering(nWhich)) + return bRet; + SwCharFmt* pCurrCharFmt =pCurrNumFmt->GetCharFmt(); + + if (pCurrCharFmt && pCurrCharFmt->GetItemState(nWhich,false) != SFX_ITEM_SET) + { + pCurrCharFmt->SetFmtAttr(*pItem); + SwNumFmt aNewNumFmt(*pCurrNumFmt); + aNewNumFmt.SetCharFmt(pCurrCharFmt); + pCurrNum->Set(nLevel,aNewNumFmt); + bRet = true; + } + } + } + + + return bRet; +} + // setze diese Attribute am TextNode. Wird der gesamte Bereich umspannt, // dann setze sie nur im AutoAttrSet (SwCntntNode:: SetAttr) sal_Bool SwTxtNode::SetAttr( const SfxItemSet& rSet, xub_StrLen nStt, diff --git a/sw/source/filter/inc/fltshell.hxx b/sw/source/filter/inc/fltshell.hxx index d4a789f1aad5..5ac61815d96c 100644 --- a/sw/source/filter/inc/fltshell.hxx +++ b/sw/source/filter/inc/fltshell.hxx @@ -111,6 +111,10 @@ public: sal_Bool bOpen; //Entry open, awaiting being closed sal_Bool bConsumedByField; + sal_Int32 mnStartCP; + sal_Int32 mnEndCP; + bool bIsParaEnd; + SW_DLLPUBLIC SwFltStackEntry(const SwPosition & rStartPos, SfxPoolItem* pHt ); SW_DLLPUBLIC ~SwFltStackEntry(); @@ -118,8 +122,16 @@ public: SW_DLLPUBLIC void SetEndPos( const SwPosition & rEndPos); SW_DLLPUBLIC bool MakeRegion(SwDoc* pDoc, SwPaM& rRegion, bool bCheck) const; SW_DLLPUBLIC static bool MakeRegion(SwDoc* pDoc, SwPaM& rRegion, - bool bCheck, const SwFltPosition &rMkPos, const SwFltPosition &rPtPos, + bool bCheck, const SwFltPosition &rMkPos, const SwFltPosition &rPtPos, bool bIsParaEnd=false, sal_uInt16 nWhich=0); + + void SetStartCP(sal_Int32 nCP) {mnStartCP = nCP;} + void SetEndCP(sal_Int32 nCP) {mnEndCP = nCP;} + sal_Int32 GetStartCP() const {return mnStartCP;} + sal_Int32 GetEndCP() const {return mnEndCP;} + bool IsAbleMakeRegion(); + bool IsParaEnd(){ return bIsParaEnd;} + void SetIsParaEnd(bool bArg){ bIsParaEnd = bArg;} }; class SW_DLLPUBLIC SwFltControlStack : private ::boost::noncopyable @@ -132,12 +144,23 @@ class SW_DLLPUBLIC SwFltControlStack : private ::boost::noncopyable sal_uLong nFieldFlags; KeyCode aEmptyKeyCode; // fuer Bookmarks +private: + bool bHasSdOD; + bool bSdODChecked; + protected: SwDoc* pDoc; bool bIsEndStack; void MoveAttrs( const SwPosition& rPos ); virtual void SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry& rEntry); + virtual sal_Int32 GetCurrAttrCP() const {return -1;} + virtual bool IsParaEndInCPs(sal_Int32 nStart,sal_Int32 nEnd,bool bSdOD=true) const; + + //Clear the para end position recorded in reader intermittently for the least impact on loading performance + virtual void ClearParaEndPosition(){}; + virtual bool CheckSdOD(sal_Int32 nStart,sal_Int32 nEnd); + bool HasSdOD(); public: enum Flags diff --git a/sw/source/filter/ww1/fltshell.cxx b/sw/source/filter/ww1/fltshell.cxx index 99b332de3bf2..8cb8a50c4c3a 100644 --- a/sw/source/filter/ww1/fltshell.cxx +++ b/sw/source/filter/ww1/fltshell.cxx @@ -81,6 +81,9 @@ static SwCntntNode* GetCntntNode(SwDoc* pDoc, SwNodeIndex& rIdx, bool bNext) SwFltStackEntry::SwFltStackEntry(const SwPosition& rStartPos, SfxPoolItem* pHt) : m_aMkPos(rStartPos) , m_aPtPos(rStartPos) + , mnStartCP(-1) + , mnEndCP(-1) + , bIsParaEnd(false) { pAttr = pHt; // speicher eine Kopie vom Attribut bOld = sal_False; // used for marking Attributes *before* skipping field results @@ -105,22 +108,26 @@ void SwFltStackEntry::SetEndPos(const SwPosition& rEndPos) m_aPtPos.SetPos(rEndPos); } + bool SwFltStackEntry::MakeRegion(SwDoc* pDoc, SwPaM& rRegion, bool bCheck, - const SwFltPosition &rMkPos, const SwFltPosition &rPtPos, + const SwFltPosition &rMkPos, const SwFltPosition &rPtPos, bool bIsParaEnd, sal_uInt16 nWhich) { // does this range actually contain something? // empty range is allowed if at start of empty paragraph // fields are special: never have range, so leave them + // + // The only position of 0x0D will not be able to make region in the old logic + // because it is beyond the length of para...need special consideration here. SwCntntNode *const pCntntNode( SwNodeIndex(rMkPos.m_nNode, +1).GetNode().GetCntntNode()); if (rMkPos == rPtPos && ((0 != rPtPos.m_nCntnt) || (pCntntNode && (0 != pCntntNode->Len()))) - && (RES_TXTATR_FIELD != nWhich)) + && (RES_TXTATR_FIELD != nWhich) + && !(bIsParaEnd && pCntntNode && pCntntNode->IsTxtNode() && 0 != pCntntNode->Len() )) { return false; } - // !!! Die Content-Indizies beziehen sich immer auf den Node !!! rRegion.GetPoint()->nNode = rMkPos.m_nNode.GetIndex() + 1; SwCntntNode* pCNd = GetCntntNode(pDoc, rRegion.GetPoint()->nNode, true); @@ -144,12 +151,12 @@ bool SwFltStackEntry::MakeRegion(SwDoc* pDoc, SwPaM& rRegion, bool bCheck, bool SwFltStackEntry::MakeRegion(SwDoc* pDoc, SwPaM& rRegion, bool bCheck) const { - return MakeRegion(pDoc, rRegion, bCheck, m_aMkPos, m_aPtPos, + return MakeRegion(pDoc, rRegion, bCheck, m_aMkPos, m_aPtPos, bIsParaEnd, pAttr->Which()); } SwFltControlStack::SwFltControlStack(SwDoc* pDo, sal_uLong nFieldFl) - : nFieldFlags(nFieldFl), pDoc(pDo), bIsEndStack(false) + : nFieldFlags(nFieldFl),bHasSdOD(true), bSdODChecked(false), pDoc(pDo), bIsEndStack(false) { } @@ -238,7 +245,11 @@ void SwFltControlStack::NewAttr(const SwPosition& rPos, const SfxPoolItem& rAttr pExtendCandidate->bOpen=true; } else - maEntries.push_back(new SwFltStackEntry(rPos, rAttr.Clone())); + { + SwFltStackEntry *pTmp = new SwFltStackEntry(rPos, rAttr.Clone() ); + pTmp->SetStartCP(GetCurrAttrCP()); + maEntries.push_back(pTmp); + } } void SwFltControlStack::DeleteAndDestroy(Entries::size_type nCnt) @@ -249,6 +260,14 @@ void SwFltControlStack::DeleteAndDestroy(Entries::size_type nCnt) myEIter aElement = maEntries.begin() + nCnt; maEntries.erase(aElement); } + //Clear the para end position recorded in reader intermittently for the least impact on loading performance + //Because the attributes handled based on the unit of para + if ( empty() ) + { + ClearParaEndPosition(); + bHasSdOD = true; + bSdODChecked = false; + } } // SwFltControlStack::StealAttr() loescht Attribute des angegebenen Typs vom Stack. @@ -343,6 +362,7 @@ SwFltStackEntry* SwFltControlStack::SetAttr(const SwPosition& rPos, { rEntry.bConsumedByField = consumedByField; rEntry.SetEndPos(rPos); + rEntry.SetEndCP(GetCurrAttrCP()); if (bLastEntry && nAttrId == rEntry.pAttr->Which()) { //potential candidate for merging with an identical @@ -446,6 +466,28 @@ static bool IterateNumrulePiece( const SwNodeIndex& rEnd, return rTmpStart <= rTmpEnd; // gueltig ? } +//***This function will check whether there is existing individual attribute positon for 0x0D***/ +//The check will happen only once for a paragraph during loading +bool SwFltControlStack::HasSdOD() +{ + bool bRet = false; + + for (Entries::iterator it = maEntries.begin(); it != maEntries.end(); ++it) + { + SwFltStackEntry& rEntry = *it; + if ( rEntry.mnStartCP == rEntry.mnEndCP ) + { + if ( CheckSdOD(rEntry.mnStartCP,rEntry.mnEndCP) ) + { + bRet = true; + break; + } + } + } + + return bRet; +} + void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry& rEntry) { @@ -628,14 +670,47 @@ void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, } break; default: - if (rEntry.MakeRegion(pDoc, aRegion, sal_False)) { - pDoc->InsertPoolItem(aRegion, *rEntry.pAttr, 0); + //Revised for more complex situations should be considered + if ( !bSdODChecked ) + { + bHasSdOD = HasSdOD(); + bSdODChecked = true; + } + sal_Int32 nStart = rEntry.GetStartCP(); + sal_Int32 nEnd = rEntry.GetEndCP(); + if (nStart != -1 && nEnd != -1 && nEnd >= nStart ) + { + rEntry.SetIsParaEnd( IsParaEndInCPs(nStart,nEnd,bHasSdOD) ); + } + if (rEntry.MakeRegion(pDoc, aRegion, sal_False)) + { + nStart = rEntry.GetStartCP(); + nEnd = rEntry.GetEndCP(); + if (rEntry.IsParaEnd()) + { + pDoc->InsertPoolItem(aRegion, *rEntry.pAttr, 0, true); + } + else + { + pDoc->InsertPoolItem(aRegion, *rEntry.pAttr, 0); + } + } } break; } } +bool SwFltControlStack::IsParaEndInCPs(sal_Int32 /*nStart*/, sal_Int32 /*nEnd*/,bool /*bSdOD*/) const +{ + return false; +} + +bool SwFltControlStack::CheckSdOD(sal_Int32 /*nStart*/, sal_Int32 /*nEnd*/) +{ + return false; +} + SfxPoolItem* SwFltControlStack::GetFmtStackAttr(sal_uInt16 nWhich, sal_uInt16 * pPos) { size_t nSize = maEntries.size(); diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index 8fa7f0cd7d9e..22c0c03069e1 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -1023,6 +1023,30 @@ const SwNumFmt* SwWW8FltControlStack::GetNumFmtFromStack(const SwPosition &rPos, return pRet; } +sal_Int32 SwWW8FltControlStack::GetCurrAttrCP() const +{ + return rReader.GetCurrAttrCP(); +} + +bool SwWW8FltControlStack::IsParaEndInCPs(sal_Int32 nStart,sal_Int32 nEnd,bool bSdOD) const +{ + return rReader.IsParaEndInCPs(nStart,nEnd,bSdOD); +} + +//Clear the para end position recorded in reader intermittently for the least impact on loading performance +void SwWW8FltControlStack::ClearParaEndPosition() +{ + if ( !empty() ) + return; + + rReader.ClearParaEndPosition(); +} + +bool SwWW8FltControlStack::CheckSdOD(sal_Int32 nStart,sal_Int32 nEnd) +{ + return rReader.IsParaEndInCPs(nStart,nEnd); +} + void SwWW8FltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry& rEntry) { @@ -3393,6 +3417,34 @@ long SwWW8ImplReader::ReadTextAttr(WW8_CP& rTxtPos, bool& rbStartLine) return nNext; } +//Revised 2012.8.16 for the complex attribute presentation of 0x0D in MS +bool SwWW8ImplReader::IsParaEndInCPs(sal_Int32 nStart, sal_Int32 nEnd,bool bSdOD) const +{ + //Revised for performance consideration + if (nStart == -1 || nEnd == -1 || nEnd < nStart ) + return false; + + for (cp_vector::const_reverse_iterator aItr = maEndParaPos.rbegin(); aItr!= maEndParaPos.rend(); aItr++) + { + //Revised 2012.8.16,to the 0x0D,the attribute will have two situations + //*********within***********exact******// + //*********but also sample with only left and the position of 0x0d is the edge of the right side***********// + if ( bSdOD && ( (nStart < *aItr && nEnd > *aItr) || ( nStart == nEnd && *aItr == nStart)) ) + return true; + else if ( !bSdOD && (nStart < *aItr && nEnd >= *aItr) ) + return true; + } + + return false; +} + +//Clear the para end position recorded in reader intermittently for the least impact on loading performance +void SwWW8ImplReader::ClearParaEndPosition() +{ + if ( maEndParaPos.size() > 0 ) + maEndParaPos.clear(); +} + void SwWW8ImplReader::ReadAttrs(WW8_CP& rNext, WW8_CP& rTxtPos, bool& rbStartLine) { if( rTxtPos >= rNext ) @@ -3400,6 +3452,7 @@ void SwWW8ImplReader::ReadAttrs(WW8_CP& rNext, WW8_CP& rTxtPos, bool& rbStartLin do { + maCurrAttrCP = rTxtPos; rNext = ReadTextAttr( rTxtPos, rbStartLine ); } while( rTxtPos >= rNext ); @@ -3483,7 +3536,12 @@ bool SwWW8ImplReader::ReadText(long nStartCp, long nTextLen, ManTypes nType) // create a new txtnode and join the two paragraphs together if (bStartLine && !pPreviousNode) // Zeilenende + { + //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) { @@ -3642,7 +3700,9 @@ SwWW8ImplReader::SwWW8ImplReader(sal_uInt8 nVersionPara, SvStorage* pStorage, nDropCap(0), nIdctHint(0), bBidi(false), - bReadTable(false) + bReadTable(false), + maCurrAttrCP(-1), + mbOnLoadingMain(false) { pStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); nWantedVersion = nVersionPara; @@ -4603,7 +4663,9 @@ sal_uLong SwWW8ImplReader::CoreLoad(WW8Glossary *pGloss, const SwPosition &rPos) StoreMacroCmds(); } + mbOnLoadingMain = true; ReadText(0, pWwFib->ccpText, MAN_MAINTEXT); + mbOnLoadingMain = false; } diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index dbb5e1b9900a..1fabdbbb3d44 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -332,6 +332,12 @@ protected: virtual void SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry& rEntry); + virtual sal_Int32 GetCurrAttrCP() const; + virtual bool IsParaEndInCPs(sal_Int32 nStart,sal_Int32 nEnd,bool bSdOD=true) const; + //Clear the para end position recorded in reader intermittently for the least impact on loading performance + virtual void ClearParaEndPosition(); + virtual bool CheckSdOD(sal_Int32 nStart,sal_Int32 nEnd); + public: SwWW8FltControlStack(SwDoc* pDo, sal_uLong nFieldFl, SwWW8ImplReader& rReader_ ) : SwFltControlStack( pDo, nFieldFl ), rReader( rReader_ ), @@ -910,6 +916,8 @@ struct WW8PostProcessAttrsInfo //----------------------------------------- // Storage-Reader //----------------------------------------- +typedef std::vector<WW8_CP> cp_vector; + class SwWW8ImplReader { private: @@ -1211,6 +1219,9 @@ private: bool bReadTable; boost::shared_ptr<SwPaM> mpTableEndPaM; + cp_vector maEndParaPos; + WW8_CP maCurrAttrCP; + bool mbOnLoadingMain:1; //--------------------------------------------- const SprmReadInfo& GetSprmReadInfo(sal_uInt16 nId) const; @@ -1540,7 +1551,10 @@ public: // eigentlich private, geht aber leider nur public sal_uInt16 GetToggleBiDiAttrFlags() const; void SetToggleAttrFlags(sal_uInt16 nFlags); void SetToggleBiDiAttrFlags(sal_uInt16 nFlags); - + WW8_CP GetCurrAttrCP() const {return maCurrAttrCP;} + bool IsParaEndInCPs(sal_Int32 , sal_Int32,bool bSdOD=true) const; + //Clear the para end position recorded in reader intermittently for the least impact on loading performance + void ClearParaEndPosition(); long Read_Ftn(WW8PLCFManResult* pRes); sal_uInt16 End_Ftn(); diff --git a/sw/source/filter/ww8/ww8par3.cxx b/sw/source/filter/ww8/ww8par3.cxx index 6f3d2c7e91be..ed396600ffc9 100644 --- a/sw/source/filter/ww8/ww8par3.cxx +++ b/sw/source/filter/ww8/ww8par3.cxx @@ -1027,6 +1027,21 @@ void WW8ListManager::AdjustLVL( sal_uInt8 nLevel, SwNumRule& rNumRule, // aNumFmt.SetCharFmt( pFmt ); } + //Ensure the default char fmt is initialized for any level of num ruler if no customized attr + else + { + SwCharFmt* pFmt = aNumFmt.GetCharFmt(); + if ( !pFmt) + { + OUString aName = ( sPrefix.Len() ? sPrefix : rNumRule.GetName() ); + aName += "z" + OUString::number( nLevel ); + + pFmt = rDoc.MakeCharFmt(aName, (SwCharFmt*)rDoc.GetDfltCharFmt()); + bNewCharFmtCreated = true; + rCharFmt[ nLevel ] = pFmt; + aNumFmt.SetCharFmt( pFmt ); + } + } // // ggfs. Bullet Font an das NumFormat haengen // |