xref: /AOO41X/main/sw/source/core/undo/unredln.cxx (revision 641de097e2e45da05c7073f6a714e738b4e22abb)
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
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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 <UndoRedline.hxx>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <hintids.hxx>
30cdf0e10cSrcweir #include <unotools/charclass.hxx>
31cdf0e10cSrcweir #include <doc.hxx>
32cdf0e10cSrcweir #include <swundo.hxx>			// fuer die UndoIds
33cdf0e10cSrcweir #include <pam.hxx>
34cdf0e10cSrcweir #include <ndtxt.hxx>
35cdf0e10cSrcweir #include <UndoCore.hxx>
36cdf0e10cSrcweir #include <UndoDelete.hxx>
37cdf0e10cSrcweir #include <rolbck.hxx>
38cdf0e10cSrcweir #include <redline.hxx>
39cdf0e10cSrcweir #include <docary.hxx>
40cdf0e10cSrcweir #include <sortopt.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir extern void lcl_JoinText( SwPaM& rPam, sal_Bool bJoinPrev );
43cdf0e10cSrcweir extern void lcl_GetJoinFlags( SwPaM& rPam, sal_Bool& rJoinTxt, sal_Bool& rJoinPrev );
44cdf0e10cSrcweir 
45cdf0e10cSrcweir //------------------------------------------------------------------
46cdf0e10cSrcweir 
SwUndoRedline(SwUndoId nUsrId,const SwPaM & rRange)47cdf0e10cSrcweir SwUndoRedline::SwUndoRedline( SwUndoId nUsrId, const SwPaM& rRange )
48cdf0e10cSrcweir 	: SwUndo( UNDO_REDLINE ), SwUndRng( rRange ),
49*641de097SOliver-Rainer Wittmann 	mpRedlData( 0 ), mpRedlSaveData( 0 ), mnUserId( nUsrId ),
50*641de097SOliver-Rainer Wittmann 	mbHiddenRedlines( sal_False )
51cdf0e10cSrcweir {
52cdf0e10cSrcweir 	// Redline beachten
53cdf0e10cSrcweir 	SwDoc& rDoc = *rRange.GetDoc();
54cdf0e10cSrcweir 	if( rDoc.IsRedlineOn() )
55cdf0e10cSrcweir 	{
56*641de097SOliver-Rainer Wittmann 		switch( mnUserId )
57cdf0e10cSrcweir 		{
58cdf0e10cSrcweir 		case UNDO_DELETE:
59cdf0e10cSrcweir 		case UNDO_REPLACE:
60*641de097SOliver-Rainer Wittmann 			mpRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_DELETE, rDoc.GetRedlineAuthor() );
61cdf0e10cSrcweir 			break;
62cdf0e10cSrcweir         default:
63cdf0e10cSrcweir             ;
64cdf0e10cSrcweir 		}
65cdf0e10cSrcweir 		SetRedlineMode( rDoc.GetRedlineMode() );
66cdf0e10cSrcweir 	}
67cdf0e10cSrcweir 
68cdf0e10cSrcweir 	sal_uLong nEndExtra = rDoc.GetNodes().GetEndOfExtras().GetIndex();
69cdf0e10cSrcweir 
70*641de097SOliver-Rainer Wittmann 	mpRedlSaveData = new SwRedlineSaveDatas;
71*641de097SOliver-Rainer Wittmann 	if( !FillSaveData( rRange, *mpRedlSaveData, sal_False,
72*641de097SOliver-Rainer Wittmann 						UNDO_REJECT_REDLINE != mnUserId ))
73*641de097SOliver-Rainer Wittmann 		delete mpRedlSaveData, mpRedlSaveData = 0;
74cdf0e10cSrcweir 	else
75cdf0e10cSrcweir 	{
76*641de097SOliver-Rainer Wittmann 		mbHiddenRedlines = HasHiddenRedlines( *mpRedlSaveData );
77*641de097SOliver-Rainer Wittmann 		if( mbHiddenRedlines ) 			// dann muessen die NodeIndizies
78cdf0e10cSrcweir 		{   							// vom SwUndRng korrigiert werden
79cdf0e10cSrcweir 			nEndExtra -= rDoc.GetNodes().GetEndOfExtras().GetIndex();
80cdf0e10cSrcweir 			nSttNode -= nEndExtra;
81cdf0e10cSrcweir 			nEndNode -= nEndExtra;
82cdf0e10cSrcweir 		}
83cdf0e10cSrcweir 	}
84cdf0e10cSrcweir }
85cdf0e10cSrcweir 
~SwUndoRedline()86cdf0e10cSrcweir SwUndoRedline::~SwUndoRedline()
87cdf0e10cSrcweir {
88*641de097SOliver-Rainer Wittmann 	delete mpRedlData;
89*641de097SOliver-Rainer Wittmann 	delete mpRedlSaveData;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir 
GetRedlSaveCount() const92cdf0e10cSrcweir sal_uInt16 SwUndoRedline::GetRedlSaveCount() const
93cdf0e10cSrcweir {
94*641de097SOliver-Rainer Wittmann     return mpRedlSaveData ? mpRedlSaveData->Count() : 0;
95cdf0e10cSrcweir }
96cdf0e10cSrcweir 
97cdf0e10cSrcweir 
UndoImpl(::sw::UndoRedoContext & rContext)98cdf0e10cSrcweir void SwUndoRedline::UndoImpl(::sw::UndoRedoContext & rContext)
99cdf0e10cSrcweir {
100cdf0e10cSrcweir     SwDoc *const pDoc = & rContext.GetDoc();
101cdf0e10cSrcweir     SwPaM & rPam( AddUndoRedoPaM(rContext) );
102cdf0e10cSrcweir 
103cdf0e10cSrcweir     UndoRedlineImpl(*pDoc, rPam);
104cdf0e10cSrcweir 
105*641de097SOliver-Rainer Wittmann 	if( mpRedlSaveData )
106cdf0e10cSrcweir 	{
107cdf0e10cSrcweir 		sal_uLong nEndExtra = pDoc->GetNodes().GetEndOfExtras().GetIndex();
108*641de097SOliver-Rainer Wittmann 		SetSaveData( *pDoc, *mpRedlSaveData );
109*641de097SOliver-Rainer Wittmann 		if( mbHiddenRedlines )
110cdf0e10cSrcweir 		{
111*641de097SOliver-Rainer Wittmann 			mpRedlSaveData->DeleteAndDestroy( 0, mpRedlSaveData->Count() );
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 			nEndExtra = pDoc->GetNodes().GetEndOfExtras().GetIndex() - nEndExtra;
114cdf0e10cSrcweir 			nSttNode += nEndExtra;
115cdf0e10cSrcweir 			nEndNode += nEndExtra;
116cdf0e10cSrcweir 		}
117cdf0e10cSrcweir         SetPaM(rPam, true);
118cdf0e10cSrcweir     }
119cdf0e10cSrcweir }
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 
RedoImpl(::sw::UndoRedoContext & rContext)122cdf0e10cSrcweir void SwUndoRedline::RedoImpl(::sw::UndoRedoContext & rContext)
123cdf0e10cSrcweir {
124cdf0e10cSrcweir     SwDoc *const pDoc = & rContext.GetDoc();
125cdf0e10cSrcweir 	RedlineMode_t eOld = pDoc->GetRedlineMode();
126cdf0e10cSrcweir 	pDoc->SetRedlineMode_intern((RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON ));
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     SwPaM & rPam( AddUndoRedoPaM(rContext) );
129*641de097SOliver-Rainer Wittmann 	if( mpRedlSaveData && mbHiddenRedlines )
130cdf0e10cSrcweir 	{
131cdf0e10cSrcweir 		sal_uLong nEndExtra = pDoc->GetNodes().GetEndOfExtras().GetIndex();
132*641de097SOliver-Rainer Wittmann         FillSaveData(rPam, *mpRedlSaveData, sal_False,
133*641de097SOliver-Rainer Wittmann 						UNDO_REJECT_REDLINE != mnUserId );
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 		nEndExtra -= pDoc->GetNodes().GetEndOfExtras().GetIndex();
136cdf0e10cSrcweir 		nSttNode -= nEndExtra;
137cdf0e10cSrcweir 		nEndNode -= nEndExtra;
138cdf0e10cSrcweir 	}
139cdf0e10cSrcweir 
140cdf0e10cSrcweir     RedoRedlineImpl(*pDoc, rPam);
141cdf0e10cSrcweir 
142cdf0e10cSrcweir     SetPaM(rPam, true);
143cdf0e10cSrcweir 	pDoc->SetRedlineMode_intern( eOld );
144cdf0e10cSrcweir }
145cdf0e10cSrcweir 
UndoRedlineImpl(SwDoc &,SwPaM &)146cdf0e10cSrcweir void SwUndoRedline::UndoRedlineImpl(SwDoc &, SwPaM &)
147cdf0e10cSrcweir {
148cdf0e10cSrcweir }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir // default: remove redlines
RedoRedlineImpl(SwDoc & rDoc,SwPaM & rPam)151cdf0e10cSrcweir void SwUndoRedline::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam)
152cdf0e10cSrcweir {
153cdf0e10cSrcweir     rDoc.DeleteRedline(rPam, true, USHRT_MAX);
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 
157cdf0e10cSrcweir // SwUndoRedlineDelete ///////////////////////////////////////////////////
158cdf0e10cSrcweir 
SwUndoRedlineDelete(const SwPaM & rRange,SwUndoId nUsrId)159cdf0e10cSrcweir SwUndoRedlineDelete::SwUndoRedlineDelete( const SwPaM& rRange, SwUndoId nUsrId )
160cdf0e10cSrcweir     : SwUndoRedline( nUsrId = (nUsrId ? nUsrId : UNDO_DELETE), rRange ),
161cdf0e10cSrcweir 	bCanGroup( sal_False ), bIsDelim( sal_False ), bIsBackspace( sal_False )
162cdf0e10cSrcweir {
163cdf0e10cSrcweir 	const SwTxtNode* pTNd;
164*641de097SOliver-Rainer Wittmann 	if( UNDO_DELETE == mnUserId &&
165cdf0e10cSrcweir 		nSttNode == nEndNode && nSttCntnt + 1 == nEndCntnt &&
166cdf0e10cSrcweir 		0 != (pTNd = rRange.GetNode()->GetTxtNode()) )
167cdf0e10cSrcweir 	{
168cdf0e10cSrcweir 		sal_Unicode cCh = pTNd->GetTxt().GetChar( nSttCntnt );
169cdf0e10cSrcweir 		if( CH_TXTATR_BREAKWORD != cCh && CH_TXTATR_INWORD != cCh )
170cdf0e10cSrcweir 		{
171cdf0e10cSrcweir 			bCanGroup = sal_True;
172cdf0e10cSrcweir 			bIsDelim = !GetAppCharClass().isLetterNumeric( pTNd->GetTxt(),
173cdf0e10cSrcweir 															nSttCntnt );
174cdf0e10cSrcweir 			bIsBackspace = nSttCntnt == rRange.GetPoint()->nContent.GetIndex();
175cdf0e10cSrcweir 		}
176cdf0e10cSrcweir 	}
177cdf0e10cSrcweir 
178cdf0e10cSrcweir     bCacheComment = false;
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
UndoRedlineImpl(SwDoc & rDoc,SwPaM & rPam)181cdf0e10cSrcweir void SwUndoRedlineDelete::UndoRedlineImpl(SwDoc & rDoc, SwPaM & rPam)
182cdf0e10cSrcweir {
183cdf0e10cSrcweir     rDoc.DeleteRedline(rPam, true, USHRT_MAX);
184cdf0e10cSrcweir }
185cdf0e10cSrcweir 
RedoRedlineImpl(SwDoc & rDoc,SwPaM & rPam)186cdf0e10cSrcweir void SwUndoRedlineDelete::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam)
187cdf0e10cSrcweir {
188cdf0e10cSrcweir     if (rPam.GetPoint() != rPam.GetMark())
189cdf0e10cSrcweir     {
190*641de097SOliver-Rainer Wittmann         rDoc.AppendRedline( new SwRedline(*mpRedlData, rPam), sal_False );
191cdf0e10cSrcweir     }
192cdf0e10cSrcweir }
193cdf0e10cSrcweir 
CanGrouping(const SwUndoRedlineDelete & rNext)194cdf0e10cSrcweir sal_Bool SwUndoRedlineDelete::CanGrouping( const SwUndoRedlineDelete& rNext )
195cdf0e10cSrcweir {
196cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
197*641de097SOliver-Rainer Wittmann 	if( UNDO_DELETE == mnUserId && mnUserId == rNext.mnUserId &&
198cdf0e10cSrcweir 		bCanGroup == rNext.bCanGroup &&
199cdf0e10cSrcweir 		bIsDelim == rNext.bIsDelim &&
200cdf0e10cSrcweir 		bIsBackspace == rNext.bIsBackspace &&
201cdf0e10cSrcweir 		nSttNode == nEndNode &&
202cdf0e10cSrcweir 		rNext.nSttNode == nSttNode &&
203cdf0e10cSrcweir 		rNext.nEndNode == nEndNode )
204cdf0e10cSrcweir 	{
205cdf0e10cSrcweir 		int bIsEnd = 0;
206cdf0e10cSrcweir 		if( rNext.nSttCntnt == nEndCntnt )
207cdf0e10cSrcweir 			bIsEnd = 1;
208cdf0e10cSrcweir 		else if( rNext.nEndCntnt == nSttCntnt )
209cdf0e10cSrcweir 			bIsEnd = -1;
210cdf0e10cSrcweir 
211cdf0e10cSrcweir 		if( bIsEnd &&
212*641de097SOliver-Rainer Wittmann 			(( !mpRedlSaveData && !rNext.mpRedlSaveData ) ||
213*641de097SOliver-Rainer Wittmann 			 ( mpRedlSaveData && rNext.mpRedlSaveData &&
214*641de097SOliver-Rainer Wittmann 				SwUndo::CanRedlineGroup( *mpRedlSaveData,
215*641de097SOliver-Rainer Wittmann 							*rNext.mpRedlSaveData, 1 != bIsEnd )
216cdf0e10cSrcweir 			 )))
217cdf0e10cSrcweir 		{
218cdf0e10cSrcweir 			if( 1 == bIsEnd )
219cdf0e10cSrcweir 				nEndCntnt = rNext.nEndCntnt;
220cdf0e10cSrcweir 			else
221cdf0e10cSrcweir 				nSttCntnt = rNext.nSttCntnt;
222cdf0e10cSrcweir 			bRet = sal_True;
223cdf0e10cSrcweir 		}
224cdf0e10cSrcweir 	}
225cdf0e10cSrcweir 	return bRet;
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir /*  */
229cdf0e10cSrcweir 
SwUndoRedlineSort(const SwPaM & rRange,const SwSortOptions & rOpt)230cdf0e10cSrcweir SwUndoRedlineSort::SwUndoRedlineSort( const SwPaM& rRange,
231cdf0e10cSrcweir 									const SwSortOptions& rOpt )
232cdf0e10cSrcweir 	: SwUndoRedline( UNDO_SORT_TXT, rRange ),
233cdf0e10cSrcweir 	pOpt( new SwSortOptions( rOpt ) ),
234cdf0e10cSrcweir 	nSaveEndNode( nEndNode ), nOffset( 0 ), nSaveEndCntnt( nEndCntnt )
235cdf0e10cSrcweir {
236cdf0e10cSrcweir }
237cdf0e10cSrcweir 
~SwUndoRedlineSort()238cdf0e10cSrcweir SwUndoRedlineSort::~SwUndoRedlineSort()
239cdf0e10cSrcweir {
240cdf0e10cSrcweir 	delete pOpt;
241cdf0e10cSrcweir }
242cdf0e10cSrcweir 
UndoRedlineImpl(SwDoc & rDoc,SwPaM & rPam)243cdf0e10cSrcweir void SwUndoRedlineSort::UndoRedlineImpl(SwDoc & rDoc, SwPaM & rPam)
244cdf0e10cSrcweir {
245cdf0e10cSrcweir     // rPam contains the sorted range
246cdf0e10cSrcweir     // aSaveRange contains copied (i.e. original) range
247cdf0e10cSrcweir 
248cdf0e10cSrcweir     SwPosition *const pStart = rPam.Start();
249cdf0e10cSrcweir     SwPosition *const pEnd   = rPam.End();
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 	SwNodeIndex aPrevIdx( pStart->nNode, -1 );
252cdf0e10cSrcweir 	sal_uLong nOffsetTemp = pEnd->nNode.GetIndex() - pStart->nNode.GetIndex();
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 	if( 0 == ( nsRedlineMode_t::REDLINE_SHOW_DELETE & rDoc.GetRedlineMode()) )
255cdf0e10cSrcweir 	{
256cdf0e10cSrcweir 		// die beiden Redline Objecte suchen und diese dann anzeigen lassen,
257cdf0e10cSrcweir 		// damit die Nodes wieder uebereinstimmen!
258cdf0e10cSrcweir 		// das Geloeschte ist versteckt, also suche das INSERT
259cdf0e10cSrcweir 		// Redline Object. Dahinter steht das Geloeschte
260cdf0e10cSrcweir 		sal_uInt16 nFnd = rDoc.GetRedlinePos(
261cdf0e10cSrcweir 							*rDoc.GetNodes()[ nSttNode + 1 ],
262cdf0e10cSrcweir 							nsRedlineType_t::REDLINE_INSERT );
263cdf0e10cSrcweir 		ASSERT( USHRT_MAX != nFnd && nFnd+1 < rDoc.GetRedlineTbl().Count(),
264cdf0e10cSrcweir 					"kein Insert Object gefunden" );
265cdf0e10cSrcweir 		++nFnd;
266cdf0e10cSrcweir 		rDoc.GetRedlineTbl()[nFnd]->Show( 1 );
267cdf0e10cSrcweir 	}
268cdf0e10cSrcweir 
269cdf0e10cSrcweir 	{
270cdf0e10cSrcweir         SwPaM aTmp( *rPam.GetMark() );
271cdf0e10cSrcweir 		aTmp.GetMark()->nContent = 0;
272cdf0e10cSrcweir 		aTmp.SetMark();
273cdf0e10cSrcweir 		aTmp.GetPoint()->nNode = nSaveEndNode;
274cdf0e10cSrcweir 		aTmp.GetPoint()->nContent.Assign( aTmp.GetCntntNode(), nSaveEndCntnt );
275cdf0e10cSrcweir 		rDoc.DeleteRedline( aTmp, true, USHRT_MAX );
276cdf0e10cSrcweir 	}
277cdf0e10cSrcweir 
278cdf0e10cSrcweir     rDoc.DelFullPara(rPam);
279cdf0e10cSrcweir 
280cdf0e10cSrcweir     SwPaM *const pPam = & rPam;
281cdf0e10cSrcweir 	pPam->DeleteMark();
282cdf0e10cSrcweir 	pPam->GetPoint()->nNode.Assign( aPrevIdx.GetNode(), +1 );
283cdf0e10cSrcweir 	SwCntntNode* pCNd = pPam->GetCntntNode();
284cdf0e10cSrcweir 	pPam->GetPoint()->nContent.Assign(pCNd, 0 );
285cdf0e10cSrcweir 	pPam->SetMark();
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 	pPam->GetPoint()->nNode += nOffsetTemp;
288cdf0e10cSrcweir 	pCNd = pPam->GetCntntNode();
289cdf0e10cSrcweir 	pPam->GetPoint()->nContent.Assign( pCNd, pCNd->Len() );
290cdf0e10cSrcweir 
291cdf0e10cSrcweir 	SetValues( *pPam );
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     SetPaM(rPam);
294cdf0e10cSrcweir }
295cdf0e10cSrcweir 
RedoRedlineImpl(SwDoc & rDoc,SwPaM & rPam)296cdf0e10cSrcweir void SwUndoRedlineSort::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam)
297cdf0e10cSrcweir {
298cdf0e10cSrcweir 	SwPaM* pPam = &rPam;
299cdf0e10cSrcweir 	SwPosition* pStart = pPam->Start();
300cdf0e10cSrcweir 	SwPosition* pEnd   = pPam->End();
301cdf0e10cSrcweir 
302cdf0e10cSrcweir 	SwNodeIndex aPrevIdx( pStart->nNode, -1 );
303cdf0e10cSrcweir 	sal_uLong nOffsetTemp = pEnd->nNode.GetIndex() - pStart->nNode.GetIndex();
304cdf0e10cSrcweir 	xub_StrLen nCntStt	= pStart->nContent.GetIndex();
305cdf0e10cSrcweir 
306cdf0e10cSrcweir     rDoc.SortText(rPam, *pOpt);
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 	pPam->DeleteMark();
309cdf0e10cSrcweir 	pPam->GetPoint()->nNode.Assign( aPrevIdx.GetNode(), +1 );
310cdf0e10cSrcweir 	SwCntntNode* pCNd = pPam->GetCntntNode();
311cdf0e10cSrcweir 	xub_StrLen nLen = pCNd->Len();
312cdf0e10cSrcweir 	if( nLen > nCntStt )
313cdf0e10cSrcweir 		nLen = nCntStt;
314cdf0e10cSrcweir 	pPam->GetPoint()->nContent.Assign(pCNd, nLen );
315cdf0e10cSrcweir 	pPam->SetMark();
316cdf0e10cSrcweir 
317cdf0e10cSrcweir 	pPam->GetPoint()->nNode += nOffsetTemp;
318cdf0e10cSrcweir 	pCNd = pPam->GetCntntNode();
319cdf0e10cSrcweir 	pPam->GetPoint()->nContent.Assign( pCNd, pCNd->Len() );
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 	SetValues( rPam );
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 	SetPaM( rPam );
324cdf0e10cSrcweir 	rPam.GetPoint()->nNode = nSaveEndNode;
325cdf0e10cSrcweir 	rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), nSaveEndCntnt );
326cdf0e10cSrcweir }
327cdf0e10cSrcweir 
RepeatImpl(::sw::RepeatContext & rContext)328cdf0e10cSrcweir void SwUndoRedlineSort::RepeatImpl(::sw::RepeatContext & rContext)
329cdf0e10cSrcweir {
330cdf0e10cSrcweir     rContext.GetDoc().SortText( rContext.GetRepeatPaM(), *pOpt );
331cdf0e10cSrcweir }
332cdf0e10cSrcweir 
SetSaveRange(const SwPaM & rRange)333cdf0e10cSrcweir void SwUndoRedlineSort::SetSaveRange( const SwPaM& rRange )
334cdf0e10cSrcweir {
335cdf0e10cSrcweir 	const SwPosition& rPos = *rRange.End();
336cdf0e10cSrcweir 	nSaveEndNode = rPos.nNode.GetIndex();
337cdf0e10cSrcweir 	nSaveEndCntnt = rPos.nContent.GetIndex();
338cdf0e10cSrcweir }
339cdf0e10cSrcweir 
SetOffset(const SwNodeIndex & rIdx)340cdf0e10cSrcweir void SwUndoRedlineSort::SetOffset( const SwNodeIndex& rIdx )
341cdf0e10cSrcweir {
342cdf0e10cSrcweir 	nOffset = rIdx.GetIndex() - nSttNode;
343cdf0e10cSrcweir }
344cdf0e10cSrcweir 
345cdf0e10cSrcweir // SwUndoAcceptRedline ///////////////////////////////////////////////////
346cdf0e10cSrcweir 
SwUndoAcceptRedline(const SwPaM & rRange)347cdf0e10cSrcweir SwUndoAcceptRedline::SwUndoAcceptRedline( const SwPaM& rRange )
348cdf0e10cSrcweir 	: SwUndoRedline( UNDO_ACCEPT_REDLINE, rRange )
349cdf0e10cSrcweir {
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
RedoRedlineImpl(SwDoc & rDoc,SwPaM & rPam)352cdf0e10cSrcweir void SwUndoAcceptRedline::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam)
353cdf0e10cSrcweir {
354cdf0e10cSrcweir     rDoc.AcceptRedline(rPam, false);
355cdf0e10cSrcweir }
356cdf0e10cSrcweir 
RepeatImpl(::sw::RepeatContext & rContext)357cdf0e10cSrcweir void SwUndoAcceptRedline::RepeatImpl(::sw::RepeatContext & rContext)
358cdf0e10cSrcweir {
359cdf0e10cSrcweir     rContext.GetDoc().AcceptRedline(rContext.GetRepeatPaM(), true);
360cdf0e10cSrcweir }
361cdf0e10cSrcweir 
SwUndoRejectRedline(const SwPaM & rRange)362cdf0e10cSrcweir SwUndoRejectRedline::SwUndoRejectRedline( const SwPaM& rRange )
363cdf0e10cSrcweir 	: SwUndoRedline( UNDO_REJECT_REDLINE, rRange )
364cdf0e10cSrcweir {
365cdf0e10cSrcweir }
366cdf0e10cSrcweir 
RedoRedlineImpl(SwDoc & rDoc,SwPaM & rPam)367cdf0e10cSrcweir void SwUndoRejectRedline::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam)
368cdf0e10cSrcweir {
369cdf0e10cSrcweir     rDoc.RejectRedline(rPam, false);
370cdf0e10cSrcweir }
371cdf0e10cSrcweir 
RepeatImpl(::sw::RepeatContext & rContext)372cdf0e10cSrcweir void SwUndoRejectRedline::RepeatImpl(::sw::RepeatContext & rContext)
373cdf0e10cSrcweir {
374cdf0e10cSrcweir     rContext.GetDoc().RejectRedline(rContext.GetRepeatPaM(), true);
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir // SwUndoCompDoc /////////////////////////////////////////////////////////
378cdf0e10cSrcweir 
SwUndoCompDoc(const SwPaM & rRg,sal_Bool bIns)379cdf0e10cSrcweir SwUndoCompDoc::SwUndoCompDoc( const SwPaM& rRg, sal_Bool bIns )
380cdf0e10cSrcweir 	: SwUndo( UNDO_COMPAREDOC ), SwUndRng( rRg ), pRedlData( 0 ),
381cdf0e10cSrcweir 	pUnDel( 0 ), pUnDel2( 0 ), pRedlSaveData( 0 ), bInsert( bIns )
382cdf0e10cSrcweir {
383cdf0e10cSrcweir 	SwDoc* pDoc = (SwDoc*)rRg.GetDoc();
384cdf0e10cSrcweir 	if( pDoc->IsRedlineOn() )
385cdf0e10cSrcweir 	{
386cdf0e10cSrcweir 		RedlineType_t eTyp = bInsert ? nsRedlineType_t::REDLINE_INSERT : nsRedlineType_t::REDLINE_DELETE;
387cdf0e10cSrcweir 		pRedlData = new SwRedlineData( eTyp, pDoc->GetRedlineAuthor() );
388cdf0e10cSrcweir 		SetRedlineMode( pDoc->GetRedlineMode() );
389cdf0e10cSrcweir 	}
390cdf0e10cSrcweir }
391cdf0e10cSrcweir 
SwUndoCompDoc(const SwRedline & rRedl)392cdf0e10cSrcweir SwUndoCompDoc::SwUndoCompDoc( const SwRedline& rRedl )
393cdf0e10cSrcweir 	: SwUndo( UNDO_COMPAREDOC ), SwUndRng( rRedl ), pRedlData( 0 ),
394cdf0e10cSrcweir 	pUnDel( 0 ), pUnDel2( 0 ), pRedlSaveData( 0 ),
395cdf0e10cSrcweir 	// fuers MergeDoc wird aber der jeweils umgekehrte Zweig benoetigt!
396cdf0e10cSrcweir 	bInsert( nsRedlineType_t::REDLINE_DELETE == rRedl.GetType() )
397cdf0e10cSrcweir {
398cdf0e10cSrcweir 	SwDoc* pDoc = (SwDoc*)rRedl.GetDoc();
399cdf0e10cSrcweir 	if( pDoc->IsRedlineOn() )
400cdf0e10cSrcweir 	{
401cdf0e10cSrcweir 		pRedlData = new SwRedlineData( rRedl.GetRedlineData() );
402cdf0e10cSrcweir 		SetRedlineMode( pDoc->GetRedlineMode() );
403cdf0e10cSrcweir 	}
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 	pRedlSaveData = new SwRedlineSaveDatas;
406cdf0e10cSrcweir 	if( !FillSaveData( rRedl, *pRedlSaveData, sal_False, sal_True ))
407cdf0e10cSrcweir 		delete pRedlSaveData, pRedlSaveData = 0;
408cdf0e10cSrcweir }
409cdf0e10cSrcweir 
~SwUndoCompDoc()410cdf0e10cSrcweir SwUndoCompDoc::~SwUndoCompDoc()
411cdf0e10cSrcweir {
412cdf0e10cSrcweir 	delete pRedlData;
413cdf0e10cSrcweir 	delete pUnDel;
414cdf0e10cSrcweir 	delete pUnDel2;
415cdf0e10cSrcweir 	delete pRedlSaveData;
416cdf0e10cSrcweir }
417cdf0e10cSrcweir 
UndoImpl(::sw::UndoRedoContext & rContext)418cdf0e10cSrcweir void SwUndoCompDoc::UndoImpl(::sw::UndoRedoContext & rContext)
419cdf0e10cSrcweir {
420cdf0e10cSrcweir     SwDoc *const pDoc = & rContext.GetDoc();
421cdf0e10cSrcweir     SwPaM *const pPam( & AddUndoRedoPaM(rContext) );
422cdf0e10cSrcweir 
423cdf0e10cSrcweir 	if( !bInsert )
424cdf0e10cSrcweir 	{
425cdf0e10cSrcweir 		// die Redlines loeschen
426cdf0e10cSrcweir 		RedlineMode_t eOld = pDoc->GetRedlineMode();
427cdf0e10cSrcweir 		pDoc->SetRedlineMode_intern((RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON));
428cdf0e10cSrcweir 
429cdf0e10cSrcweir 		pDoc->DeleteRedline( *pPam, true, USHRT_MAX );
430cdf0e10cSrcweir 
431cdf0e10cSrcweir 		pDoc->SetRedlineMode_intern( eOld );
432cdf0e10cSrcweir 
433cdf0e10cSrcweir 		//per definition Point is end (in SwUndRng!)
434cdf0e10cSrcweir 		SwCntntNode* pCSttNd = pPam->GetCntntNode( sal_False );
435cdf0e10cSrcweir 		SwCntntNode* pCEndNd = pPam->GetCntntNode( sal_True );
436cdf0e10cSrcweir 
437cdf0e10cSrcweir 		// if start- and end-content is zero, then the doc-compare moves
438cdf0e10cSrcweir 		// complete nodes into the current doc. And then the selection
439cdf0e10cSrcweir 		// must be from end to start, so the delete join into the right
440cdf0e10cSrcweir 		// direction.
441cdf0e10cSrcweir 		if( !nSttCntnt && !nEndCntnt )
442cdf0e10cSrcweir 			pPam->Exchange();
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 		sal_Bool bJoinTxt, bJoinPrev;
445cdf0e10cSrcweir 		::lcl_GetJoinFlags( *pPam, bJoinTxt, bJoinPrev );
446cdf0e10cSrcweir 
447cdf0e10cSrcweir 		pUnDel = new SwUndoDelete( *pPam, sal_False );
448cdf0e10cSrcweir 
449cdf0e10cSrcweir 		if( bJoinTxt )
450cdf0e10cSrcweir 			::lcl_JoinText( *pPam, bJoinPrev );
451cdf0e10cSrcweir 
452cdf0e10cSrcweir 		if( pCSttNd && !pCEndNd)
453cdf0e10cSrcweir 		{
454cdf0e10cSrcweir             // #112139# Do not step behind the end of content.
455cdf0e10cSrcweir             SwNode * pTmp = pPam->GetNode(sal_True);
456cdf0e10cSrcweir             if (pTmp)
457cdf0e10cSrcweir             {
458cdf0e10cSrcweir                 SwNode * pEnd = pDoc->GetNodes().DocumentSectionEndNode(pTmp);
459cdf0e10cSrcweir 
460cdf0e10cSrcweir                 if (pTmp != pEnd)
461cdf0e10cSrcweir                 {
462cdf0e10cSrcweir                     pPam->SetMark();
463cdf0e10cSrcweir                     pPam->GetPoint()->nNode++;
464cdf0e10cSrcweir                     pPam->GetBound( sal_True ).nContent.Assign( 0, 0 );
465cdf0e10cSrcweir                     pPam->GetBound( sal_False ).nContent.Assign( 0, 0 );
466cdf0e10cSrcweir                     pUnDel2 = new SwUndoDelete( *pPam, sal_True );
467cdf0e10cSrcweir                 }
468cdf0e10cSrcweir             }
469cdf0e10cSrcweir         }
470cdf0e10cSrcweir 		pPam->DeleteMark();
471cdf0e10cSrcweir 	}
472cdf0e10cSrcweir 	else
473cdf0e10cSrcweir 	{
474cdf0e10cSrcweir 		if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ))
475cdf0e10cSrcweir 		{
476cdf0e10cSrcweir 			pDoc->DeleteRedline( *pPam, true, USHRT_MAX );
477cdf0e10cSrcweir 
478cdf0e10cSrcweir 			if( pRedlSaveData )
479cdf0e10cSrcweir 				SetSaveData( *pDoc, *pRedlSaveData );
480cdf0e10cSrcweir 		}
481cdf0e10cSrcweir         SetPaM(*pPam, true);
482cdf0e10cSrcweir     }
483cdf0e10cSrcweir }
484cdf0e10cSrcweir 
RedoImpl(::sw::UndoRedoContext & rContext)485cdf0e10cSrcweir void SwUndoCompDoc::RedoImpl(::sw::UndoRedoContext & rContext)
486cdf0e10cSrcweir {
487cdf0e10cSrcweir     SwDoc *const pDoc = & rContext.GetDoc();
488cdf0e10cSrcweir     SwPaM *const pPam( & AddUndoRedoPaM(rContext) );
489cdf0e10cSrcweir 
490cdf0e10cSrcweir 	if( bInsert )
491cdf0e10cSrcweir 	{
492cdf0e10cSrcweir 		if( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ))
493cdf0e10cSrcweir 		{
494cdf0e10cSrcweir 			SwRedline* pTmp = new SwRedline( *pRedlData, *pPam );
495cdf0e10cSrcweir 			((SwRedlineTbl&)pDoc->GetRedlineTbl()).Insert( pTmp );
496cdf0e10cSrcweir 			pTmp->InvalidateRange();
497cdf0e10cSrcweir 
498cdf0e10cSrcweir /*
499cdf0e10cSrcweir 			SwRedlineMode eOld = pDoc->GetRedlineMode();
500cdf0e10cSrcweir 			pDoc->SetRedlineMode_intern( eOld & ~REDLINE_IGNORE );
501cdf0e10cSrcweir 			pDoc->AppendRedline( new SwRedline( *pRedlData, *pPam ));
502cdf0e10cSrcweir 			pDoc->SetRedlineMode_intern( eOld );
503cdf0e10cSrcweir */
504cdf0e10cSrcweir 		}
505cdf0e10cSrcweir 		else if( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) &&
506cdf0e10cSrcweir 				pDoc->GetRedlineTbl().Count() )
507cdf0e10cSrcweir 			pDoc->SplitRedline( *pPam );
508cdf0e10cSrcweir 	}
509cdf0e10cSrcweir 	else
510cdf0e10cSrcweir 	{
511cdf0e10cSrcweir //		SwRedlineMode eOld = pDoc->GetRedlineMode();
512cdf0e10cSrcweir //		pDoc->SetRedlineMode_intern( ( eOld & ~REDLINE_IGNORE) | REDLINE_ON );
513cdf0e10cSrcweir 
514cdf0e10cSrcweir 		if( pUnDel2 )
515cdf0e10cSrcweir         {
516cdf0e10cSrcweir             pUnDel2->UndoImpl(rContext);
517cdf0e10cSrcweir 			delete pUnDel2, pUnDel2 = 0;
518cdf0e10cSrcweir         }
519cdf0e10cSrcweir         pUnDel->UndoImpl(rContext);
520cdf0e10cSrcweir 		delete pUnDel, pUnDel = 0;
521cdf0e10cSrcweir 
522cdf0e10cSrcweir 		SetPaM( *pPam );
523cdf0e10cSrcweir 
524cdf0e10cSrcweir 		SwRedline* pTmp = new SwRedline( *pRedlData, *pPam );
525cdf0e10cSrcweir 		((SwRedlineTbl&)pDoc->GetRedlineTbl()).Insert( pTmp );
526cdf0e10cSrcweir         if (pTmp) // #i19649#
527cdf0e10cSrcweir             pTmp->InvalidateRange();
528cdf0e10cSrcweir 
529cdf0e10cSrcweir //		pDoc->SetRedlineMode_intern( eOld );
530cdf0e10cSrcweir 	}
531cdf0e10cSrcweir 
532cdf0e10cSrcweir     SetPaM(*pPam, true);
533cdf0e10cSrcweir }
534cdf0e10cSrcweir 
535