xref: /aoo4110/main/sw/source/core/undo/unmove.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <UndoSplitMove.hxx>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <doc.hxx>
30*b1cdbd2cSJim Jagielski #include <IDocumentUndoRedo.hxx>
31*b1cdbd2cSJim Jagielski #include <pam.hxx>
32*b1cdbd2cSJim Jagielski #include <swundo.hxx>			// fuer die UndoIds
33*b1cdbd2cSJim Jagielski #include <ndtxt.hxx>
34*b1cdbd2cSJim Jagielski #include <UndoCore.hxx>
35*b1cdbd2cSJim Jagielski #include <rolbck.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski // MOVE
39*b1cdbd2cSJim Jagielski 
SwUndoMove(const SwPaM & rRange,const SwPosition & rMvPos)40*b1cdbd2cSJim Jagielski SwUndoMove::SwUndoMove( const SwPaM& rRange, const SwPosition& rMvPos )
41*b1cdbd2cSJim Jagielski 	: SwUndo( UNDO_MOVE ), SwUndRng( rRange ),
42*b1cdbd2cSJim Jagielski 	nMvDestNode( rMvPos.nNode.GetIndex() ),
43*b1cdbd2cSJim Jagielski 	nMvDestCntnt( rMvPos.nContent.GetIndex() ),
44*b1cdbd2cSJim Jagielski     bMoveRedlines( false )
45*b1cdbd2cSJim Jagielski {
46*b1cdbd2cSJim Jagielski 	bMoveRange = bJoinNext = bJoinPrev = sal_False;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 	// StartNode vorm loeschen von Fussnoten besorgen!
49*b1cdbd2cSJim Jagielski 	SwDoc* pDoc = rRange.GetDoc();
50*b1cdbd2cSJim Jagielski 	SwTxtNode* pTxtNd = pDoc->GetNodes()[ nSttNode ]->GetTxtNode();
51*b1cdbd2cSJim Jagielski 	SwTxtNode* pEndTxtNd = pDoc->GetNodes()[ nEndNode ]->GetTxtNode();
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski 	pHistory = new SwHistory;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski 	if( pTxtNd )
56*b1cdbd2cSJim Jagielski 	{
57*b1cdbd2cSJim Jagielski 		pHistory->Add( pTxtNd->GetTxtColl(), nSttNode, ND_TEXTNODE );
58*b1cdbd2cSJim Jagielski         if ( pTxtNd->GetpSwpHints() )
59*b1cdbd2cSJim Jagielski         {
60*b1cdbd2cSJim Jagielski             pHistory->CopyAttr( pTxtNd->GetpSwpHints(), nSttNode,
61*b1cdbd2cSJim Jagielski                                 0, pTxtNd->GetTxt().Len(), false );
62*b1cdbd2cSJim Jagielski         }
63*b1cdbd2cSJim Jagielski         if( pTxtNd->HasSwAttrSet() )
64*b1cdbd2cSJim Jagielski             pHistory->CopyFmtAttr( *pTxtNd->GetpSwAttrSet(), nSttNode );
65*b1cdbd2cSJim Jagielski 	}
66*b1cdbd2cSJim Jagielski 	if( pEndTxtNd && pEndTxtNd != pTxtNd )
67*b1cdbd2cSJim Jagielski 	{
68*b1cdbd2cSJim Jagielski 		pHistory->Add( pEndTxtNd->GetTxtColl(), nEndNode, ND_TEXTNODE );
69*b1cdbd2cSJim Jagielski         if ( pEndTxtNd->GetpSwpHints() )
70*b1cdbd2cSJim Jagielski         {
71*b1cdbd2cSJim Jagielski             pHistory->CopyAttr( pEndTxtNd->GetpSwpHints(), nEndNode,
72*b1cdbd2cSJim Jagielski                                 0, pEndTxtNd->GetTxt().Len(), false );
73*b1cdbd2cSJim Jagielski         }
74*b1cdbd2cSJim Jagielski         if( pEndTxtNd->HasSwAttrSet() )
75*b1cdbd2cSJim Jagielski             pHistory->CopyFmtAttr( *pEndTxtNd->GetpSwAttrSet(), nEndNode );
76*b1cdbd2cSJim Jagielski 	}
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski     pTxtNd = rMvPos.nNode.GetNode().GetTxtNode();
79*b1cdbd2cSJim Jagielski     if (0 != pTxtNd)
80*b1cdbd2cSJim Jagielski     {
81*b1cdbd2cSJim Jagielski 		pHistory->Add( pTxtNd->GetTxtColl(), nMvDestNode, ND_TEXTNODE );
82*b1cdbd2cSJim Jagielski         if ( pTxtNd->GetpSwpHints() )
83*b1cdbd2cSJim Jagielski         {
84*b1cdbd2cSJim Jagielski             pHistory->CopyAttr( pTxtNd->GetpSwpHints(), nMvDestNode,
85*b1cdbd2cSJim Jagielski                                 0, pTxtNd->GetTxt().Len(), false );
86*b1cdbd2cSJim Jagielski         }
87*b1cdbd2cSJim Jagielski         if( pTxtNd->HasSwAttrSet() )
88*b1cdbd2cSJim Jagielski             pHistory->CopyFmtAttr( *pTxtNd->GetpSwAttrSet(), nMvDestNode );
89*b1cdbd2cSJim Jagielski 	}
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	nFtnStt = pHistory->Count();
93*b1cdbd2cSJim Jagielski 	DelFtn( rRange );
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski 	if( pHistory && !pHistory->Count() )
96*b1cdbd2cSJim Jagielski 		DELETEZ( pHistory );
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski 
SwUndoMove(SwDoc * pDoc,const SwNodeRange & rRg,const SwNodeIndex & rMvPos)100*b1cdbd2cSJim Jagielski SwUndoMove::SwUndoMove( SwDoc* pDoc, const SwNodeRange& rRg,
101*b1cdbd2cSJim Jagielski 						const SwNodeIndex& rMvPos )
102*b1cdbd2cSJim Jagielski 	: SwUndo( UNDO_MOVE ),
103*b1cdbd2cSJim Jagielski 	nMvDestNode( rMvPos.GetIndex() ),
104*b1cdbd2cSJim Jagielski     bMoveRedlines( false )
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski 	bMoveRange = sal_True;
107*b1cdbd2cSJim Jagielski 	bJoinNext = bJoinPrev = sal_False;
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 	nSttCntnt = nEndCntnt = nMvDestCntnt = STRING_MAXLEN;
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 	nSttNode = rRg.aStart.GetIndex();
112*b1cdbd2cSJim Jagielski 	nEndNode = rRg.aEnd.GetIndex();
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski //	DelFtn( rRange );
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 	// wird aus dem CntntBereich in den Sonderbereich verschoben ?
117*b1cdbd2cSJim Jagielski 	sal_uLong nCntntStt = pDoc->GetNodes().GetEndOfAutotext().GetIndex();
118*b1cdbd2cSJim Jagielski 	if( nMvDestNode < nCntntStt && rRg.aStart.GetIndex() > nCntntStt )
119*b1cdbd2cSJim Jagielski 	{
120*b1cdbd2cSJim Jagielski 		// loesche alle Fussnoten. Diese sind dort nicht erwuenscht.
121*b1cdbd2cSJim Jagielski 		SwPosition aPtPos( rRg.aEnd );
122*b1cdbd2cSJim Jagielski 		SwCntntNode* pCNd = rRg.aEnd.GetNode().GetCntntNode();
123*b1cdbd2cSJim Jagielski 		if( pCNd )
124*b1cdbd2cSJim Jagielski 			aPtPos.nContent.Assign( pCNd, pCNd->Len() );
125*b1cdbd2cSJim Jagielski 		SwPosition aMkPos( rRg.aStart );
126*b1cdbd2cSJim Jagielski 		if( 0 != ( pCNd = aMkPos.nNode.GetNode().GetCntntNode() ))
127*b1cdbd2cSJim Jagielski 			aMkPos.nContent.Assign( pCNd, 0 );
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski         DelCntntIndex( aMkPos, aPtPos, nsDelCntntType::DELCNT_FTN );
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 		if( pHistory && !pHistory->Count() )
132*b1cdbd2cSJim Jagielski 			DELETEZ( pHistory );
133*b1cdbd2cSJim Jagielski 	}
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 	nFtnStt = 0;
136*b1cdbd2cSJim Jagielski }
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 
SetDestRange(const SwPaM & rRange,const SwPosition & rInsPos,sal_Bool bJoin,sal_Bool bCorrPam)140*b1cdbd2cSJim Jagielski void SwUndoMove::SetDestRange( const SwPaM& rRange,
141*b1cdbd2cSJim Jagielski 								const SwPosition& rInsPos,
142*b1cdbd2cSJim Jagielski 								sal_Bool bJoin, sal_Bool bCorrPam )
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski 	const SwPosition *pStt = rRange.Start(),
145*b1cdbd2cSJim Jagielski 					*pEnd = rRange.GetPoint() == pStt
146*b1cdbd2cSJim Jagielski 						? rRange.GetMark()
147*b1cdbd2cSJim Jagielski 						: rRange.GetPoint();
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 	nDestSttNode	= pStt->nNode.GetIndex();
150*b1cdbd2cSJim Jagielski 	nDestSttCntnt	= pStt->nContent.GetIndex();
151*b1cdbd2cSJim Jagielski 	nDestEndNode	= pEnd->nNode.GetIndex();
152*b1cdbd2cSJim Jagielski 	nDestEndCntnt	= pEnd->nContent.GetIndex();
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 	nInsPosNode     = rInsPos.nNode.GetIndex();
155*b1cdbd2cSJim Jagielski 	nInsPosCntnt	= rInsPos.nContent.GetIndex();
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 	if( bCorrPam )
158*b1cdbd2cSJim Jagielski 	{
159*b1cdbd2cSJim Jagielski 		nDestSttNode--;
160*b1cdbd2cSJim Jagielski 		nDestEndNode--;
161*b1cdbd2cSJim Jagielski 	}
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 	bJoinNext = nDestSttNode != nDestEndNode &&
164*b1cdbd2cSJim Jagielski 				pStt->nNode.GetNode().GetTxtNode() &&
165*b1cdbd2cSJim Jagielski 				pEnd->nNode.GetNode().GetTxtNode();
166*b1cdbd2cSJim Jagielski 	bJoinPrev = bJoin;
167*b1cdbd2cSJim Jagielski }
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 
SetDestRange(const SwNodeIndex & rStt,const SwNodeIndex & rEnd,const SwNodeIndex & rInsPos)170*b1cdbd2cSJim Jagielski void SwUndoMove::SetDestRange( const SwNodeIndex& rStt,
171*b1cdbd2cSJim Jagielski 								const SwNodeIndex& rEnd,
172*b1cdbd2cSJim Jagielski 								const SwNodeIndex& rInsPos )
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski 	nDestSttNode = rStt.GetIndex();
175*b1cdbd2cSJim Jagielski 	nDestEndNode = rEnd.GetIndex();
176*b1cdbd2cSJim Jagielski 	if( nDestSttNode > nDestEndNode )
177*b1cdbd2cSJim Jagielski 	{
178*b1cdbd2cSJim Jagielski 		nDestSttNode = nDestEndNode;
179*b1cdbd2cSJim Jagielski 		nDestEndNode = rStt.GetIndex();
180*b1cdbd2cSJim Jagielski 	}
181*b1cdbd2cSJim Jagielski 	nInsPosNode  = rInsPos.GetIndex();
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 	nDestSttCntnt = nDestEndCntnt = nInsPosCntnt = STRING_MAXLEN;
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 
UndoImpl(::sw::UndoRedoContext & rContext)187*b1cdbd2cSJim Jagielski void SwUndoMove::UndoImpl(::sw::UndoRedoContext & rContext)
188*b1cdbd2cSJim Jagielski {
189*b1cdbd2cSJim Jagielski     SwDoc *const pDoc = & rContext.GetDoc();
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 	// Block, damit aus diesem gesprungen werden kann
192*b1cdbd2cSJim Jagielski 	do {
193*b1cdbd2cSJim Jagielski 		// erzeuge aus den Werten die Insert-Position und den Bereich
194*b1cdbd2cSJim Jagielski 		SwNodeIndex aIdx( pDoc->GetNodes(), nDestSttNode );
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 		if( bMoveRange )
197*b1cdbd2cSJim Jagielski 		{
198*b1cdbd2cSJim Jagielski 			// nur ein Move mit SwRange
199*b1cdbd2cSJim Jagielski 			SwNodeRange aRg( aIdx, aIdx );
200*b1cdbd2cSJim Jagielski 			aRg.aEnd = nDestEndNode;
201*b1cdbd2cSJim Jagielski 			aIdx = nInsPosNode;
202*b1cdbd2cSJim Jagielski             bool bSuccess = pDoc->MoveNodeRange( aRg, aIdx,
203*b1cdbd2cSJim Jagielski                     IDocumentContentOperations::DOC_MOVEDEFAULT );
204*b1cdbd2cSJim Jagielski             if (!bSuccess)
205*b1cdbd2cSJim Jagielski 				break;
206*b1cdbd2cSJim Jagielski 		}
207*b1cdbd2cSJim Jagielski 		else
208*b1cdbd2cSJim Jagielski 		{
209*b1cdbd2cSJim Jagielski 			SwPaM aPam( aIdx.GetNode(), nDestSttCntnt,
210*b1cdbd2cSJim Jagielski 						*pDoc->GetNodes()[ nDestEndNode ], nDestEndCntnt );
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski             // #i17764# if redlines are to be moved, we may not remove them before
213*b1cdbd2cSJim Jagielski             //          pDoc->Move gets a chance to handle them
214*b1cdbd2cSJim Jagielski             if( ! bMoveRedlines )
215*b1cdbd2cSJim Jagielski     			RemoveIdxFromRange( aPam, sal_False );
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 			SwPosition aPos( *pDoc->GetNodes()[ nInsPosNode] );
218*b1cdbd2cSJim Jagielski 			SwCntntNode* pCNd = aPos.nNode.GetNode().GetCntntNode();
219*b1cdbd2cSJim Jagielski 			aPos.nContent.Assign( pCNd, nInsPosCntnt );
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski             if( pCNd->HasSwAttrSet() )
222*b1cdbd2cSJim Jagielski 				pCNd->ResetAllAttr();
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 			if( pCNd->IsTxtNode() && ((SwTxtNode*)pCNd)->GetpSwpHints() )
225*b1cdbd2cSJim Jagielski                 ((SwTxtNode*)pCNd)->ClearSwpHintsArr( false );
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 			// an der InsertPos erstmal alle Attribute entfernen,
228*b1cdbd2cSJim Jagielski             const bool bSuccess = pDoc->MoveRange( aPam, aPos, (bMoveRedlines)
229*b1cdbd2cSJim Jagielski                         ? IDocumentContentOperations::DOC_MOVEREDLINES
230*b1cdbd2cSJim Jagielski                         : IDocumentContentOperations::DOC_MOVEDEFAULT );
231*b1cdbd2cSJim Jagielski             if (!bSuccess)
232*b1cdbd2cSJim Jagielski 				break;
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 			aPam.Exchange();
235*b1cdbd2cSJim Jagielski 			aPam.DeleteMark();
236*b1cdbd2cSJim Jagielski //			pDoc->ResetAttr( aPam, sal_False );
237*b1cdbd2cSJim Jagielski 			if( aPam.GetNode()->IsCntntNode() )
238*b1cdbd2cSJim Jagielski 				aPam.GetNode()->GetCntntNode()->ResetAllAttr();
239*b1cdbd2cSJim Jagielski 			// der Pam wird jetzt aufgegeben.
240*b1cdbd2cSJim Jagielski 		}
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 		SwTxtNode* pTxtNd = aIdx.GetNode().GetTxtNode();
243*b1cdbd2cSJim Jagielski 		if( bJoinNext )
244*b1cdbd2cSJim Jagielski 		{
245*b1cdbd2cSJim Jagielski 			{
246*b1cdbd2cSJim Jagielski 				RemoveIdxRel( aIdx.GetIndex() + 1, SwPosition( aIdx,
247*b1cdbd2cSJim Jagielski 						SwIndex( pTxtNd, pTxtNd->GetTxt().Len() ) ) );
248*b1cdbd2cSJim Jagielski 			}
249*b1cdbd2cSJim Jagielski 			// sind keine Pams mehr im naechsten TextNode
250*b1cdbd2cSJim Jagielski 			pTxtNd->JoinNext();
251*b1cdbd2cSJim Jagielski 		}
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski 		if( bJoinPrev && pTxtNd->CanJoinPrev( &aIdx ) )
254*b1cdbd2cSJim Jagielski 		{
255*b1cdbd2cSJim Jagielski 			// ?? sind keine Pams mehr im naechsten TextNode ??
256*b1cdbd2cSJim Jagielski 			pTxtNd = aIdx.GetNode().GetTxtNode();
257*b1cdbd2cSJim Jagielski 			{
258*b1cdbd2cSJim Jagielski 				RemoveIdxRel( aIdx.GetIndex() + 1, SwPosition( aIdx,
259*b1cdbd2cSJim Jagielski 						SwIndex( pTxtNd, pTxtNd->GetTxt().Len() ) ) );
260*b1cdbd2cSJim Jagielski 			}
261*b1cdbd2cSJim Jagielski 			pTxtNd->JoinNext();
262*b1cdbd2cSJim Jagielski 		}
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski 	} while( sal_False );
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 	if( pHistory )
267*b1cdbd2cSJim Jagielski 	{
268*b1cdbd2cSJim Jagielski 		if( nFtnStt != pHistory->Count() )
269*b1cdbd2cSJim Jagielski 			pHistory->Rollback( pDoc, nFtnStt );
270*b1cdbd2cSJim Jagielski 		pHistory->TmpRollback( pDoc, 0 );
271*b1cdbd2cSJim Jagielski 		pHistory->SetTmpEnd( pHistory->Count() );
272*b1cdbd2cSJim Jagielski 	}
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski 	// setze noch den Cursor auf den Undo-Bereich
275*b1cdbd2cSJim Jagielski 	if( !bMoveRange )
276*b1cdbd2cSJim Jagielski     {
277*b1cdbd2cSJim Jagielski         AddUndoRedoPaM(rContext);
278*b1cdbd2cSJim Jagielski     }
279*b1cdbd2cSJim Jagielski }
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 
RedoImpl(::sw::UndoRedoContext & rContext)282*b1cdbd2cSJim Jagielski void SwUndoMove::RedoImpl(::sw::UndoRedoContext & rContext)
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski     SwPaM *const pPam = & AddUndoRedoPaM(rContext);
285*b1cdbd2cSJim Jagielski     SwDoc & rDoc = rContext.GetDoc();
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski 	SwNodes& rNds = rDoc.GetNodes();
288*b1cdbd2cSJim Jagielski 	SwNodeIndex aIdx( rNds, nMvDestNode );
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 	if( bMoveRange )
291*b1cdbd2cSJim Jagielski 	{
292*b1cdbd2cSJim Jagielski 		// nur ein Move mit SwRange
293*b1cdbd2cSJim Jagielski 		SwNodeRange aRg( rNds, nSttNode, rNds, nEndNode );
294*b1cdbd2cSJim Jagielski         rDoc.MoveNodeRange( aRg, aIdx, (bMoveRedlines)
295*b1cdbd2cSJim Jagielski                 ? IDocumentContentOperations::DOC_MOVEREDLINES
296*b1cdbd2cSJim Jagielski                 : IDocumentContentOperations::DOC_MOVEDEFAULT );
297*b1cdbd2cSJim Jagielski     }
298*b1cdbd2cSJim Jagielski 	else
299*b1cdbd2cSJim Jagielski 	{
300*b1cdbd2cSJim Jagielski 		SwPaM aPam( *pPam->GetPoint() );
301*b1cdbd2cSJim Jagielski 		SetPaM( aPam );
302*b1cdbd2cSJim Jagielski 		SwPosition aMvPos( aIdx, SwIndex( aIdx.GetNode().GetCntntNode(),
303*b1cdbd2cSJim Jagielski 										nMvDestCntnt ));
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 		DelFtn( aPam );
306*b1cdbd2cSJim Jagielski 		RemoveIdxFromRange( aPam, sal_False );
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski 		aIdx = aPam.Start()->nNode;
309*b1cdbd2cSJim Jagielski 		sal_Bool bJoinTxt = aIdx.GetNode().IsTxtNode();
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski 		aIdx--;
312*b1cdbd2cSJim Jagielski         rDoc.MoveRange( aPam, aMvPos,
313*b1cdbd2cSJim Jagielski             IDocumentContentOperations::DOC_MOVEDEFAULT );
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 		if( nSttNode != nEndNode && bJoinTxt )
316*b1cdbd2cSJim Jagielski 		{
317*b1cdbd2cSJim Jagielski 			aIdx++;
318*b1cdbd2cSJim Jagielski 			SwTxtNode * pTxtNd = aIdx.GetNode().GetTxtNode();
319*b1cdbd2cSJim Jagielski 			if( pTxtNd && pTxtNd->CanJoinNext() )
320*b1cdbd2cSJim Jagielski 			{
321*b1cdbd2cSJim Jagielski 				{
322*b1cdbd2cSJim Jagielski 					RemoveIdxRel( aIdx.GetIndex() + 1, SwPosition( aIdx,
323*b1cdbd2cSJim Jagielski 							SwIndex( pTxtNd, pTxtNd->GetTxt().Len() ) ) );
324*b1cdbd2cSJim Jagielski 				}
325*b1cdbd2cSJim Jagielski 				pTxtNd->JoinNext();
326*b1cdbd2cSJim Jagielski 			}
327*b1cdbd2cSJim Jagielski 		}
328*b1cdbd2cSJim Jagielski 		*pPam->GetPoint() = *aPam.GetPoint();
329*b1cdbd2cSJim Jagielski 		pPam->SetMark();
330*b1cdbd2cSJim Jagielski 		*pPam->GetMark() = *aPam.GetMark();
331*b1cdbd2cSJim Jagielski 	}
332*b1cdbd2cSJim Jagielski }
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 
DelFtn(const SwPaM & rRange)335*b1cdbd2cSJim Jagielski void SwUndoMove::DelFtn( const SwPaM& rRange )
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski 	// wird aus dem CntntBereich in den Sonderbereich verschoben ?
338*b1cdbd2cSJim Jagielski 	SwDoc* pDoc = rRange.GetDoc();
339*b1cdbd2cSJim Jagielski 	sal_uLong nCntntStt = pDoc->GetNodes().GetEndOfAutotext().GetIndex();
340*b1cdbd2cSJim Jagielski 	if( nMvDestNode < nCntntStt &&
341*b1cdbd2cSJim Jagielski 		rRange.GetPoint()->nNode.GetIndex() >= nCntntStt )
342*b1cdbd2cSJim Jagielski 	{
343*b1cdbd2cSJim Jagielski 		// loesche alle Fussnoten. Diese sind dort nicht erwuenscht.
344*b1cdbd2cSJim Jagielski 		DelCntntIndex( *rRange.GetMark(), *rRange.GetPoint(),
345*b1cdbd2cSJim Jagielski                             nsDelCntntType::DELCNT_FTN );
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski 		if( pHistory && !pHistory->Count() )
348*b1cdbd2cSJim Jagielski 			delete pHistory, pHistory = 0;
349*b1cdbd2cSJim Jagielski 	}
350*b1cdbd2cSJim Jagielski }
351*b1cdbd2cSJim Jagielski 
352