xref: /aoo41x/main/sw/source/core/undo/untblk.cxx (revision 69a74367)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10efeef26fSAndrew Rist  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19efeef26fSAndrew Rist  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <hintids.hxx>
28cdf0e10cSrcweir #include <fmtanchr.hxx>
29cdf0e10cSrcweir #include <frmfmt.hxx>
30cdf0e10cSrcweir #include <doc.hxx>
31cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
32352af06aSMichael Stahl #include <IShellCursorSupplier.hxx>
33cdf0e10cSrcweir #include <docary.hxx>
34cdf0e10cSrcweir #include <swundo.hxx>			// fuer die UndoIds
35cdf0e10cSrcweir #include <pam.hxx>
36cdf0e10cSrcweir #include <ndtxt.hxx>
37cdf0e10cSrcweir #include <UndoCore.hxx>
38cdf0e10cSrcweir #include <rolbck.hxx>
39cdf0e10cSrcweir #include <redline.hxx>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir 
42cdf0e10cSrcweir 
SwUndoInserts(SwUndoId nUndoId,const SwPaM & rPam)43cdf0e10cSrcweir SwUndoInserts::SwUndoInserts( SwUndoId nUndoId, const SwPaM& rPam )
44cdf0e10cSrcweir 	: SwUndo( nUndoId ), SwUndRng( rPam ),
45cdf0e10cSrcweir     pTxtFmtColl( 0 ), pLastNdColl(0), pFrmFmts( 0 ), pRedlData( 0 ),
46cdf0e10cSrcweir 	bSttWasTxtNd( sal_True ), nNdDiff( 0 ), pPos( 0 ), nSetPos( 0 )
47cdf0e10cSrcweir {
48cdf0e10cSrcweir 	pHistory = new SwHistory;
49cdf0e10cSrcweir 	SwDoc* pDoc = (SwDoc*)rPam.GetDoc();
50cdf0e10cSrcweir 
51cdf0e10cSrcweir 	SwTxtNode* pTxtNd = rPam.GetPoint()->nNode.GetNode().GetTxtNode();
52cdf0e10cSrcweir 	if( pTxtNd )
53cdf0e10cSrcweir 	{
54cdf0e10cSrcweir 		pTxtFmtColl = pTxtNd->GetTxtColl();
55cdf0e10cSrcweir         pHistory->CopyAttr( pTxtNd->GetpSwpHints(), nSttNode,
56cdf0e10cSrcweir                             0, pTxtNd->GetTxt().Len(), false );
57cdf0e10cSrcweir         if( pTxtNd->HasSwAttrSet() )
58cdf0e10cSrcweir             pHistory->CopyFmtAttr( *pTxtNd->GetpSwAttrSet(), nSttNode );
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 		if( !nSttCntnt )	// dann werden Flys mitgenommen !!
61cdf0e10cSrcweir 		{
62cdf0e10cSrcweir 			sal_uInt16 nArrLen = pDoc->GetSpzFrmFmts()->Count();
63cdf0e10cSrcweir 			for( sal_uInt16 n = 0; n < nArrLen; ++n )
64cdf0e10cSrcweir 			{
65cdf0e10cSrcweir 				SwFrmFmt* pFmt = (*pDoc->GetSpzFrmFmts())[n];
66cdf0e10cSrcweir                 SwFmtAnchor const*const  pAnchor = &pFmt->GetAnchor();
67cdf0e10cSrcweir                 const SwPosition* pAPos = pAnchor->GetCntntAnchor();
68cdf0e10cSrcweir                 if (pAPos &&
69cdf0e10cSrcweir                     (pAnchor->GetAnchorId() == FLY_AT_PARA) &&
70cdf0e10cSrcweir 					 nSttNode == pAPos->nNode.GetIndex() )
71cdf0e10cSrcweir 				{
72cdf0e10cSrcweir 					if( !pFrmFmts )
73cdf0e10cSrcweir 						pFrmFmts = new SvPtrarr;
74cdf0e10cSrcweir 					pFrmFmts->Insert( pFmt, pFrmFmts->Count() );
75cdf0e10cSrcweir 				}
76cdf0e10cSrcweir 			}
77cdf0e10cSrcweir 		}
78cdf0e10cSrcweir 	}
79cdf0e10cSrcweir 	// Redline beachten
80cdf0e10cSrcweir 	if( pDoc->IsRedlineOn() )
81cdf0e10cSrcweir 	{
82cdf0e10cSrcweir 		pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, pDoc->GetRedlineAuthor() );
83cdf0e10cSrcweir 		SetRedlineMode( pDoc->GetRedlineMode() );
84cdf0e10cSrcweir 	}
85cdf0e10cSrcweir }
86cdf0e10cSrcweir 
87cdf0e10cSrcweir // setze den Destination-Bereich nach dem Einlesen.
88cdf0e10cSrcweir 
SetInsertRange(const SwPaM & rPam,sal_Bool bScanFlys,sal_Bool bSttIsTxtNd)89cdf0e10cSrcweir void SwUndoInserts::SetInsertRange( const SwPaM& rPam, sal_Bool bScanFlys,
90cdf0e10cSrcweir 									sal_Bool bSttIsTxtNd )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir 	const SwPosition* pTmpPos = rPam.End();
93cdf0e10cSrcweir 	nEndNode = pTmpPos->nNode.GetIndex();
94cdf0e10cSrcweir 	nEndCntnt = pTmpPos->nContent.GetIndex();
95cdf0e10cSrcweir 	if( rPam.HasMark() )
96cdf0e10cSrcweir 	{
97cdf0e10cSrcweir 		if( pTmpPos == rPam.GetPoint() )
98cdf0e10cSrcweir 			pTmpPos = rPam.GetMark();
99cdf0e10cSrcweir 		else
100cdf0e10cSrcweir 			pTmpPos = rPam.GetPoint();
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 		nSttNode = pTmpPos->nNode.GetIndex();
103cdf0e10cSrcweir 		nSttCntnt = pTmpPos->nContent.GetIndex();
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 		if( !bSttIsTxtNd )		// wird eine Tabellenselektion eingefuegt,
106cdf0e10cSrcweir 		{
107cdf0e10cSrcweir 			++nSttNode;			// dann stimmt der CopyPam nicht ganz
108cdf0e10cSrcweir 			bSttWasTxtNd = sal_False;
109cdf0e10cSrcweir 		}
110cdf0e10cSrcweir 	}
111cdf0e10cSrcweir 
112cdf0e10cSrcweir 	if( bScanFlys && !nSttCntnt )
113cdf0e10cSrcweir 	{
114cdf0e10cSrcweir 		// dann alle neuen Flys zusammen sammeln !!
115cdf0e10cSrcweir 		SwDoc* pDoc = (SwDoc*)rPam.GetDoc();
116cdf0e10cSrcweir 		sal_uInt16 nFndPos, nArrLen = pDoc->GetSpzFrmFmts()->Count();
117cdf0e10cSrcweir 		for( sal_uInt16 n = 0; n < nArrLen; ++n )
118cdf0e10cSrcweir 		{
119cdf0e10cSrcweir 			SwFrmFmt* pFmt = (*pDoc->GetSpzFrmFmts())[n];
120cdf0e10cSrcweir             SwFmtAnchor const*const pAnchor = &pFmt->GetAnchor();
121cdf0e10cSrcweir             SwPosition const*const pAPos = pAnchor->GetCntntAnchor();
122cdf0e10cSrcweir             if (pAPos &&
123cdf0e10cSrcweir                 (pAnchor->GetAnchorId() == FLY_AT_PARA) &&
124cdf0e10cSrcweir 				nSttNode == pAPos->nNode.GetIndex() )
125cdf0e10cSrcweir 			{
126cdf0e10cSrcweir 				if( !pFrmFmts ||
127cdf0e10cSrcweir 					USHRT_MAX == ( nFndPos = pFrmFmts->GetPos( pFmt ) ) )
128cdf0e10cSrcweir                 {
129cdf0e10cSrcweir                     ::boost::shared_ptr<SwUndoInsLayFmt> const pFlyUndo(
130cdf0e10cSrcweir                         new SwUndoInsLayFmt(pFmt, 0, 0));
131cdf0e10cSrcweir                     m_FlyUndos.push_back(pFlyUndo);
132cdf0e10cSrcweir                 }
133cdf0e10cSrcweir                 else
134cdf0e10cSrcweir 					pFrmFmts->Remove( nFndPos );
135cdf0e10cSrcweir 			}
136cdf0e10cSrcweir 		}
137cdf0e10cSrcweir 		delete pFrmFmts, pFrmFmts = 0;
138cdf0e10cSrcweir 	}
139cdf0e10cSrcweir }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir 
~SwUndoInserts()142cdf0e10cSrcweir SwUndoInserts::~SwUndoInserts()
143cdf0e10cSrcweir {
144cdf0e10cSrcweir 	if( pPos )		// loesche noch den Bereich aus dem UndoNodes Array
145cdf0e10cSrcweir 	{
146cdf0e10cSrcweir 		// Insert speichert den Inhalt in der IconSection
147cdf0e10cSrcweir 		SwNodes& rUNds = pPos->nNode.GetNodes();
148cdf0e10cSrcweir 		if( pPos->nContent.GetIndex() )			// nicht den gesamten Node loeschen
149cdf0e10cSrcweir 		{
150cdf0e10cSrcweir 			SwTxtNode* pTxtNd = pPos->nNode.GetNode().GetTxtNode();
151cdf0e10cSrcweir 			ASSERT( pTxtNd, "kein TextNode, aus dem geloescht werden soll" );
152cdf0e10cSrcweir             if( pTxtNd ) // Robust
153cdf0e10cSrcweir             {
154cdf0e10cSrcweir                 pTxtNd->EraseText( pPos->nContent );
155cdf0e10cSrcweir             }
156cdf0e10cSrcweir 			pPos->nNode++;
157cdf0e10cSrcweir 		}
158cdf0e10cSrcweir 		pPos->nContent.Assign( 0, 0 );
159cdf0e10cSrcweir 		rUNds.Delete( pPos->nNode, rUNds.GetEndOfExtras().GetIndex() -
160cdf0e10cSrcweir 									pPos->nNode.GetIndex() );
161cdf0e10cSrcweir 		delete pPos;
162cdf0e10cSrcweir 	}
163cdf0e10cSrcweir 	delete pFrmFmts;
164cdf0e10cSrcweir 	delete pRedlData;
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir 
UndoImpl(::sw::UndoRedoContext & rContext)168cdf0e10cSrcweir void SwUndoInserts::UndoImpl(::sw::UndoRedoContext & rContext)
169cdf0e10cSrcweir {
170cdf0e10cSrcweir     SwDoc *const pDoc = & rContext.GetDoc();
171cdf0e10cSrcweir     SwPaM *const pPam = & AddUndoRedoPaM(rContext);
172cdf0e10cSrcweir 
173cdf0e10cSrcweir 	if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ))
174cdf0e10cSrcweir 		pDoc->DeleteRedline( *pPam, true, USHRT_MAX );
175cdf0e10cSrcweir 
176cdf0e10cSrcweir 	// sind an Point/Mark 2 unterschiedliche TextNodes, dann muss ein
177cdf0e10cSrcweir 	// JoinNext ausgefuehrt werden.
178cdf0e10cSrcweir 	sal_Bool bJoinNext = nSttNode != nEndNode &&
179cdf0e10cSrcweir 				pPam->GetMark()->nNode.GetNode().GetTxtNode() &&
180cdf0e10cSrcweir 				pPam->GetPoint()->nNode.GetNode().GetTxtNode();
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	// gibts ueberhaupt Inhalt ? (laden von Zeichenvorlagen hat kein Inhalt!)
184cdf0e10cSrcweir 	if( nSttNode != nEndNode || nSttCntnt != nEndCntnt )
185cdf0e10cSrcweir 	{
186cdf0e10cSrcweir 		if( nSttNode != nEndNode )
187cdf0e10cSrcweir 		{
188cdf0e10cSrcweir 			SwTxtNode* pTxtNd = pDoc->GetNodes()[ nEndNode ]->GetTxtNode();
189cdf0e10cSrcweir 			if( pTxtNd && pTxtNd->GetTxt().Len() == nEndCntnt )
190cdf0e10cSrcweir 				pLastNdColl = pTxtNd->GetTxtColl();
191cdf0e10cSrcweir 		}
192cdf0e10cSrcweir 
193cdf0e10cSrcweir 		RemoveIdxFromRange( *pPam, sal_False );
194cdf0e10cSrcweir         SetPaM(*pPam);
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 		// sind Fussnoten oder CntntFlyFrames im Text ??
197cdf0e10cSrcweir 		nSetPos = pHistory->Count();
198cdf0e10cSrcweir 		nNdDiff = pPam->GetMark()->nNode.GetIndex();
199cdf0e10cSrcweir 		DelCntntIndex( *pPam->GetMark(), *pPam->GetPoint() );
200cdf0e10cSrcweir 		nNdDiff -= pPam->GetMark()->nNode.GetIndex();
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 		if( *pPam->GetPoint() != *pPam->GetMark() )
203cdf0e10cSrcweir 		{
204cdf0e10cSrcweir 			pPos = new SwPosition( *pPam->GetPoint() );
205cdf0e10cSrcweir 			MoveToUndoNds( *pPam, &pPos->nNode, &pPos->nContent );
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 			if( !bSttWasTxtNd )
208cdf0e10cSrcweir 				pPam->Move( fnMoveBackward, fnGoCntnt );
209cdf0e10cSrcweir 		}
210cdf0e10cSrcweir 	}
211cdf0e10cSrcweir 
212cdf0e10cSrcweir     if (m_FlyUndos.size())
213cdf0e10cSrcweir     {
214cdf0e10cSrcweir 		sal_uLong nTmp = pPam->GetPoint()->nNode.GetIndex();
215cdf0e10cSrcweir         for (size_t n = m_FlyUndos.size(); 0 < n; --n)
216cdf0e10cSrcweir         {
217cdf0e10cSrcweir             m_FlyUndos[ n-1 ]->UndoImpl(rContext);
218cdf0e10cSrcweir         }
219cdf0e10cSrcweir 		nNdDiff += nTmp - pPam->GetPoint()->nNode.GetIndex();
220cdf0e10cSrcweir 	}
221cdf0e10cSrcweir 
2224d322ebcSOliver-Rainer Wittmann     SwNodeIndex& rIdx = pPam->GetPoint()->nNode;
2234d322ebcSOliver-Rainer Wittmann     SwTxtNode* pTxtNode = rIdx.GetNode().GetTxtNode();
2244d322ebcSOliver-Rainer Wittmann     if( pTxtNode )
2254d322ebcSOliver-Rainer Wittmann     {
2264d322ebcSOliver-Rainer Wittmann         if( !pTxtFmtColl )      // falls 0, dann war hier auch kein TextNode,
2274d322ebcSOliver-Rainer Wittmann         {                       // dann muss dieser geloescht werden,
2284d322ebcSOliver-Rainer Wittmann             SwNodeIndex aDelIdx( rIdx );
2294d322ebcSOliver-Rainer Wittmann             rIdx++;
2304d322ebcSOliver-Rainer Wittmann             SwCntntNode* pCNd = rIdx.GetNode().GetCntntNode();
2314d322ebcSOliver-Rainer Wittmann             xub_StrLen nCnt = 0; if( pCNd ) nCnt = pCNd->Len();
2324d322ebcSOliver-Rainer Wittmann             pPam->GetPoint()->nContent.Assign( pCNd, nCnt );
2334d322ebcSOliver-Rainer Wittmann             pPam->SetMark();
2344d322ebcSOliver-Rainer Wittmann             pPam->DeleteMark();
2354d322ebcSOliver-Rainer Wittmann 
2364d322ebcSOliver-Rainer Wittmann             RemoveIdxRel( aDelIdx.GetIndex(), *pPam->GetPoint() );
2374d322ebcSOliver-Rainer Wittmann 
2384d322ebcSOliver-Rainer Wittmann             pDoc->GetNodes().Delete( aDelIdx, 1 );
2394d322ebcSOliver-Rainer Wittmann         }
2404d322ebcSOliver-Rainer Wittmann         else
2414d322ebcSOliver-Rainer Wittmann         {
2424d322ebcSOliver-Rainer Wittmann             if( bJoinNext && pTxtNode->CanJoinNext())
2434d322ebcSOliver-Rainer Wittmann             {
2444d322ebcSOliver-Rainer Wittmann                 {
2454d322ebcSOliver-Rainer Wittmann                     RemoveIdxRel( rIdx.GetIndex()+1, SwPosition( rIdx,
2464d322ebcSOliver-Rainer Wittmann                         SwIndex( pTxtNode, pTxtNode->GetTxt().Len() )));
2474d322ebcSOliver-Rainer Wittmann                 }
2484d322ebcSOliver-Rainer Wittmann                 pTxtNode->JoinNext();
2494d322ebcSOliver-Rainer Wittmann             }
250cdf0e10cSrcweir             // reset all text attributes in the paragraph!
251*69a74367SOliver-Rainer Wittmann             pTxtNode->RstTxtAttr( SwIndex(pTxtNode, 0), pTxtNode->Len(), 0, 0, true );
252cdf0e10cSrcweir 
2534d322ebcSOliver-Rainer Wittmann             // setze alle Attribute im Node zurueck
254cdf0e10cSrcweir             pTxtNode->ResetAllAttr();
255cdf0e10cSrcweir 
2564d322ebcSOliver-Rainer Wittmann             if( USHRT_MAX != pDoc->GetTxtFmtColls()->GetPos( pTxtFmtColl ))
2574d322ebcSOliver-Rainer Wittmann                 pTxtFmtColl = (SwTxtFmtColl*)pTxtNode->ChgFmtColl( pTxtFmtColl );
258cdf0e10cSrcweir 
2594d322ebcSOliver-Rainer Wittmann             pHistory->SetTmpEnd( nSetPos );
260cdf0e10cSrcweir             pHistory->TmpRollback( pDoc, 0, false );
261cdf0e10cSrcweir         }
262cdf0e10cSrcweir     }
263cdf0e10cSrcweir }
264cdf0e10cSrcweir 
RedoImpl(::sw::UndoRedoContext & rContext)265cdf0e10cSrcweir void SwUndoInserts::RedoImpl(::sw::UndoRedoContext & rContext)
266cdf0e10cSrcweir {
267cdf0e10cSrcweir 	// setze noch den Cursor auf den Redo-Bereich
268352af06aSMichael Stahl     SwPaM *const pPam(& rContext.GetCursorSupplier().CreateNewShellCursor());
269cdf0e10cSrcweir 	SwDoc* pDoc = pPam->GetDoc();
270cdf0e10cSrcweir 	pPam->DeleteMark();
271cdf0e10cSrcweir 	pPam->GetPoint()->nNode = nSttNode - nNdDiff;
272cdf0e10cSrcweir 	SwCntntNode* pCNd = pPam->GetCntntNode();
273cdf0e10cSrcweir 	pPam->GetPoint()->nContent.Assign( pCNd, nSttCntnt );
274cdf0e10cSrcweir 
275cdf0e10cSrcweir 	SwTxtFmtColl* pSavTxtFmtColl = pTxtFmtColl;
276cdf0e10cSrcweir 	if( pTxtFmtColl && pCNd && pCNd->IsTxtNode() )
277cdf0e10cSrcweir 		pSavTxtFmtColl = ((SwTxtNode*)pCNd)->GetTxtColl();
278cdf0e10cSrcweir 
279cdf0e10cSrcweir 	pHistory->SetTmpEnd( nSetPos );
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 	// alte Anfangs-Position fuers Rollback zurueckholen
282cdf0e10cSrcweir 	if( ( nSttNode != nEndNode || nSttCntnt != nEndCntnt ) && pPos )
283cdf0e10cSrcweir 	{
284cdf0e10cSrcweir 		sal_Bool bMvBkwrd = MovePtBackward( *pPam );
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 		// Inhalt wieder einfuegen. (erst pPos abmelden !!)
287cdf0e10cSrcweir 		sal_uLong nMvNd = pPos->nNode.GetIndex();
288cdf0e10cSrcweir 		xub_StrLen nMvCnt = pPos->nContent.GetIndex();
289cdf0e10cSrcweir 		DELETEZ( pPos );
290cdf0e10cSrcweir 		MoveFromUndoNds( *pDoc, nMvNd, nMvCnt, *pPam->GetMark() );
291cdf0e10cSrcweir 		if( bSttWasTxtNd )
292cdf0e10cSrcweir 			MovePtForward( *pPam, bMvBkwrd );
293cdf0e10cSrcweir 		pPam->Exchange();
294cdf0e10cSrcweir 	}
295cdf0e10cSrcweir 
296cdf0e10cSrcweir 	if( USHRT_MAX != pDoc->GetTxtFmtColls()->GetPos( pTxtFmtColl ))
297cdf0e10cSrcweir 	{
298cdf0e10cSrcweir 		SwTxtNode* pTxtNd = pPam->GetMark()->nNode.GetNode().GetTxtNode();
299cdf0e10cSrcweir 		if( pTxtNd )
300cdf0e10cSrcweir 			pTxtNd->ChgFmtColl( pTxtFmtColl );
301cdf0e10cSrcweir 	}
302cdf0e10cSrcweir 	pTxtFmtColl = pSavTxtFmtColl;
303cdf0e10cSrcweir 
304cdf0e10cSrcweir 	if( pLastNdColl && USHRT_MAX != pDoc->GetTxtFmtColls()->GetPos( pLastNdColl ) &&
305cdf0e10cSrcweir 		pPam->GetPoint()->nNode != pPam->GetMark()->nNode )
306cdf0e10cSrcweir 	{
307cdf0e10cSrcweir 		SwTxtNode* pTxtNd = pPam->GetPoint()->nNode.GetNode().GetTxtNode();
308cdf0e10cSrcweir 		if( pTxtNd )
309cdf0e10cSrcweir 			pTxtNd->ChgFmtColl( pLastNdColl );
310cdf0e10cSrcweir 	}
311cdf0e10cSrcweir 
312cdf0e10cSrcweir     for (size_t n = m_FlyUndos.size(); 0 < n; --n)
313cdf0e10cSrcweir     {
314cdf0e10cSrcweir         m_FlyUndos[ n-1 ]->RedoImpl(rContext);
315cdf0e10cSrcweir     }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir 	pHistory->Rollback( pDoc, nSetPos );
318cdf0e10cSrcweir 
319cdf0e10cSrcweir 	if( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ))
320cdf0e10cSrcweir 	{
321cdf0e10cSrcweir 		RedlineMode_t eOld = pDoc->GetRedlineMode();
322cdf0e10cSrcweir 		pDoc->SetRedlineMode_intern((RedlineMode_t)( eOld & ~nsRedlineMode_t::REDLINE_IGNORE ));
323cdf0e10cSrcweir 		pDoc->AppendRedline( new SwRedline( *pRedlData, *pPam ), true);
324cdf0e10cSrcweir 		pDoc->SetRedlineMode_intern( eOld );
325cdf0e10cSrcweir 	}
326cdf0e10cSrcweir 	else if( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) &&
327cdf0e10cSrcweir 			pDoc->GetRedlineTbl().Count() )
328cdf0e10cSrcweir 		pDoc->SplitRedline( *pPam );
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
RepeatImpl(::sw::RepeatContext & rContext)331cdf0e10cSrcweir void SwUndoInserts::RepeatImpl(::sw::RepeatContext & rContext)
332cdf0e10cSrcweir {
333cdf0e10cSrcweir     SwPaM aPam( rContext.GetDoc().GetNodes().GetEndOfContent() );
334cdf0e10cSrcweir 	SetPaM( aPam );
335cdf0e10cSrcweir     SwPaM & rRepeatPaM( rContext.GetRepeatPaM() );
336cdf0e10cSrcweir     aPam.GetDoc()->CopyRange( aPam, *rRepeatPaM.GetPoint(), false );
337cdf0e10cSrcweir }
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 
340cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////
341cdf0e10cSrcweir 
SwUndoInsDoc(const SwPaM & rPam)342cdf0e10cSrcweir SwUndoInsDoc::SwUndoInsDoc( const SwPaM& rPam )
343cdf0e10cSrcweir 	: SwUndoInserts( UNDO_INSDOKUMENT, rPam )
344cdf0e10cSrcweir {
345cdf0e10cSrcweir }
346cdf0e10cSrcweir 
SwUndoCpyDoc(const SwPaM & rPam)347cdf0e10cSrcweir SwUndoCpyDoc::SwUndoCpyDoc( const SwPaM& rPam )
348cdf0e10cSrcweir 	: SwUndoInserts( UNDO_COPY, rPam )
349cdf0e10cSrcweir {
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
352