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