xref: /trunk/main/sc/inc/chgtrack.hxx (revision 86e1cf34)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SC_CHGTRACK_HXX
25 #define SC_CHGTRACK_HXX
26 
27 
28 #include <tools/string.hxx>
29 #include <tools/datetime.hxx>
30 #include <tools/table.hxx>
31 #include <tools/stack.hxx>
32 #include <tools/queue.hxx>
33 #include <tools/mempool.hxx>
34 #include <tools/link.hxx>
35 #include <unotools/options.hxx>
36 #include "global.hxx"
37 #include "bigrange.hxx"
38 #include "collect.hxx"
39 #include "scdllapi.h"
40 
41 #ifdef SC_CHGTRACK_CXX
42 // core/inc
43 #include "refupdat.hxx"
44 #endif
45 
46 #define DEBUG_CHANGETRACK 0
47 class ScChangeAction;
48 class ScAppOptions;
49 class ScActionColorChanger
50 {
51 private:
52 	const ScAppOptions&		rOpt;
53 	const ScStrCollection&	rUsers;
54 	String					aLastUserName;
55 	sal_uInt16					nLastUserIndex;
56 	ColorData				nColor;
57 
58 public:
59 				ScActionColorChanger( const ScChangeTrack& rTrack );
~ScActionColorChanger()60 				~ScActionColorChanger() {}
61 				void		Update( const ScChangeAction& rAction );
GetColor() const62 				ColorData	GetColor() const	{ return nColor; }
63 };
64 class ScBaseCell;
65 class ScDocument;
66 
67 
68 enum ScChangeActionType
69 {
70 	SC_CAT_NONE,
71 	SC_CAT_INSERT_COLS,
72 	SC_CAT_INSERT_ROWS,
73 	SC_CAT_INSERT_TABS,
74 	SC_CAT_DELETE_COLS,
75 	SC_CAT_DELETE_ROWS,
76 	SC_CAT_DELETE_TABS,
77 	SC_CAT_MOVE,
78 	SC_CAT_CONTENT,
79 	SC_CAT_REJECT
80 };
81 
82 
83 enum ScChangeActionState
84 {
85 	SC_CAS_VIRGIN,
86 	SC_CAS_ACCEPTED,
87 	SC_CAS_REJECTED
88 };
89 
90 
91 enum ScChangeActionClipMode
92 {
93 	SC_CACM_NONE,
94 	SC_CACM_CUT,
95 	SC_CACM_COPY,
96 	SC_CACM_PASTE
97 };
98 
99 class SvStream;
100 
101 // --- ScChangeActionLinkEntry ---------------------------------------------
102 
103 // Fuegt sich selbst am Beginn einer Kette ein, bzw. vor einem anderen
104 // LinkEntry, on delete selbstaendiges ausklinken auch des gelinkten.
105 // ppPrev == &previous->pNext oder Adresse des Pointers auf Beginn der Kette,
106 // *ppPrev == this
107 
108 class ScChangeAction;
109 
110 class ScChangeActionLinkEntry
111 {
112 								// not implemented, prevent usage
113 								ScChangeActionLinkEntry(
114 									const ScChangeActionLinkEntry& );
115 	ScChangeActionLinkEntry&	operator=( const ScChangeActionLinkEntry& );
116 
117 protected:
118 
119 	ScChangeActionLinkEntry*	pNext;
120 	ScChangeActionLinkEntry**	ppPrev;
121 	ScChangeAction*				pAction;
122 	ScChangeActionLinkEntry*	pLink;
123 
124 public:
125 
126 	DECL_FIXEDMEMPOOL_NEWDEL( ScChangeActionLinkEntry )
127 
ScChangeActionLinkEntry(ScChangeActionLinkEntry ** ppPrevP,ScChangeAction * pActionP)128 								ScChangeActionLinkEntry(
129 										ScChangeActionLinkEntry** ppPrevP,
130 										ScChangeAction* pActionP )
131 									:	pNext( *ppPrevP ),
132 										ppPrev( ppPrevP ),
133 										pAction( pActionP ),
134 										pLink( NULL )
135 									{
136 										if ( pNext )
137 											pNext->ppPrev = &pNext;
138 										*ppPrevP = this;
139 									}
140 
~ScChangeActionLinkEntry()141 	virtual						~ScChangeActionLinkEntry()
142 									{
143 										ScChangeActionLinkEntry* p = pLink;
144 										UnLink();
145 										Remove();
146 										if ( p )
147 											delete p;
148 									}
149 
SetLink(ScChangeActionLinkEntry * pLinkP)150 			void				SetLink( ScChangeActionLinkEntry* pLinkP )
151 									{
152 										UnLink();
153 										if ( pLinkP )
154 										{
155 											pLink = pLinkP;
156 											pLinkP->pLink = this;
157 										}
158 									}
159 
UnLink()160 			void				UnLink()
161 									{
162 										if ( pLink )
163 										{
164 											pLink->pLink = NULL;
165 											pLink = NULL;
166 										}
167 									}
168 
Remove()169 			void				Remove()
170 									{
171 										if ( ppPrev )
172 										{
173                                             if ( ( *ppPrev = pNext ) != NULL )
174 												pNext->ppPrev = ppPrev;
175 											ppPrev = NULL;	// not inserted
176 										}
177 									}
178 
Insert(ScChangeActionLinkEntry ** ppPrevP)179 			void				Insert( ScChangeActionLinkEntry** ppPrevP )
180 									{
181 										if ( !ppPrev )
182 										{
183 											ppPrev = ppPrevP;
184 											if ( (pNext = *ppPrevP) )
185 												pNext->ppPrev = &pNext;
186 											*ppPrevP = this;
187 										}
188 									}
189 
GetLink() const190 	const ScChangeActionLinkEntry*	GetLink() const		{ return pLink; }
GetLink()191 	ScChangeActionLinkEntry*		GetLink()			{ return pLink; }
GetNext() const192 	const ScChangeActionLinkEntry*	GetNext() const		{ return pNext; }
GetNext()193 	ScChangeActionLinkEntry*		GetNext()			{ return pNext; }
GetAction() const194 	const ScChangeAction*			GetAction() const	{ return pAction; }
GetAction()195 	ScChangeAction*					GetAction()			{ return pAction; }
196 #if DEBUG_CHANGETRACK
197     String                          ToString() const;
198 #endif // DEBUG_CHANGETRACK
199 };
200 
201 // --- ScChangeActionCellListEntry -----------------------------------------
202 // this is only for the XML Export in the hxx
203 class ScChangeActionContent;
204 
205 class ScChangeActionCellListEntry
206 {
207 	friend class ScChangeAction;
208 	friend class ScChangeActionDel;
209 	friend class ScChangeActionMove;
210 	friend class ScChangeTrack;
211 
212 			ScChangeActionCellListEntry*	pNext;
213 			ScChangeActionContent*			pContent;
214 
ScChangeActionCellListEntry(ScChangeActionContent * pContentP,ScChangeActionCellListEntry * pNextP)215 								ScChangeActionCellListEntry(
216 									ScChangeActionContent* pContentP,
217 									ScChangeActionCellListEntry* pNextP )
218 									:	pNext( pNextP ),
219 										pContent( pContentP )
220 									{}
221 
222 public:
GetNext() const223 	const ScChangeActionCellListEntry* GetNext() const { return pNext; } // this is only for the XML Export public
GetContent() const224 	const ScChangeActionContent* GetContent() const { return pContent; } // this is only for the XML Export public
225 
226 	DECL_FIXEDMEMPOOL_NEWDEL( ScChangeActionCellListEntry )
227 };
228 
229 // --- ScChangeAction -------------------------------------------------------
230 
231 class ScChangeTrack;
232 class ScChangeActionIns;
233 class ScChangeActionDel;
234 class ScChangeActionContent;
235 
236 class ScChangeAction
237 {
238 	friend class ScChangeTrack;
239 	friend class ScChangeActionIns;
240 	friend class ScChangeActionDel;
241 	friend class ScChangeActionMove;
242 	friend class ScChangeActionContent;
243 
244 								// not implemented, prevent usage
245 								ScChangeAction( const ScChangeAction& );
246 			ScChangeAction&		operator=( const ScChangeAction& );
247 
248 protected:
249 
250 			ScBigRange	  		aBigRange;		 	// Ins/Del/MoveTo/ContentPos
251 			DateTime			aDateTime;			//! UTC
252 			String				aUser;				// wer war's
253 			String				aComment;			// Benutzerkommentar
254 			ScChangeAction*		pNext;				// naechster in Kette
255 			ScChangeAction*		pPrev;				// vorheriger in Kette
256 			ScChangeActionLinkEntry*	pLinkAny;	// irgendwelche Links
257 			ScChangeActionLinkEntry*	pLinkDeletedIn;	// Zuordnung zu
258 													// geloeschten oder
259 													// druebergemoveten oder
260 													// rejecteten Insert
261 													// Bereichen
262 			ScChangeActionLinkEntry*	pLinkDeleted;	// Links zu geloeschten
263 			ScChangeActionLinkEntry*	pLinkDependent;	// Links zu abhaengigen
264 			sal_uLong				nAction;
265 			sal_uLong				nRejectAction;
266 			ScChangeActionType	eType;
267 			ScChangeActionState	eState;
268 
269 
270 								ScChangeAction( ScChangeActionType,
271 												const ScRange& );
272 
273 								// only to be used in the XML import
274 								ScChangeAction( ScChangeActionType,
275 												const ScBigRange&,
276 												const sal_uLong nAction,
277 												const sal_uLong nRejectAction,
278 												const ScChangeActionState eState,
279 												const DateTime& aDateTime,
280 												const String& aUser,
281 												const String& aComment );
282 								// only to be used in the XML import
283 								ScChangeAction( ScChangeActionType,
284 												const ScBigRange&,
285 												const sal_uLong nAction);
286 
287 	virtual						~ScChangeAction();
288 
289 			String				GetRefString( const ScBigRange&,
290 									ScDocument*, sal_Bool bFlag3D = sal_False ) const;
291 
SetActionNumber(sal_uLong n)292 			void				SetActionNumber( sal_uLong n ) { nAction = n; }
SetRejectAction(sal_uLong n)293 			void				SetRejectAction( sal_uLong n ) { nRejectAction = n; }
SetUser(const String & r)294 			void				SetUser( const String& r ) { aUser = r; }
SetType(ScChangeActionType e)295 			void				SetType( ScChangeActionType e ) { eType = e; }
SetState(ScChangeActionState e)296 			void				SetState( ScChangeActionState e ) { eState = e; }
297 			void				SetRejected();
298 
GetBigRange()299 			ScBigRange& 		GetBigRange() { return aBigRange; }
300 
AddLink(ScChangeAction * p,ScChangeActionLinkEntry * pL)301 			ScChangeActionLinkEntry*	AddLink( ScChangeAction* p,
302 											ScChangeActionLinkEntry* pL )
303 									{
304 										ScChangeActionLinkEntry* pLnk =
305 											new ScChangeActionLinkEntry(
306 											&pLinkAny, p );
307 										pLnk->SetLink( pL );
308 										return pLnk;
309 									}
310 			void				RemoveAllAnyLinks();
311 
GetDeletedIn() const312 	virtual	ScChangeActionLinkEntry*	GetDeletedIn() const
313 											{ return pLinkDeletedIn; }
GetDeletedInAddress()314 	virtual	ScChangeActionLinkEntry**	GetDeletedInAddress()
315 											{ return &pLinkDeletedIn; }
AddDeletedIn(ScChangeAction * p)316 			ScChangeActionLinkEntry*	AddDeletedIn( ScChangeAction* p )
317 									{
318 										return new ScChangeActionLinkEntry(
319 											GetDeletedInAddress(), p );
320 									}
321 			sal_Bool				RemoveDeletedIn( const ScChangeAction* );
322 			void				SetDeletedIn( ScChangeAction* );
323 
AddDeleted(ScChangeAction * p)324 			ScChangeActionLinkEntry*	AddDeleted( ScChangeAction* p )
325 									{
326 										return new ScChangeActionLinkEntry(
327 											&pLinkDeleted, p );
328 									}
329 			void				RemoveAllDeleted();
330 
AddDependent(ScChangeAction * p)331 			ScChangeActionLinkEntry*	AddDependent( ScChangeAction* p )
332 									{
333 										return new ScChangeActionLinkEntry(
334 											&pLinkDependent, p );
335 									}
336 			void				RemoveAllDependent();
337 
338 			void				RemoveAllLinks();
339 
340 	virtual	void				AddContent( ScChangeActionContent* ) = 0;
341 	virtual	void				DeleteCellEntries() = 0;
342 
343 	virtual	void 				UpdateReference( const ScChangeTrack*,
344 									UpdateRefMode, const ScBigRange&,
345 									sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
346 
347 			void				Accept();
348 	virtual	sal_Bool				Reject( ScDocument* ) = 0;
349 			void				RejectRestoreContents( ScChangeTrack*,
350 									SCsCOL nDx, SCsROW nDy );
351 
352 								// used in Reject() instead of IsRejectable()
353 			sal_Bool				IsInternalRejectable() const;
354 
355                                 // Derived classes that hold a pointer to the
356                                 // ChangeTrack must return that. Otherwise NULL.
357     virtual const ScChangeTrack*    GetChangeTrack() const = 0;
358 
359 public:
360 
IsInsertType() const361 			sal_Bool				IsInsertType() const
362 									{
363 										return eType == SC_CAT_INSERT_COLS ||
364 											eType == SC_CAT_INSERT_ROWS ||
365 											eType == SC_CAT_INSERT_TABS;
366 									}
IsDeleteType() const367 			sal_Bool				IsDeleteType() const
368 									{
369 										return eType == SC_CAT_DELETE_COLS ||
370 											eType == SC_CAT_DELETE_ROWS ||
371 											eType == SC_CAT_DELETE_TABS;
372 									}
IsVirgin() const373 			sal_Bool				IsVirgin() const
374 									{ return eState == SC_CAS_VIRGIN; }
IsAccepted() const375 			sal_Bool				IsAccepted() const
376 									{ return eState == SC_CAS_ACCEPTED; }
IsRejected() const377 			sal_Bool				IsRejected() const
378 									{ return eState == SC_CAS_REJECTED; }
379 
380 								// Action rejects another Action
IsRejecting() const381 			sal_Bool				IsRejecting() const
382 									{ return nRejectAction != 0; }
383 
384 								// ob Action im Dokument sichtbar ist
385 			sal_Bool				IsVisible() const;
386 
387 								// ob Action anfassbar ist
388 			sal_Bool				IsTouchable() const;
389 
390 								// ob Action ein Eintrag in Dialog-Root ist
391 			sal_Bool				IsDialogRoot() const;
392 
393 								// ob ein Eintrag im Dialog aufklappbar sein soll
394 			sal_Bool				IsDialogParent() const;
395 
396 								// ob Action ein Delete ist, unter dem
397 								// aufgeklappt mehrere einzelne Deletes sind
398 			sal_Bool				IsMasterDelete() const;
399 
400 								// ob Action akzeptiert/selektiert/abgelehnt
401 								// werden kann
402 			sal_Bool				IsClickable() const;
403 
404 								// ob Action abgelehnt werden kann
405 			sal_Bool				IsRejectable() const;
406 
GetBigRange() const407 			const ScBigRange& 	GetBigRange() const { return aBigRange; }
408 			SC_DLLPUBLIC DateTime			GetDateTime() const;		// local time
GetDateTimeUTC() const409 			const DateTime&		GetDateTimeUTC() const		// UTC time
410 									{ return aDateTime; }
GetUser() const411 			const String&		GetUser() const { return aUser; }
GetComment() const412 			const String&		GetComment() const { return aComment; }
GetType() const413 			ScChangeActionType	GetType() const { return eType; }
GetState() const414 			ScChangeActionState	GetState() const { return eState; }
GetActionNumber() const415 			sal_uLong				GetActionNumber() const { return nAction; }
GetRejectAction() const416 			sal_uLong				GetRejectAction() const { return nRejectAction; }
417 
GetNext() const418 			ScChangeAction*		GetNext() const { return pNext; }
GetPrev() const419 			ScChangeAction*		GetPrev() const { return pPrev; }
420 
IsDeletedIn() const421 			sal_Bool				IsDeletedIn() const
422 									{ return GetDeletedIn() != NULL; }
IsDeleted() const423 			sal_Bool				IsDeleted() const
424 									{ return IsDeleteType() || IsDeletedIn(); }
425 			sal_Bool				IsDeletedIn( const ScChangeAction* ) const;
426 			sal_Bool				IsDeletedInDelType( ScChangeActionType ) const;
427             void                RemoveAllDeletedIn();
428 
GetFirstDeletedEntry() const429 			const ScChangeActionLinkEntry* GetFirstDeletedEntry() const
430 									{ return pLinkDeleted; }
GetFirstDependentEntry() const431 			const ScChangeActionLinkEntry* GetFirstDependentEntry() const
432 									{ return pLinkDependent; }
HasDependent() const433 			sal_Bool				HasDependent() const
434 									{ return pLinkDependent != NULL; }
HasDeleted() const435 			sal_Bool				HasDeleted() const
436 									{ return pLinkDeleted != NULL; }
437 
438 								// Description wird an String angehaengt.
439 								// Mit bSplitRange wird bei Delete nur
440 								// eine Spalte/Zeile beruecksichtigt (fuer
441 								// Auflistung der einzelnen Eintraege).
442 	virtual	void				GetDescription( String&, ScDocument*,
443 									sal_Bool bSplitRange = sal_False, bool bWarning = true ) const;
444 
445 	virtual void				GetRefString( String&, ScDocument*,
446 									sal_Bool bFlag3D = sal_False ) const;
447 
448 								// fuer DocumentMerge altes Datum einer anderen
449 								// Action setzen, mit GetDateTimeUTC geholt
SetDateTimeUTC(const DateTime & rDT)450 			void				SetDateTimeUTC( const DateTime& rDT )
451 									{ aDateTime = rDT; }
452 
453 								// Benutzerkommentar setzen
SetComment(const String & rStr)454 			void				SetComment( const String& rStr )
455 									{ aComment = rStr; }
456 
457 								// only to be used in the XML import
458 			void				SetDeletedInThis( sal_uLong nActionNumber,
459 										const ScChangeTrack* pTrack );
460 								// only to be used in the XML import
461 			void				AddDependent( sal_uLong nActionNumber,
462 										const ScChangeTrack* pTrack );
463 #if DEBUG_CHANGETRACK
464             String              ToString( ScDocument* pDoc ) const;
465 #endif // DEBUG_CHANGETRACK
466 };
467 
468 
469 // --- ScChangeActionIns ----------------------------------------------------
470 
471 class ScChangeActionIns : public ScChangeAction
472 {
473 	friend class ScChangeTrack;
474 
475 								ScChangeActionIns( const ScRange& rRange );
476 	virtual						~ScChangeActionIns();
477 
AddContent(ScChangeActionContent *)478 	virtual	void				AddContent( ScChangeActionContent* ) {}
DeleteCellEntries()479 	virtual	void				DeleteCellEntries() {}
480 
481 	virtual	sal_Bool				Reject( ScDocument* );
482 
GetChangeTrack() const483     virtual const ScChangeTrack*    GetChangeTrack() const { return 0; }
484 
485 public:
486 								ScChangeActionIns(const sal_uLong nActionNumber,
487 										const ScChangeActionState eState,
488 										const sal_uLong nRejectingNumber,
489 										const ScBigRange& aBigRange,
490 										const String& aUser,
491 										const DateTime& aDateTime,
492 										const String &sComment,
493 										const ScChangeActionType eType); // only to use in the XML import
494 
495 	virtual	void				GetDescription( String&, ScDocument*,
496 									sal_Bool bSplitRange = sal_False, bool bWarning = true ) const;
497 };
498 
499 
500 // --- ScChangeActionDel ----------------------------------------------------
501 
502 class ScChangeActionMove;
503 
504 class ScChangeActionDelMoveEntry : public ScChangeActionLinkEntry
505 {
506 	friend class ScChangeActionDel;
507 	friend class ScChangeTrack;
508 
509 			short		   		nCutOffFrom;
510 			short		   		nCutOffTo;
511 
512 
ScChangeActionDelMoveEntry(ScChangeActionDelMoveEntry ** ppPrevP,ScChangeActionMove * pMove,short nFrom,short nTo)513 								ScChangeActionDelMoveEntry(
514                                     ScChangeActionDelMoveEntry** ppPrevP,
515 									ScChangeActionMove* pMove,
516 									short nFrom, short nTo )
517 									:	ScChangeActionLinkEntry(
518 											(ScChangeActionLinkEntry**)
519                                                 ppPrevP,
520 											(ScChangeAction*) pMove ),
521 										nCutOffFrom( nFrom ),
522 										nCutOffTo( nTo )
523 									{}
524 
GetNext()525 			ScChangeActionDelMoveEntry*	GetNext()
526 									{
527 										return (ScChangeActionDelMoveEntry*)
528 										ScChangeActionLinkEntry::GetNext();
529 									}
GetMove()530 			ScChangeActionMove*	GetMove()
531 									{
532 										return (ScChangeActionMove*)
533 										ScChangeActionLinkEntry::GetAction();
534 									}
535 
536 public:
GetNext() const537 			const ScChangeActionDelMoveEntry*	GetNext() const
538 									{
539 										return (const ScChangeActionDelMoveEntry*)
540 										ScChangeActionLinkEntry::GetNext();
541 									}
GetMove() const542 			const ScChangeActionMove*	GetMove() const
543 									{
544 										return (const ScChangeActionMove*)
545 										ScChangeActionLinkEntry::GetAction();
546 									}
GetCutOffFrom() const547 			short				GetCutOffFrom() const { return nCutOffFrom; }
GetCutOffTo() const548 			short				GetCutOffTo() const { return nCutOffTo; }
549 };
550 
551 
552 class ScChangeActionDel : public ScChangeAction
553 {
554 	friend class ScChangeTrack;
555 	friend void ScChangeAction::Accept();
556 
557 			ScChangeTrack*		pTrack;
558 			ScChangeActionCellListEntry* pFirstCell;
559 			ScChangeActionIns*	pCutOff;		// abgeschnittener Insert
560 			short				nCutOff;		// +: Start  -: End
561 			ScChangeActionDelMoveEntry* pLinkMove;
562 			SCsCOL				nDx;
563 			SCsROW				nDy;
564 
565 								ScChangeActionDel( const ScRange& rRange,
566 									SCsCOL nDx, SCsROW nDy, ScChangeTrack* );
567 	virtual						~ScChangeActionDel();
568 
GetCutOffInsert()569 			ScChangeActionIns*	GetCutOffInsert() { return pCutOff; }
570 
571 	virtual	void				AddContent( ScChangeActionContent* );
572 	virtual	void				DeleteCellEntries();
573 
574 			void				UndoCutOffMoves();
575 			void				UndoCutOffInsert();
576 
577 	virtual	void 				UpdateReference( const ScChangeTrack*,
578 									UpdateRefMode, const ScBigRange&,
579 									sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
580 
581 	virtual	sal_Bool				Reject( ScDocument* );
582 
GetChangeTrack() const583     virtual const ScChangeTrack*    GetChangeTrack() const { return pTrack; }
584 
585 public:
586 								ScChangeActionDel(const sal_uLong nActionNumber,
587 												const ScChangeActionState eState,
588 												const sal_uLong nRejectingNumber,
589 												const ScBigRange& aBigRange,
590 												const String& aUser,
591 												const DateTime& aDateTime,
592 												const String &sComment,
593 												const ScChangeActionType eType,
594 												const SCsCOLROW nD,
595 												ScChangeTrack* pTrack); // only to use in the XML import
596 																		// which of nDx and nDy is set is depend on the type
597 
598 								// ob dieses das unterste einer Reihe (oder
599 								// auch einzeln) ist
600 			sal_Bool				IsBaseDelete() const;
601 
602 								// ob dieses das oberste einer Reihe (oder
603 								// auch einzeln) ist
604 			sal_Bool				IsTopDelete() const;
605 
606 								// ob dieses ein Teil einer Reihe ist
607 			sal_Bool				IsMultiDelete() const;
608 
609 								// ob es eine Col ist, die zu einem TabDelete gehoert
610 			sal_Bool				IsTabDeleteCol() const;
611 
GetDx() const612 			SCsCOL				GetDx() const { return nDx; }
GetDy() const613 			SCsROW				GetDy() const { return nDy; }
614 			ScBigRange			GetOverAllRange() const;	// BigRange + (nDx, nDy)
615 
GetFirstCellEntry() const616 			const ScChangeActionCellListEntry* GetFirstCellEntry() const
617 									{ return pFirstCell; }
GetFirstMoveEntry() const618 			const ScChangeActionDelMoveEntry* GetFirstMoveEntry() const
619 									{ return pLinkMove; }
GetCutOffInsert() const620 			const ScChangeActionIns*	GetCutOffInsert() const { return pCutOff; }
GetCutOffCount() const621 			short				GetCutOffCount() const { return nCutOff; }
622 
623 	virtual	void				GetDescription( String&, ScDocument*,
624 									sal_Bool bSplitRange = sal_False, bool bWarning = true ) const;
SetCutOffInsert(ScChangeActionIns * p,short n)625 			void				SetCutOffInsert( ScChangeActionIns* p, short n )
626 									{ pCutOff = p; nCutOff = n; }	// only to use in the XML import
627 																	// this should be protected, but for the XML import it is public
628 			// only to use in the XML import
629 			// this should be protected, but for the XML import it is public
AddCutOffMove(ScChangeActionMove * pMove,short nFrom,short nTo)630 			ScChangeActionDelMoveEntry*	AddCutOffMove( ScChangeActionMove* pMove,
631 										short nFrom, short nTo )
632 									{
633 										return new ScChangeActionDelMoveEntry(
634 										&pLinkMove, pMove, nFrom, nTo );
635 									}
636 };
637 
638 
639 // --- ScChangeActionMove ---------------------------------------------------
640 
641 class ScChangeActionMove : public ScChangeAction
642 {
643 	friend class ScChangeTrack;
644 	friend class ScChangeActionDel;
645 
646 			ScBigRange			aFromRange;
647 			ScChangeTrack*		pTrack;
648 			ScChangeActionCellListEntry* pFirstCell;
649 			sal_uLong				nStartLastCut;	// fuer PasteCut Undo
650 			sal_uLong				nEndLastCut;
651 
ScChangeActionMove(const ScRange & rFromRange,const ScRange & rToRange,ScChangeTrack * pTrackP)652 								ScChangeActionMove( const ScRange& rFromRange,
653 									const ScRange& rToRange,
654 									ScChangeTrack* pTrackP )
655 									: ScChangeAction( SC_CAT_MOVE, rToRange ),
656 										aFromRange( rFromRange ),
657 										pTrack( pTrackP ),
658 										pFirstCell( NULL ),
659 										nStartLastCut(0),
660 										nEndLastCut(0)
661 									{}
662 	virtual						~ScChangeActionMove();
663 
664 	virtual	void				AddContent( ScChangeActionContent* );
665 	virtual	void				DeleteCellEntries();
666 
GetFromRange()667 			ScBigRange&			GetFromRange() { return aFromRange; }
668 
SetStartLastCut(sal_uLong nVal)669 			void				SetStartLastCut( sal_uLong nVal ) { nStartLastCut = nVal; }
GetStartLastCut() const670 			sal_uLong				GetStartLastCut() const { return nStartLastCut; }
SetEndLastCut(sal_uLong nVal)671 			void				SetEndLastCut( sal_uLong nVal )	{ nEndLastCut = nVal; }
GetEndLastCut() const672 			sal_uLong				GetEndLastCut() const { return nEndLastCut; }
673 
674 	virtual	void 				UpdateReference( const ScChangeTrack*,
675 									UpdateRefMode, const ScBigRange&,
676 									sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
677 
678 	virtual	sal_Bool				Reject( ScDocument* );
679 
GetChangeTrack() const680     virtual const ScChangeTrack*    GetChangeTrack() const { return pTrack; }
681 
682 protected:
683     using ScChangeAction::GetRefString;
684 
685 public:
686 								ScChangeActionMove(const sal_uLong nActionNumber,
687 												const ScChangeActionState eState,
688 												const sal_uLong nRejectingNumber,
689 												const ScBigRange& aToBigRange,
690 												const String& aUser,
691 												const DateTime& aDateTime,
692 												const String &sComment,
693 												const ScBigRange& aFromBigRange,
694 												ScChangeTrack* pTrack); // only to use in the XML import
GetFirstCellEntry() const695 			const ScChangeActionCellListEntry* GetFirstCellEntry() const
696 									{ return pFirstCell; } // only to use in the XML export
697 
GetFromRange() const698 			const ScBigRange&	GetFromRange() const { return aFromRange; }
699 	SC_DLLPUBLIC		void				GetDelta( sal_Int32& nDx, sal_Int32& nDy, sal_Int32& nDz ) const;
700 
701 	virtual	void				GetDescription( String&, ScDocument*,
702 									sal_Bool bSplitRange = sal_False, bool bWarning = true ) const;
703 
704 	virtual void				GetRefString( String&, ScDocument*,
705 									sal_Bool bFlag3D = sal_False ) const;
706 };
707 
708 
709 // --- ScChangeActionContent ------------------------------------------------
710 
711 enum ScChangeActionContentCellType
712 {
713 	SC_CACCT_NONE = 0,
714 	SC_CACCT_NORMAL,
715 	SC_CACCT_MATORG,
716 	SC_CACCT_MATREF
717 };
718 
719 class Stack;
720 
721 class ScChangeActionContent : public ScChangeAction
722 {
723 	friend class ScChangeTrack;
724 
725 			String				aOldValue;
726 			String				aNewValue;
727 			ScBaseCell*			pOldCell;
728 			ScBaseCell*			pNewCell;
729 		ScChangeActionContent*	pNextContent;	// an gleicher Position
730 		ScChangeActionContent*	pPrevContent;
731 		ScChangeActionContent*	pNextInSlot;	// in gleichem Slot
732 		ScChangeActionContent**	ppPrevInSlot;
733 
InsertInSlot(ScChangeActionContent ** pp)734 			void				InsertInSlot( ScChangeActionContent** pp )
735 									{
736 										if ( !ppPrevInSlot )
737 										{
738 											ppPrevInSlot = pp;
739                                             if ( ( pNextInSlot = *pp ) != NULL )
740 												pNextInSlot->ppPrevInSlot = &pNextInSlot;
741 											*pp = this;
742 										}
743 									}
RemoveFromSlot()744 			void				RemoveFromSlot()
745 									{
746 										if ( ppPrevInSlot )
747 										{
748                                             if ( ( *ppPrevInSlot = pNextInSlot ) != NULL )
749 												pNextInSlot->ppPrevInSlot = ppPrevInSlot;
750 											ppPrevInSlot = NULL;	// not inserted
751 										}
752 									}
GetNextInSlot()753 		ScChangeActionContent*	GetNextInSlot() { return pNextInSlot; }
754 
755 			void				ClearTrack();
756 
757 	static	void				GetStringOfCell( String& rStr,
758 									const ScBaseCell* pCell,
759 									const ScDocument* pDoc,
760 									const ScAddress& rPos );
761 
762 	static	void				GetStringOfCell( String& rStr,
763 									const ScBaseCell* pCell,
764 									const ScDocument* pDoc,
765 									sal_uLong nFormat );
766 
767 	static	void				SetValue( String& rStr, ScBaseCell*& pCell,
768 									const ScAddress& rPos,
769 									const ScBaseCell* pOrgCell,
770 									const ScDocument* pFromDoc,
771 									ScDocument* pToDoc );
772 
773 	static	void				SetValue( String& rStr, ScBaseCell*& pCell,
774 									sal_uLong nFormat,
775 									const ScBaseCell* pOrgCell,
776 									const ScDocument* pFromDoc,
777 									ScDocument* pToDoc );
778 
779 	static	void				SetCell( String& rStr, ScBaseCell* pCell,
780 									sal_uLong nFormat, const ScDocument* pDoc );
781 
782 	static	sal_Bool				NeedsNumberFormat( const ScBaseCell* );
783 
784 			void				SetValueString( String& rValue,
785 									ScBaseCell*& pCell,	const String& rStr,
786 									ScDocument* pDoc );
787 
788 			void				GetValueString( String& rStr,
789 									const String& rValue,
790 									const ScBaseCell* pCell ) const;
791 
792 			void				GetFormulaString( String& rStr,
793 									const ScFormulaCell* pCell ) const;
794 
AddContent(ScChangeActionContent *)795 	virtual	void				AddContent( ScChangeActionContent* ) {}
DeleteCellEntries()796 	virtual	void				DeleteCellEntries() {}
797 
798 	virtual	void 				UpdateReference( const ScChangeTrack*,
799 									UpdateRefMode, const ScBigRange&,
800 									sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
801 
802 	virtual	sal_Bool				Reject( ScDocument* );
803 
GetChangeTrack() const804     virtual const ScChangeTrack*    GetChangeTrack() const { return 0; }
805 
806 								// pRejectActions!=NULL: reject actions get
807 								// stacked, no SetNewValue, no Append
808 			sal_Bool				Select( ScDocument*, ScChangeTrack*,
809 									sal_Bool bOldest, Stack* pRejectActions );
810 
811 			void				PutValueToDoc( ScBaseCell*, const String&,
812 									ScDocument*, SCsCOL nDx, SCsROW nDy ) const;
813 
814 protected:
815     using ScChangeAction::GetRefString;
816 
817 public:
818 
819 	DECL_FIXEDMEMPOOL_NEWDEL( ScChangeActionContent )
820 
ScChangeActionContent(const ScRange & rRange)821 								ScChangeActionContent( const ScRange& rRange )
822 									: ScChangeAction( SC_CAT_CONTENT, rRange ),
823 										pOldCell( NULL ),
824 										pNewCell( NULL ),
825 										pNextContent( NULL ),
826 										pPrevContent( NULL ),
827 										pNextInSlot( NULL ),
828 										ppPrevInSlot( NULL )
829 									{}
830 								ScChangeActionContent(const sal_uLong nActionNumber,
831 												const ScChangeActionState eState,
832 												const sal_uLong nRejectingNumber,
833 												const ScBigRange& aBigRange,
834 												const String& aUser,
835 												const DateTime& aDateTime,
836 												const String &sComment,
837 												ScBaseCell* pOldCell,
838 												ScDocument* pDoc,
839 												const String& sOldValue); // to use for XML Import
840 								ScChangeActionContent(const sal_uLong nActionNumber,
841 												ScBaseCell* pNewCell,
842 												const ScBigRange& aBigRange,
843 												ScDocument* pDoc,
844                                                 const String& sNewValue); // to use for XML Import of Generated Actions
845 	virtual						~ScChangeActionContent();
846 
GetNextContent() const847 		ScChangeActionContent*	GetNextContent() const { return pNextContent; }
GetPrevContent() const848 		ScChangeActionContent*	GetPrevContent() const { return pPrevContent; }
849 		ScChangeActionContent*	GetTopContent() const;
IsTopContent() const850 			sal_Bool				IsTopContent() const
851 									{ return pNextContent == NULL; }
852 
853 	virtual	ScChangeActionLinkEntry*  	GetDeletedIn() const;
854 	virtual	ScChangeActionLinkEntry**	GetDeletedInAddress();
855 
856 			void				PutOldValueToDoc( ScDocument*,
857 									SCsCOL nDx, SCsROW nDy ) const;
858 			void				PutNewValueToDoc( ScDocument*,
859 									SCsCOL nDx, SCsROW nDy ) const;
860 
861 			void				SetOldValue( const ScBaseCell*,
862 									const ScDocument* pFromDoc,
863 									ScDocument* pToDoc,
864 									sal_uLong nFormat );
865 			void				SetOldValue( const ScBaseCell*,
866 									const ScDocument* pFromDoc,
867 									ScDocument* pToDoc );
868 			void				SetNewValue( const ScBaseCell*,	ScDocument* );
869 
870 								// Used in import filter AppendContentOnTheFly,
871 								// takes ownership of cells.
872 			void				SetOldNewCells( ScBaseCell* pOldCell,
873 									sal_uLong nOldFormat, ScBaseCell* pNewCell,
874 									sal_uLong nNewFormat, ScDocument* pDoc );
875 
876 								// Use this only in the XML import,
877 								// takes ownership of cell.
878 			void				SetNewCell( ScBaseCell* pCell, ScDocument* pDoc, const String& rFormatted );
879 
880 								// These functions should be protected but for
881 								// the XML import they are public.
SetNextContent(ScChangeActionContent * p)882 			void				SetNextContent( ScChangeActionContent* p )
883 									{ pNextContent = p; }
SetPrevContent(ScChangeActionContent * p)884 			void				SetPrevContent( ScChangeActionContent* p )
885 									{ pPrevContent = p; }
886 
887 								// moeglichst nicht verwenden,
888 								// setzt nur String bzw. generiert Formelzelle
889 			void				SetOldValue( const String& rOld, ScDocument* );
890 			void				SetNewValue( const String& rNew, ScDocument* );
891 
892 			void				GetOldString( String& ) const;
893 			void				GetNewString( String& ) const;
GetOldCell() const894 			const ScBaseCell*	GetOldCell() const { return pOldCell; }
GetNewCell() const895 			const ScBaseCell*	GetNewCell() const { return pNewCell; }
896 	virtual	void				GetDescription( String&, ScDocument*,
897 									sal_Bool bSplitRange = sal_False, bool bWarning = true ) const;
898 	virtual void				GetRefString( String&, ScDocument*,
899 									sal_Bool bFlag3D = sal_False ) const;
900 
901 	static	ScChangeActionContentCellType	GetContentCellType( const ScBaseCell* );
902 
903 								// NewCell
IsMatrixOrigin() const904 			sal_Bool				IsMatrixOrigin() const
905 									{
906 										return GetContentCellType( GetNewCell() )
907 											== SC_CACCT_MATORG;
908 									}
IsMatrixReference() const909 			sal_Bool				IsMatrixReference() const
910 									{
911 										return GetContentCellType( GetNewCell() )
912 											== SC_CACCT_MATREF;
913 									}
914 								// OldCell
IsOldMatrixOrigin() const915 			sal_Bool				IsOldMatrixOrigin() const
916 									{
917 										return GetContentCellType( GetOldCell() )
918 											== SC_CACCT_MATORG;
919 									}
IsOldMatrixReference() const920 			sal_Bool				IsOldMatrixReference() const
921 									{
922 										return GetContentCellType( GetOldCell() )
923 											== SC_CACCT_MATREF;
924 									}
925 
926 };
927 
928 
929 // --- ScChangeActionReject -------------------------------------------------
930 
931 class Stack;
932 
933 class ScChangeActionReject : public ScChangeAction
934 {
935 	friend class ScChangeTrack;
936 	friend class ScChangeActionContent;
937 
ScChangeActionReject(sal_uLong nReject)938 								ScChangeActionReject( sal_uLong nReject )
939 									: ScChangeAction( SC_CAT_REJECT, ScRange() )
940 									{
941 										SetRejectAction( nReject );
942 										SetState( SC_CAS_ACCEPTED );
943 									}
944 
AddContent(ScChangeActionContent *)945 	virtual	void				AddContent( ScChangeActionContent* ) {}
DeleteCellEntries()946 	virtual	void				DeleteCellEntries() {}
947 
Reject(ScDocument *)948 	virtual	sal_Bool				Reject( ScDocument* ) { return sal_False; }
949 
GetChangeTrack() const950     virtual const ScChangeTrack*    GetChangeTrack() const { return 0; }
951 
952 public:
953 								ScChangeActionReject(const sal_uLong nActionNumber,
954 												const ScChangeActionState eState,
955 												const sal_uLong nRejectingNumber,
956 												const ScBigRange& aBigRange,
957 												const String& aUser,
958 												const DateTime& aDateTime,
959 												const String &sComment); // only to use in the XML import
960 };
961 
962 
963 // --- ScChangeTrack --------------------------------------------------------
964 
965 enum ScChangeTrackMsgType
966 {
967 	SC_CTM_NONE,
968 	SC_CTM_APPEND,		// Actions angehaengt
969 	SC_CTM_REMOVE,		// Actions weggenommen
970 	SC_CTM_CHANGE,		// Actions geaendert
971 	SC_CTM_PARENT		// war kein Parent und ist jetzt einer
972 };
973 
974 struct ScChangeTrackMsgInfo
975 {
976 	DECL_FIXEDMEMPOOL_NEWDEL( ScChangeTrackMsgInfo )
977 
978 	ScChangeTrackMsgType	eMsgType;
979 	sal_uLong					nStartAction;
980 	sal_uLong					nEndAction;
981 };
982 
983 // MsgQueue fuer Benachrichtigung via ModifiedLink
984 DECLARE_QUEUE( ScChangeTrackMsgQueue, ScChangeTrackMsgInfo* )
985 DECLARE_STACK( ScChangeTrackMsgStack, ScChangeTrackMsgInfo* )
986 
987 enum ScChangeTrackMergeState
988 {
989 	SC_CTMS_NONE,
990 	SC_CTMS_PREPARE,
991 	SC_CTMS_OWN,
992     SC_CTMS_UNDO,
993 	SC_CTMS_OTHER
994 };
995 
996 // zusaetzlich zu pFirst/pNext/pLast/pPrev eine Table, um schnell sowohl
997 // per ActionNumber als auch ueber Liste zugreifen zu koennen
998 DECLARE_TABLE( ScChangeActionTable, ScChangeAction* )
999 
1000 // Intern generierte Actions beginnen bei diesem Wert (fast alle Bits gesetzt)
1001 // und werden runtergezaehlt, um sich in einer Table wertemaessig nicht mit den
1002 // "normalen" Actions in die Quere zu kommen.
1003 #define SC_CHGTRACK_GENERATED_START	((sal_uInt32) 0xfffffff0)
1004 
1005 class ScChangeTrack : public utl::ConfigurationListener
1006 {
1007 	friend void ScChangeAction::RejectRestoreContents( ScChangeTrack*, SCsCOL, SCsROW );
1008 	friend sal_Bool ScChangeActionDel::Reject( ScDocument* pDoc );
1009 	friend void ScChangeActionDel::DeleteCellEntries();
1010 	friend void ScChangeActionMove::DeleteCellEntries();
1011 	friend sal_Bool ScChangeActionMove::Reject( ScDocument* pDoc );
1012 
1013     static	const SCROW         nContentRowsPerSlot;
1014     static	const SCSIZE        nContentSlots;
1015 
1016 	com::sun::star::uno::Sequence< sal_Int8 >	aProtectPass;
1017 			ScChangeActionTable	aTable;
1018 			ScChangeActionTable	aGeneratedTable;
1019 			ScChangeActionTable	aPasteCutTable;
1020 		ScChangeTrackMsgQueue	aMsgQueue;
1021 		ScChangeTrackMsgStack	aMsgStackTmp;
1022 		ScChangeTrackMsgStack	aMsgStackFinal;
1023 			ScStrCollection		aUserCollection;
1024 			String				aUser;
1025 			Link				aModifiedLink;
1026 			ScRange				aInDeleteRange;
1027 			DateTime			aFixDateTime;
1028 			ScChangeAction*		pFirst;
1029 			ScChangeAction*		pLast;
1030 		ScChangeActionContent*	pFirstGeneratedDelContent;
1031 		ScChangeActionContent**	ppContentSlots;
1032 		ScChangeActionMove*		pLastCutMove;
1033 	ScChangeActionLinkEntry*	pLinkInsertCol;
1034 	ScChangeActionLinkEntry*	pLinkInsertRow;
1035 	ScChangeActionLinkEntry*	pLinkInsertTab;
1036 	ScChangeActionLinkEntry*	pLinkMove;
1037 		ScChangeTrackMsgInfo*	pBlockModifyMsg;
1038 			ScDocument*			pDoc;
1039 			sal_uLong				nActionMax;
1040 			sal_uLong				nGeneratedMin;
1041 			sal_uLong				nMarkLastSaved;
1042 			sal_uLong				nStartLastCut;
1043 			sal_uLong				nEndLastCut;
1044 			sal_uLong				nLastMerge;
1045 		ScChangeTrackMergeState	eMergeState;
1046 			sal_uInt16				nLoadedFileFormatVersion;
1047 			sal_Bool				bLoadSave;
1048 			sal_Bool				bInDelete;
1049 			sal_Bool				bInDeleteUndo;
1050 			sal_Bool				bInDeleteTop;
1051 			sal_Bool				bInPasteCut;
1052 			sal_Bool				bUseFixDateTime;
1053             sal_Bool                bTime100thSeconds;
1054 
1055 								// not implemented, prevent usage
1056 								ScChangeTrack( const ScChangeTrack& );
1057 			ScChangeTrack&		operator=( const ScChangeTrack& );
1058 
1059 #ifdef SC_CHGTRACK_CXX
1060 	static	SCROW				InitContentRowsPerSlot();
1061 
1062 								// sal_True if one is MM_FORMULA and the other is
1063 								// not, or if both are and range differs
1064 	static	sal_Bool				IsMatrixFormulaRangeDifferent(
1065 									const ScBaseCell* pOldCell,
1066 									const ScBaseCell* pNewCell );
1067 
1068 			void				Init();
1069 			void				DtorClear();
SetLoadSave(sal_Bool bVal)1070 			void				SetLoadSave( sal_Bool bVal ) { bLoadSave = bVal; }
SetInDeleteRange(const ScRange & rRange)1071 			void				SetInDeleteRange( const ScRange& rRange )
1072 									{ aInDeleteRange = rRange; }
SetInDelete(sal_Bool bVal)1073 			void				SetInDelete( sal_Bool bVal )
1074 									{ bInDelete = bVal; }
SetInDeleteTop(sal_Bool bVal)1075 			void				SetInDeleteTop( sal_Bool bVal )
1076 									{ bInDeleteTop = bVal; }
SetInDeleteUndo(sal_Bool bVal)1077 			void				SetInDeleteUndo( sal_Bool bVal )
1078 									{ bInDeleteUndo = bVal; }
SetInPasteCut(sal_Bool bVal)1079 			void				SetInPasteCut( sal_Bool bVal )
1080 									{ bInPasteCut = bVal; }
SetMergeState(ScChangeTrackMergeState eState)1081 			void				SetMergeState( ScChangeTrackMergeState eState )
1082 									{ eMergeState = eState; }
GetMergeState() const1083 		ScChangeTrackMergeState	GetMergeState() const { return eMergeState; }
SetLastMerge(sal_uLong nVal)1084 			void				SetLastMerge( sal_uLong nVal ) { nLastMerge = nVal; }
GetLastMerge() const1085 			sal_uLong				GetLastMerge() const { return nLastMerge; }
1086 
1087 			void				SetLastCutMoveRange( const ScRange&, ScDocument* );
1088 
1089 								// ModifyMsg blockweise und nicht einzeln erzeugen
1090 			void				StartBlockModify( ScChangeTrackMsgType,
1091 									sal_uLong nStartAction );
1092 			void				EndBlockModify( sal_uLong nEndAction );
1093 
1094 			void				AddDependentWithNotify( ScChangeAction* pParent,
1095 									ScChangeAction* pDependent );
1096 
1097 			void				Dependencies( ScChangeAction* );
1098 			void				UpdateReference( ScChangeAction*, sal_Bool bUndo );
1099 			void				UpdateReference( ScChangeAction** ppFirstAction,
1100 									ScChangeAction* pAct, sal_Bool bUndo );
1101 			void				Append( ScChangeAction* pAppend, sal_uLong nAction );
1102 	SC_DLLPUBLIC		void				AppendDeleteRange( const ScRange&,
1103 									ScDocument* pRefDoc, SCsTAB nDz,
1104 									sal_uLong nRejectingInsert );
1105 			void				AppendOneDeleteRange( const ScRange& rOrgRange,
1106 									ScDocument* pRefDoc,
1107 									SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
1108 									sal_uLong nRejectingInsert );
1109 			void				LookUpContents( const ScRange& rOrgRange,
1110 									ScDocument* pRefDoc,
1111 									SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
1112 			void				Remove( ScChangeAction* );
1113 			void				MasterLinks( ScChangeAction* );
1114 
1115 								// Content on top an Position
1116 		ScChangeActionContent*	SearchContentAt( const ScBigAddress&,
1117 									ScChangeAction* pButNotThis ) const;
1118 			void				DeleteGeneratedDelContent(
1119 									ScChangeActionContent* );
1120 		ScChangeActionContent*	GenerateDelContent( const ScAddress&,
1121 									const ScBaseCell*,
1122 									const ScDocument* pFromDoc );
1123 			void				DeleteCellEntries(
1124 									ScChangeActionCellListEntry*&,
1125 									ScChangeAction* pDeletor );
1126 
1127 								// Action und alle abhaengigen rejecten,
1128 								// Table stammt aus vorherigem GetDependents,
1129 								// ist nur bei Insert und Move (MasterType)
1130 								// noetig, kann ansonsten NULL sein.
1131 								// bRecursion == Aufruf aus Reject mit Table
1132 			sal_Bool				Reject( ScChangeAction*,
1133 									ScChangeActionTable*, sal_Bool bRecursion );
1134 
1135 #endif	// SC_CHGTRACK_CXX
1136 
1137 			void				ClearMsgQueue();
1138     virtual void                ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 );
1139 
1140 public:
1141 
ComputeContentSlot(sal_Int32 nRow)1142 	static	SCSIZE				ComputeContentSlot( sal_Int32 nRow )
1143 									{
1144 										if ( nRow < 0 || nRow > MAXROW )
1145 											return nContentSlots - 1;
1146                                         return static_cast< SCSIZE >( nRow / nContentRowsPerSlot );
1147 									}
1148 
1149             SC_DLLPUBLIC        ScChangeTrack( ScDocument* );
1150 								ScChangeTrack( ScDocument*,
1151 											const ScStrCollection& ); // only to use in the XML import
1152             SC_DLLPUBLIC virtual ~ScChangeTrack();
1153 			void				Clear();
1154 
GetFirstGenerated() const1155 			ScChangeActionContent*	GetFirstGenerated() const { return pFirstGeneratedDelContent; }
GetFirst() const1156 			ScChangeAction*		GetFirst() const { return pFirst; }
GetLast() const1157 			ScChangeAction*		GetLast() const	{ return pLast; }
GetActionMax() const1158 			sal_uLong				GetActionMax() const { return nActionMax; }
IsGenerated(sal_uLong nAction) const1159 			sal_Bool				IsGenerated( sal_uLong nAction ) const
1160 									{ return nAction >= nGeneratedMin; }
GetAction(sal_uLong nAction) const1161 			ScChangeAction*		GetAction( sal_uLong nAction ) const
1162 									{ return aTable.Get( nAction ); }
GetGenerated(sal_uLong nGenerated) const1163 			ScChangeAction*		GetGenerated( sal_uLong nGenerated ) const
1164 									{ return aGeneratedTable.Get( nGenerated ); }
GetActionOrGenerated(sal_uLong nAction) const1165 			ScChangeAction*		GetActionOrGenerated( sal_uLong nAction ) const
1166 									{
1167 										return IsGenerated( nAction ) ?
1168 											GetGenerated( nAction ) :
1169 											GetAction( nAction );
1170 									}
GetLastSavedActionNumber() const1171 			sal_uLong				GetLastSavedActionNumber() const
1172 									{ return nMarkLastSaved; }
SetLastSavedActionNumber(sal_uLong nNew)1173             void                SetLastSavedActionNumber(sal_uLong nNew)
1174                                     { nMarkLastSaved = nNew; }
GetLastSaved() const1175 			ScChangeAction*		GetLastSaved() const
1176 									{ return aTable.Get( nMarkLastSaved ); }
GetContentSlots() const1177 		ScChangeActionContent**	GetContentSlots() const { return ppContentSlots; }
1178 
IsLoadSave() const1179 			sal_Bool				IsLoadSave() const { return bLoadSave; }
GetInDeleteRange() const1180 			const ScRange&		GetInDeleteRange() const
1181 									{ return aInDeleteRange; }
IsInDelete() const1182 			sal_Bool				IsInDelete() const { return bInDelete; }
IsInDeleteTop() const1183 			sal_Bool				IsInDeleteTop() const { return bInDeleteTop; }
IsInDeleteUndo() const1184 			sal_Bool				IsInDeleteUndo() const { return bInDeleteUndo; }
IsInPasteCut() const1185 			sal_Bool				IsInPasteCut() const { return bInPasteCut; }
1186 	SC_DLLPUBLIC		void				SetUser( const String& );
GetUser() const1187 			const String&		GetUser() const { return aUser; }
GetUserCollection() const1188 			const ScStrCollection&	GetUserCollection() const
1189 									{ return aUserCollection; }
GetDocument() const1190 			ScDocument*			GetDocument() const { return pDoc; }
1191 								// for import filter
GetFixDateTime() const1192 			const DateTime&		GetFixDateTime() const { return aFixDateTime; }
1193 
1194 								// set this if the date/time set with
1195 								// SetFixDateTime...() shall be applied to
1196 								// appended actions
SetUseFixDateTime(sal_Bool bVal)1197 			void				SetUseFixDateTime( sal_Bool bVal )
1198 									{ bUseFixDateTime = bVal; }
1199 								// for MergeDocument, apply original date/time as UTC
SetFixDateTimeUTC(const DateTime & rDT)1200 			void				SetFixDateTimeUTC( const DateTime& rDT )
1201 									{ aFixDateTime = rDT; }
1202 								// for import filter, apply original date/time as local time
SetFixDateTimeLocal(const DateTime & rDT)1203 			void				SetFixDateTimeLocal( const DateTime& rDT )
1204 									{ aFixDateTime = rDT; aFixDateTime.ConvertToUTC(); }
1205 
1206 			void				Append( ScChangeAction* );
1207 
1208 								// pRefDoc may be NULL => no lookup of contents
1209 								// => no generation of deleted contents
1210 	SC_DLLPUBLIC		void				AppendDeleteRange( const ScRange&,
1211 									ScDocument* pRefDoc,
1212 									sal_uLong& nStartAction, sal_uLong& nEndAction,
1213 									SCsTAB nDz = 0 );
1214 									// nDz: Multi-TabDel, LookUpContent ist
1215 									// um -nDz verschoben zu suchen
1216 
1217 								// nachdem neuer Wert im Dokument gesetzt wurde,
1218 								// alter Wert aus RefDoc/UndoDoc
1219 			void				AppendContent( const ScAddress& rPos,
1220 									ScDocument* pRefDoc );
1221 								// nachdem neue Werte im Dokument gesetzt wurden,
1222 								// alte Werte aus RefDoc/UndoDoc
1223 			void				AppendContentRange( const ScRange& rRange,
1224 									ScDocument* pRefDoc,
1225 									sal_uLong& nStartAction, sal_uLong& nEndAction,
1226 									ScChangeActionClipMode eMode = SC_CACM_NONE );
1227 								// nachdem neuer Wert im Dokument gesetzt wurde,
1228 								// alter Wert aus pOldCell, nOldFormat,
1229 								// RefDoc==NULL => Doc
1230 			void				AppendContent( const ScAddress& rPos,
1231 									const ScBaseCell* pOldCell,
1232 									sal_uLong nOldFormat, ScDocument* pRefDoc = NULL );
1233 								// nachdem neuer Wert im Dokument gesetzt wurde,
1234 								// alter Wert aus pOldCell, Format aus Doc
1235 			void				AppendContent( const ScAddress& rPos,
1236 									const ScBaseCell* pOldCell );
1237 								// nachdem neue Werte im Dokument gesetzt wurden,
1238 								// alte Werte aus RefDoc/UndoDoc.
1239 								// Alle Contents, wo im RefDoc eine Zelle steht.
1240 			void				AppendContentsIfInRefDoc( ScDocument* pRefDoc,
1241 									sal_uLong& nStartAction, sal_uLong& nEndAction );
1242 
1243 								// Meant for import filter, creates and inserts
1244 								// an unconditional content action of the two
1245 								// cells without querying the document, not
1246 								// even for number formats (though the number
1247 								// formatter of the document may be used).
1248 								// The action is returned and may be used to
1249 								// set user name, description, date/time et al.
1250 								// Takes ownership of the cells!
1251 	SC_DLLPUBLIC	ScChangeActionContent*	AppendContentOnTheFly( const ScAddress& rPos,
1252 									ScBaseCell* pOldCell,
1253 									ScBaseCell* pNewCell,
1254 									sal_uLong nOldFormat = 0,
1255 									sal_uLong nNewFormat = 0 );
1256 
1257 								// die folgenden beiden nur benutzen wenn's
1258 								// nicht anders geht (setzen nur String fuer
1259 								// NewValue bzw. Formelerzeugung)
1260 
1261 								// bevor neuer Wert im Dokument gesetzt wird
1262 			void				AppendContent( const ScAddress& rPos,
1263 									const String& rNewValue,
1264 									ScBaseCell* pOldCell );
1265 
1266 	SC_DLLPUBLIC		void				AppendInsert( const ScRange& );
1267 
1268 								// pRefDoc may be NULL => no lookup of contents
1269 								// => no generation of deleted contents
1270 	SC_DLLPUBLIC		void				AppendMove( const ScRange& rFromRange,
1271 									const ScRange& rToRange,
1272 									ScDocument* pRefDoc );
1273 
1274 								// Cut to Clipboard
ResetLastCut()1275 			void				ResetLastCut()
1276 									{
1277 										nStartLastCut = nEndLastCut = 0;
1278 										if ( pLastCutMove )
1279 										{
1280 											delete pLastCutMove;
1281 											pLastCutMove = NULL;
1282 										}
1283 									}
HasLastCut() const1284 			sal_Bool				HasLastCut() const
1285 									{
1286 										return nEndLastCut > 0 &&
1287 											nStartLastCut <= nEndLastCut &&
1288 											pLastCutMove;
1289 									}
1290 
1291 	SC_DLLPUBLIC		void				Undo( sal_uLong nStartAction, sal_uLong nEndAction, bool bMerge = false );
1292 
1293 								// fuer MergeDocument, Referenzen anpassen,
1294 								//! darf nur in einem temporaer geoeffneten
1295 								//! Dokument verwendet werden, der Track
1296 								//! ist danach verhunzt
1297 			void				MergePrepare( ScChangeAction* pFirstMerge, bool bShared = false );
1298 			void				MergeOwn( ScChangeAction* pAct, sal_uLong nFirstMerge, bool bShared = false );
1299 	static	sal_Bool				MergeIgnore( const ScChangeAction&, sal_uLong nFirstMerge );
1300 
1301 								// Abhaengige in Table einfuegen.
1302 								// Bei Insert sind es echte Abhaengige,
1303 								// bei Move abhaengige Contents im FromRange
1304 								// und geloeschte im ToRange bzw. Inserts in
1305 								// FromRange oder ToRange,
1306 								// bei Delete eine Liste der geloeschten,
1307 								// bei Content andere Contents an gleicher
1308 								// Position oder MatrixReferences zu MatrixOrigin.
1309 								// Mit bListMasterDelete werden unter einem
1310 								// MasterDelete alle zu diesem Delete gehoerenden
1311 								// Deletes einer Reihe gelistet.
1312 								// Mit bAllFlat werden auch alle Abhaengigen
1313 								// der Abhaengigen flach eingefuegt.
1314 	SC_DLLPUBLIC		void				GetDependents( ScChangeAction*,
1315 									ScChangeActionTable&,
1316 									sal_Bool bListMasterDelete = sal_False,
1317 									sal_Bool bAllFlat = sal_False ) const;
1318 
1319 								// Reject visible Action (und abhaengige)
1320             sal_Bool                Reject( ScChangeAction*, bool bShared = false );
1321 
1322 								// Accept visible Action (und abhaengige)
1323 	SC_DLLPUBLIC		sal_Bool				Accept( ScChangeAction* );
1324 
1325 			void				AcceptAll();	// alle Virgins
1326 			sal_Bool				RejectAll();	// alle Virgins
1327 
1328 								// Selektiert einen Content von mehreren an
1329 								// gleicher Position und akzeptiert diesen und
1330 								// die aelteren, rejected die neueren.
1331 								// Mit bOldest==sal_True wird der erste OldValue
1332 								// einer Virgin-Content-Kette restauriert.
1333 			sal_Bool				SelectContent( ScChangeAction*,
1334 									sal_Bool bOldest = sal_False );
1335 
1336 								// wenn ModifiedLink gesetzt, landen
1337 								// Aenderungen in ScChangeTrackMsgQueue
SetModifiedLink(const Link & r)1338 			void				SetModifiedLink( const Link& r )
1339 									{ aModifiedLink = r; ClearMsgQueue(); }
GetModifiedLink() const1340 			const Link&			GetModifiedLink() const { return aModifiedLink; }
GetMsgQueue()1341 			ScChangeTrackMsgQueue& GetMsgQueue() { return aMsgQueue; }
1342 
1343 			void				NotifyModified( ScChangeTrackMsgType eMsgType,
1344 									sal_uLong nStartAction, sal_uLong nEndAction );
1345 
GetLoadedFileFormatVersion() const1346 			sal_uInt16				GetLoadedFileFormatVersion() const
1347 									{ return nLoadedFileFormatVersion; }
1348 
1349 			sal_uLong				AddLoadedGenerated(ScBaseCell* pOldCell,
1350 												const ScBigRange& aBigRange, const String& sNewValue ); // only to use in the XML import
1351 			void				AppendLoaded( ScChangeAction* pAppend ); // this is only for the XML import public, it should be protected
SetActionMax(sal_uLong nTempActionMax)1352 			void				SetActionMax(sal_uLong nTempActionMax)
1353 									{ nActionMax = nTempActionMax; } // only to use in the XML import
1354 
SetProtection(const com::sun::star::uno::Sequence<sal_Int8> & rPass)1355             void                SetProtection( const com::sun::star::uno::Sequence< sal_Int8 >& rPass )
1356                                     { aProtectPass = rPass; }
GetProtection() const1357     com::sun::star::uno::Sequence< sal_Int8 >   GetProtection() const
1358                                     { return aProtectPass; }
IsProtected() const1359             sal_Bool                IsProtected() const
1360                                     { return aProtectPass.getLength() != 0; }
1361 
1362                                 // If time stamps of actions of this
1363                                 // ChangeTrack and a second one are to be
1364                                 // compared including 100th seconds.
SetTime100thSeconds(sal_Bool bVal)1365             void                SetTime100thSeconds( sal_Bool bVal )
1366                                     { bTime100thSeconds = bVal; }
IsTime100thSeconds() const1367             sal_Bool                IsTime100thSeconds() const
1368                                     { return bTime100thSeconds; }
1369 
1370             void                AppendCloned( ScChangeAction* pAppend );
1371     SC_DLLPUBLIC ScChangeTrack* Clone( ScDocument* pDocument ) const;
1372             void                MergeActionState( ScChangeAction* pAct, const ScChangeAction* pOtherAct );
1373 #if DEBUG_CHANGETRACK
1374             String              ToString() const;
1375 #endif // DEBUG_CHANGETRACK
1376 };
1377 
1378 
1379 #endif
1380 
1381 
1382