summaryrefslogtreecommitdiff
path: root/sw/source
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2015-09-11 17:50:44 +0200
committerCaolán McNamara <caolanm@redhat.com>2015-09-12 11:18:14 +0000
commit4ea419f9423ec43c98521fb824f7f9a24d9ef4a5 (patch)
tree547352f34987925ad9d0a68c08b87bfcf8e77c3b /sw/source
parenta07333a3f88ab39db554751146687fa6351d2ea0 (diff)
Revert "Fix single node CopyRange"
This reverts commit 9099e21b89184bd4e39def497e483cac4a77ec5a. It causes the problem that frames anchored to the same node where redlines start or end get duplicated during Hide. Jan-Marek said that the original mail-merge related problem this change was fixing is now most likely fixed differently, and the test in testMultiPageAnchoredDraws() still passes. (equivalent master commit e84f0a9b3223f49b0829f2f55dacbf11ae201c1e) sw: add unit test for the redline frame duplication regression (cherry picked from commit d5ffcba07acb4dd5bd68373d40f07af825f07fba) Change-Id: I4c2b425b0dc8d2706cc74ad93a485a501d44c072 Reviewed-on: https://gerrit.libreoffice.org/18510 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw/source')
-rw-r--r--sw/source/core/doc/DocumentContentOperationsManager.cxx58
-rw-r--r--sw/source/core/doc/docnew.cxx1
-rw-r--r--sw/source/core/inc/DocumentContentOperationsManager.hxx6
3 files changed, 28 insertions, 37 deletions
diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index cd254643c98f..ef476e03b884 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -1585,7 +1585,7 @@ DocumentContentOperationsManager::CopyRange( SwPaM& rPam, SwPosition& rPos, cons
bool bColumnSel = pDoc->IsClipBoard() && pDoc->IsColumnSelection();
// Catch if there's no copy to do
- if( !rPam.HasMark() || ( *pStt > *pEnd && !bColumnSel ) )
+ if( !rPam.HasMark() || ( *pStt >= *pEnd && !bColumnSel ) )
return false;
// Prevent copying in Flys that are anchored in the area
@@ -3110,8 +3110,7 @@ void DocumentContentOperationsManager::CopyWithFlyInFly(
const SwPaM* pCopiedPaM,
const bool bMakeNewFrms,
const bool bDelRedlines,
- const bool bCopyFlyAtFly,
- const bool bMergedFirstNode ) const
+ const bool bCopyFlyAtFly ) const
{
SwDoc* pDest = rInsPos.GetNode().GetDoc();
@@ -3119,17 +3118,13 @@ void DocumentContentOperationsManager::CopyWithFlyInFly(
SwNodeIndex aSavePos( rInsPos, -1 );
bool bEndIsEqualEndPos = rInsPos == rRg.aEnd;
- SwNodeRange aRg( rRg );
- if ( bMergedFirstNode )
- aRg.aStart++;
- if ( aRg.aStart <= aRg.aEnd )
- m_rDoc.GetNodes()._CopyNodes( aRg, rInsPos, bMakeNewFrms, true );
- if ( !bMergedFirstNode )
- ++aSavePos;
- if ( bEndIsEqualEndPos )
+ m_rDoc.GetNodes()._CopyNodes( rRg, rInsPos, bMakeNewFrms, true );
+ ++aSavePos;
+ if( bEndIsEqualEndPos )
((SwNodeIndex&)rRg.aEnd) = aSavePos;
aRedlRest.Restore();
+
#if OSL_DEBUG_LEVEL > 0
{
//JP 17.06.99: Bug 66973 - check count only if the selection is in
@@ -3143,9 +3138,9 @@ void DocumentContentOperationsManager::CopyWithFlyInFly(
!aTmpI.GetNode().IsEndNode() )
{
// If the range starts with a SwStartNode, it isn't copied
- sal_uInt16 offset = (aRg.aStart.GetNode().GetNodeType() != ND_STARTNODE) ? 1 : 0;
+ sal_uInt16 offset = (rRg.aStart.GetNode().GetNodeType() != ND_STARTNODE) ? 1 : 0;
OSL_ENSURE( rInsPos.GetIndex() - aSavePos.GetIndex() ==
- aRg.aEnd.GetIndex() - aRg.aStart.GetIndex() - 1 + offset,
+ rRg.aEnd.GetIndex() - rRg.aStart.GetIndex() - 1 + offset,
"An insufficient number of nodes were copied!" );
}
}
@@ -3153,7 +3148,7 @@ void DocumentContentOperationsManager::CopyWithFlyInFly(
{
::sw::UndoGuard const undoGuard(pDest->GetIDocumentUndoRedo());
- CopyFlyInFlyImpl( rRg, nEndContentIndex, aSavePos, bCopyFlyAtFly, bMergedFirstNode );
+ CopyFlyInFlyImpl( rRg, nEndContentIndex, aSavePos, bCopyFlyAtFly );
}
SwNodeRange aCpyRange( aSavePos, rInsPos );
@@ -3179,8 +3174,7 @@ void DocumentContentOperationsManager::CopyFlyInFlyImpl(
const SwNodeRange& rRg,
const sal_Int32 nEndContentIndex,
const SwNodeIndex& rStartIdx,
- const bool bCopyFlyAtFly,
- const bool bMergedFirstNode ) const
+ const bool bCopyFlyAtFly ) const
{
// First collect all Flys, sort them according to their ordering number,
// and then only copy them. This maintains the ordering numbers (which are only
@@ -3301,9 +3295,6 @@ void DocumentContentOperationsManager::CopyFlyInFlyImpl(
++aIdx;
}
- if ( bMergedFirstNode )
- nAnchorTxtNdNumInRange--;
-
if ( !bAnchorTxtNdFound )
{
// This case can *not* happen, but to be robust take the first
@@ -4072,7 +4063,7 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos,
SwPosition* pEnd = rPam.End();
// Catch when there's no copy to do.
- if( !rPam.HasMark() || ( *pStt > *pEnd && !bColumnSel ) ||
+ if( !rPam.HasMark() || ( *pStt >= *pEnd && !bColumnSel ) ||
//JP 29.6.2001: 88963 - dont copy if inspos is in region of start to end
//JP 15.11.2001: don't test inclusive the end, ever exclusive
( pDoc == &m_rDoc && *pStt <= rPos && rPos < *pEnd ))
@@ -4160,8 +4151,6 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos,
pNumRuleToPropagate = 0;
}
- bool bHandledStartNode = false;
-
// This do/while block is only there so that we can break out of it!
do {
if( pSttTxtNd )
@@ -4169,8 +4158,6 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos,
// Don't copy the beginning completely?
if( !bCopyCollFmt || bColumnSel || pStt->nContent.GetIndex() )
{
- bHandledStartNode = true;
-
SwIndex aDestIdx( rPos.nContent );
bool bCopyOk = false;
if( !pDestTxtNd )
@@ -4246,11 +4233,18 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos,
pEnd->nContent -= nCpyLen;
}
- if( bCopyCollFmt && bOneNode )
+ if( bOneNode )
{
- pSttTxtNd->CopyCollFmt( *pDestTxtNd );
- POP_NUMRULE_STATE
+ if( bCopyCollFmt )
+ {
+ pSttTxtNd->CopyCollFmt( *pDestTxtNd );
+ POP_NUMRULE_STATE
+ }
+
+ break;
}
+
+ aRg.aStart++;
}
}
else if( pDestTxtNd )
@@ -4307,7 +4301,7 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos,
}
pDestTxtNd = aInsPos.GetNode().GetTxtNode();
- if( pEndTxtNd && (!bOneNode || !bHandledStartNode) )
+ if( pEndTxtNd )
{
SwIndex aDestIdx( rPos.nContent );
if( !pDestTxtNd )
@@ -4351,7 +4345,7 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos,
if( bCopyAll || aRg.aStart != aRg.aEnd )
{
SfxItemSet aBrkSet( pDoc->GetAttrPool(), aBreakSetRange );
- if( !bOneNode && pSttTxtNd && bCopyCollFmt && pDestTxtNd->HasSwAttrSet() )
+ if( pSttTxtNd && bCopyCollFmt && pDestTxtNd->HasSwAttrSet() )
{
aBrkSet.Put( *pDestTxtNd->GetpSwAttrSet() );
if( SfxItemState::SET == aBrkSet.GetItemState( RES_BREAK, false ) )
@@ -4363,15 +4357,13 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos,
if( aInsPos == pEnd->nNode )
{
SwNodeIndex aSaveIdx( aInsPos, -1 );
- CopyWithFlyInFly( aRg, 0, aInsPos, &rPam, bMakeNewFrms,
- false, false, bHandledStartNode );
+ CopyWithFlyInFly( aRg, 0,aInsPos, &rPam, bMakeNewFrms, false );
++aSaveIdx;
pEnd->nNode = aSaveIdx;
pEnd->nContent.Assign( aSaveIdx.GetNode().GetTxtNode(), 0 );
}
else
- CopyWithFlyInFly( aRg, pEnd->nContent.GetIndex(), aInsPos, &rPam,
- bMakeNewFrms, false, false, bHandledStartNode );
+ CopyWithFlyInFly( aRg, pEnd->nContent.GetIndex(), aInsPos, &rPam, bMakeNewFrms, false );
bCopyBookmarks = false;
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index eac9cc5f7552..c285f35847fd 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -935,6 +935,7 @@ SwNodeIndex SwDoc::AppendDoc(const SwDoc& rSource, sal_uInt16 const nStartPageNu
SwPageDesc *const pTargetPageDesc, bool const bDeletePrevious, int pageOffset)
{
// GetEndOfExtras + 1 = StartOfContent == no content node!
+ // this ensures, that we have at least two nodes in the SwPaM.
// @see IDocumentContentOperations::CopyRange
SwNodeIndex aSourceIdx( rSource.GetNodes().GetEndOfExtras(), 1 );
SwNodeIndex aSourceEndIdx( rSource.GetNodes().GetEndOfContent(), -1 );
diff --git a/sw/source/core/inc/DocumentContentOperationsManager.hxx b/sw/source/core/inc/DocumentContentOperationsManager.hxx
index adf7498a0435..7ae23f6059e4 100644
--- a/sw/source/core/inc/DocumentContentOperationsManager.hxx
+++ b/sw/source/core/inc/DocumentContentOperationsManager.hxx
@@ -106,13 +106,11 @@ public:
const SwPaM* pCopiedPaM = NULL,
bool bMakeNewFrms = true,
bool bDelRedlines = true,
- bool bCopyFlyAtFly = false,
- const bool bMergedFirstNode = false ) const;
+ bool bCopyFlyAtFly = false ) const;
void CopyFlyInFlyImpl( const SwNodeRange& rRg,
const sal_Int32 nEndContentIndex,
const SwNodeIndex& rStartIdx,
- const bool bCopyFlyAtFly = false,
- const bool bMergedFirstNode = false ) const;
+ const bool bCopyFlyAtFly = false ) const;
/// Parameters for _Rst and lcl_SetTxtFmtColl
//originallyfrom docfmt.cxx