diff options
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/filter/ww8/ww8par.cxx | 17 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par.hxx | 2 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par6.cxx | 34 |
3 files changed, 35 insertions, 18 deletions
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index c8dd83267387..6607a949df4f 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -4051,7 +4051,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType) long nCpOfs = m_pPlcxMan->GetCpOfs(); // Offset for Header/Footer, Footnote WW8_CP nNext = m_pPlcxMan->Where(); - SwTextNode* pPreviousNode = nullptr; + m_pPreviousNode = nullptr; sal_uInt8 nDropLines = 0; SwCharFormat* pNewSwCharFormat = nullptr; const SwCharFormat* pFormat = nullptr; @@ -4080,7 +4080,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType) // If the previous paragraph was a dropcap then do not // create a new txtnode and join the two paragraphs together - if (bStartLine && !pPreviousNode) // Line end + if (bStartLine && !m_pPreviousNode) // Line end { bool bSplit = true; if (m_bCareFirstParaEndInToc) @@ -4104,10 +4104,10 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType) } } - if (pPreviousNode && bStartLine) + if (m_pPreviousNode && bStartLine) { SwTextNode* pEndNd = m_pPaM->GetNode().GetTextNode(); - const sal_Int32 nDropCapLen = pPreviousNode->GetText().getLength(); + const sal_Int32 nDropCapLen = m_pPreviousNode->GetText().getLength(); // Need to reset the font size and text position for the dropcap { @@ -4134,12 +4134,12 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType) SwPosition aStart(*pEndNd); m_pCtrlStck->NewAttr(aStart, aDrop); m_pCtrlStck->SetAttr(*m_pPaM->GetPoint(), RES_PARATR_DROP); - pPreviousNode = nullptr; + m_pPreviousNode = nullptr; } else if (m_bDropCap) { // If we have found a dropcap store the textnode - pPreviousNode = m_pPaM->GetNode().GetTextNode(); + m_pPreviousNode = m_pPaM->GetNode().GetTextNode(); const sal_uInt8 *pDCS; @@ -4151,7 +4151,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType) if (pDCS) nDropLines = (*pDCS) >> 3; else // There is no Drop Cap Specifier hence no dropcap - pPreviousNode = nullptr; + m_pPreviousNode = nullptr; if (const sal_uInt8 *pDistance = m_pPlcxMan->GetPapPLCF()->HasSprm(0x842F)) nDistance = SVBT16ToShort( pDistance ); @@ -4220,6 +4220,8 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType) } } + m_pPreviousNode = nullptr; + if (m_pPaM->GetPoint()->nContent.GetIndex()) AppendTextNode(*m_pPaM->GetPoint()); @@ -4358,6 +4360,7 @@ SwWW8ImplReader::SwWW8ImplReader(sal_uInt8 nVersionPara, SotStorage* pStorage, , m_nEmbeddedTOXLevel(0) , m_bLoadingTOXHyperlink(false) , m_pPosAfterTOC(nullptr) + , m_pPreviousNode(nullptr) , m_bCareFirstParaEndInToc(false) , m_bCareLastParaEndInToc(false) , m_aTOXEndCps() diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index e292b4690511..6b5b65f927bb 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -1343,6 +1343,8 @@ private: bool m_bLoadingTOXHyperlink; // a document position recorded the after-position of TOC section, managed by Read_F_TOX() and End_Field() SwPaM* m_pPosAfterTOC; + // used for some dropcap tweaking + SwTextNode* m_pPreviousNode; std::unique_ptr< SwPosition > m_pLastAnchorPos; diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx index 2596354df817..6f5ef0f7ea28 100644 --- a/sw/source/filter/ww8/ww8par6.cxx +++ b/sw/source/filter/ww8/ww8par6.cxx @@ -2370,19 +2370,31 @@ bool SwWW8ImplReader::JoinNode(SwPaM &rPam, bool bStealAttr) if (bStealAttr) m_pCtrlStck->StealAttr(rPam.GetPoint()->nNode); - if (m_pLastAnchorPos.get()) + if (m_pLastAnchorPos || m_pPreviousNode) { - //If the last anchor pos is here, then clear the anchor pos. - //This "last anchor pos" is only used for fixing up the - //positions of things anchored to page breaks and here - //we are removing the last paragraph of a frame, so there - //cannot be a page break at this point so we can - //safely reset m_pLastAnchorPos to avoid any dangling - //SwIndex's pointing into the deleted paragraph - SwNodeIndex aLastAnchorPos(m_pLastAnchorPos->nNode); SwNodeIndex aToBeJoined(aPref, 1); - if (aLastAnchorPos == aToBeJoined) - m_pLastAnchorPos.reset(); + + if (m_pLastAnchorPos) + { + //If the last anchor pos is here, then clear the anchor pos. + //This "last anchor pos" is only used for fixing up the + //positions of things anchored to page breaks and here + //we are removing the last paragraph of a frame, so there + //cannot be a page break at this point so we can + //safely reset m_pLastAnchorPos to avoid any dangling + //SwIndex's pointing into the deleted paragraph + SwNodeIndex aLastAnchorPos(m_pLastAnchorPos->nNode); + if (aLastAnchorPos == aToBeJoined) + m_pLastAnchorPos.reset(); + } + + if (m_pPreviousNode) + { + //If the drop character start pos is here, then clear it. + SwNodeIndex aDropCharPos(*m_pPreviousNode); + if (aDropCharPos == aToBeJoined) + m_pPreviousNode = nullptr; + } } pNode->JoinNext(); |