summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-03-15 17:26:36 +0000
committerMichael Stahl <mstahl@redhat.com>2018-03-15 20:13:16 +0100
commit69b4389bb41913cac3550cec8300207576df752f (patch)
treee5dc22a90418a5d20c32f3f8a9ff848ca4b8f7f2
parent90ea159df9b326c0d00b736abaf769062122a32b (diff)
ofz#6827 Bad-cast
Change-Id: I856d781f122c21c02a0a8cd01369d49f50b8a555 Reviewed-on: https://gerrit.libreoffice.org/51364 Reviewed-by: Michael Stahl <mstahl@redhat.com> Tested-by: Michael Stahl <mstahl@redhat.com>
-rw-r--r--sw/source/filter/ww8/ww8par.cxx17
-rw-r--r--sw/source/filter/ww8/ww8par.hxx2
-rw-r--r--sw/source/filter/ww8/ww8par6.cxx34
3 files changed, 35 insertions, 18 deletions
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index e448087db0f3..5aebb80ee873 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -3981,7 +3981,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
long nCpOfs = m_xPlcxMan->GetCpOfs(); // Offset for Header/Footer, Footnote
WW8_CP nNext = m_xPlcxMan->Where();
- SwTextNode* pPreviousNode = nullptr;
+ m_pPreviousNode = nullptr;
sal_uInt8 nDropLines = 0;
SwCharFormat* pNewSwCharFormat = nullptr;
const SwCharFormat* pFormat = nullptr;
@@ -4013,7 +4013,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)
@@ -4037,10 +4037,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
{
@@ -4067,12 +4067,12 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
SwPosition aStart(*pEndNd);
m_xCtrlStck->NewAttr(aStart, aDrop);
m_xCtrlStck->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();
SprmResult aDCS;
if (m_bVer67)
@@ -4083,7 +4083,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
if (aDCS.pSprm && aDCS.nRemainingData >= 1)
nDropLines = (*aDCS.pSprm) >> 3;
else // There is no Drop Cap Specifier hence no dropcap
- pPreviousNode = nullptr;
+ m_pPreviousNode = nullptr;
SprmResult aDistance = m_xPlcxMan->GetPapPLCF()->HasSprm(0x842F);
if (aDistance.pSprm && aDistance.nRemainingData >= 2)
@@ -4155,6 +4155,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());
@@ -4271,6 +4273,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 23e27a127713..11e53a5a9a05 100644
--- a/sw/source/filter/ww8/ww8par.hxx
+++ b/sw/source/filter/ww8/ww8par.hxx
@@ -1356,6 +1356,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 1d88c6fac4e8..249597032fa0 100644
--- a/sw/source/filter/ww8/ww8par6.cxx
+++ b/sw/source/filter/ww8/ww8par6.cxx
@@ -2438,19 +2438,31 @@ bool SwWW8ImplReader::JoinNode(SwPaM &rPam, bool bStealAttr)
if (bStealAttr)
m_xCtrlStck->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();