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