Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef SC_CHGTRACK_HXX
21 : #define SC_CHGTRACK_HXX
22 :
23 : #include <deque>
24 : #include <map>
25 : #include <set>
26 : #include <stack>
27 :
28 : #include <tools/datetime.hxx>
29 : #include <tools/mempool.hxx>
30 : #include "tools/link.hxx"
31 : #include <unotools/options.hxx>
32 : #include "global.hxx"
33 : #include "bigrange.hxx"
34 : #include "scdllapi.h"
35 : #include "refupdat.hxx"
36 : #include "cellvalue.hxx"
37 :
38 : class ScDocument;
39 : class ScFormulaCell;
40 :
41 : enum ScChangeActionType
42 : {
43 : SC_CAT_NONE,
44 : SC_CAT_INSERT_COLS,
45 : SC_CAT_INSERT_ROWS,
46 : SC_CAT_INSERT_TABS,
47 : SC_CAT_DELETE_COLS,
48 : SC_CAT_DELETE_ROWS,
49 : SC_CAT_DELETE_TABS,
50 : SC_CAT_MOVE,
51 : SC_CAT_CONTENT,
52 : SC_CAT_REJECT
53 : };
54 :
55 :
56 : enum ScChangeActionState
57 : {
58 : SC_CAS_VIRGIN,
59 : SC_CAS_ACCEPTED,
60 : SC_CAS_REJECTED
61 : };
62 :
63 :
64 : enum ScChangeActionClipMode
65 : {
66 : SC_CACM_NONE,
67 : SC_CACM_CUT,
68 : SC_CACM_COPY,
69 : SC_CACM_PASTE
70 : };
71 :
72 : // --- ScChangeActionLinkEntry ---------------------------------------------
73 :
74 : // Inserts itself as the head of a chain (better: linked list?), or before a LinkEntry
75 : // on delete: automatically remove of what is linked (German original was strange...)
76 : // ppPrev == &previous->pNext oder address of pointer to head of linked list,
77 : // *ppPrev == this
78 :
79 : class ScChangeAction;
80 :
81 : class ScChangeActionLinkEntry
82 : {
83 : // not implemented, prevent usage
84 : ScChangeActionLinkEntry( const ScChangeActionLinkEntry& );
85 : ScChangeActionLinkEntry& operator=( const ScChangeActionLinkEntry& );
86 :
87 : protected:
88 :
89 : ScChangeActionLinkEntry* pNext;
90 : ScChangeActionLinkEntry** ppPrev;
91 : ScChangeAction* pAction;
92 : ScChangeActionLinkEntry* pLink;
93 :
94 : public:
95 :
96 0 : DECL_FIXEDMEMPOOL_NEWDEL( ScChangeActionLinkEntry )
97 :
98 0 : ScChangeActionLinkEntry(
99 : ScChangeActionLinkEntry** ppPrevP,
100 : ScChangeAction* pActionP )
101 : : pNext( *ppPrevP ),
102 : ppPrev( ppPrevP ),
103 : pAction( pActionP ),
104 0 : pLink( NULL )
105 : {
106 0 : if ( pNext )
107 0 : pNext->ppPrev = &pNext;
108 0 : *ppPrevP = this;
109 0 : }
110 :
111 0 : virtual ~ScChangeActionLinkEntry()
112 0 : {
113 0 : ScChangeActionLinkEntry* p = pLink;
114 0 : UnLink();
115 0 : Remove();
116 0 : if ( p )
117 0 : delete p;
118 0 : }
119 :
120 0 : void SetLink( ScChangeActionLinkEntry* pLinkP )
121 : {
122 0 : UnLink();
123 0 : if ( pLinkP )
124 : {
125 0 : pLink = pLinkP;
126 0 : pLinkP->pLink = this;
127 : }
128 0 : }
129 :
130 0 : void UnLink()
131 : {
132 0 : if ( pLink )
133 : {
134 0 : pLink->pLink = NULL;
135 0 : pLink = NULL;
136 : }
137 0 : }
138 :
139 0 : void Remove()
140 : {
141 0 : if ( ppPrev )
142 : {
143 0 : if ( ( *ppPrev = pNext ) != NULL )
144 0 : pNext->ppPrev = ppPrev;
145 0 : ppPrev = NULL; // not inserted
146 : }
147 0 : }
148 :
149 : void Insert( ScChangeActionLinkEntry** ppPrevP )
150 : {
151 : if ( !ppPrev )
152 : {
153 : ppPrev = ppPrevP;
154 : if ( (pNext = *ppPrevP) )
155 : pNext->ppPrev = &pNext;
156 : *ppPrevP = this;
157 : }
158 : }
159 :
160 : const ScChangeActionLinkEntry* GetLink() const { return pLink; }
161 : ScChangeActionLinkEntry* GetLink() { return pLink; }
162 0 : const ScChangeActionLinkEntry* GetNext() const { return pNext; }
163 0 : ScChangeActionLinkEntry* GetNext() { return pNext; }
164 0 : const ScChangeAction* GetAction() const { return pAction; }
165 0 : ScChangeAction* GetAction() { return pAction; }
166 : };
167 :
168 : // --- ScChangeActionCellListEntry -----------------------------------------
169 : // this is only for the XML Export in the hxx
170 : class ScChangeActionContent;
171 :
172 : class ScChangeActionCellListEntry
173 : {
174 : friend class ScChangeAction;
175 : friend class ScChangeActionDel;
176 : friend class ScChangeActionMove;
177 : friend class ScChangeTrack;
178 :
179 : ScChangeActionCellListEntry* pNext;
180 : ScChangeActionContent* pContent;
181 :
182 0 : ScChangeActionCellListEntry(
183 : ScChangeActionContent* pContentP,
184 : ScChangeActionCellListEntry* pNextP )
185 : : pNext( pNextP ),
186 0 : pContent( pContentP )
187 0 : {}
188 :
189 : public:
190 : const ScChangeActionCellListEntry* GetNext() const { return pNext; } // this is only for the XML Export public
191 : const ScChangeActionContent* GetContent() const { return pContent; } // this is only for the XML Export public
192 :
193 0 : DECL_FIXEDMEMPOOL_NEWDEL( ScChangeActionCellListEntry )
194 : };
195 :
196 : // --- ScChangeAction -------------------------------------------------------
197 :
198 : class ScChangeTrack;
199 : class ScChangeActionIns;
200 : class ScChangeActionDel;
201 : class ScChangeActionContent;
202 :
203 : class ScChangeAction
204 : {
205 : friend class ScChangeTrack;
206 : friend class ScChangeActionIns;
207 : friend class ScChangeActionDel;
208 : friend class ScChangeActionMove;
209 : friend class ScChangeActionContent;
210 :
211 : // not implemented, prevent usage
212 : ScChangeAction( const ScChangeAction& );
213 : ScChangeAction& operator=( const ScChangeAction& );
214 :
215 : protected:
216 :
217 : ScBigRange aBigRange; // Ins/Del/MoveTo/ContentPos
218 : DateTime aDateTime; //! UTC
219 : OUString aUser; // who?
220 : OUString aComment; // user comment
221 : ScChangeAction* pNext; // next in linked list
222 : ScChangeAction* pPrev; // previous in linked list
223 : ScChangeActionLinkEntry* pLinkAny; // arbitrary links
224 : ScChangeActionLinkEntry* pLinkDeletedIn; // access to insert areas which were
225 : // deleted or moved or rejected
226 : ScChangeActionLinkEntry* pLinkDeleted; // links to deleted
227 : ScChangeActionLinkEntry* pLinkDependent; // links to dependent
228 : sal_uLong nAction;
229 : sal_uLong nRejectAction;
230 : ScChangeActionType eType;
231 : ScChangeActionState eState;
232 :
233 : ScChangeAction( ScChangeActionType, const ScRange& );
234 :
235 : // only to be used in the XML import
236 : ScChangeAction( ScChangeActionType,
237 : const ScBigRange&,
238 : const sal_uLong nAction,
239 : const sal_uLong nRejectAction,
240 : const ScChangeActionState eState,
241 : const DateTime& aDateTime,
242 : const OUString& aUser,
243 : const OUString& aComment );
244 :
245 : // only to be used in the XML import
246 : ScChangeAction( ScChangeActionType, const ScBigRange&, const sal_uLong nAction);
247 :
248 : virtual ~ScChangeAction();
249 :
250 : OUString GetRefString(
251 : const ScBigRange& rRange, ScDocument* pDoc, bool bFlag3D = false) const;
252 :
253 0 : void SetActionNumber( sal_uLong n ) { nAction = n; }
254 0 : void SetRejectAction( sal_uLong n ) { nRejectAction = n; }
255 : void SetUser( const OUString& r );
256 0 : void SetType( ScChangeActionType e ) { eType = e; }
257 0 : void SetState( ScChangeActionState e ) { eState = e; }
258 : void SetRejected();
259 :
260 0 : ScBigRange& GetBigRange() { return aBigRange; }
261 :
262 0 : ScChangeActionLinkEntry* AddLink(
263 : ScChangeAction* p, ScChangeActionLinkEntry* pL )
264 : {
265 : ScChangeActionLinkEntry* pLnk =
266 : new ScChangeActionLinkEntry(
267 0 : &pLinkAny, p );
268 0 : pLnk->SetLink( pL );
269 0 : return pLnk;
270 : }
271 :
272 : void RemoveAllAnyLinks();
273 :
274 0 : virtual ScChangeActionLinkEntry* GetDeletedIn() const
275 0 : { return pLinkDeletedIn; }
276 0 : virtual ScChangeActionLinkEntry** GetDeletedInAddress()
277 0 : { return &pLinkDeletedIn; }
278 0 : ScChangeActionLinkEntry* AddDeletedIn( ScChangeAction* p )
279 : {
280 : return new ScChangeActionLinkEntry(
281 0 : GetDeletedInAddress(), p );
282 : }
283 :
284 : bool RemoveDeletedIn( const ScChangeAction* );
285 : void SetDeletedIn( ScChangeAction* );
286 :
287 0 : ScChangeActionLinkEntry* AddDeleted( ScChangeAction* p )
288 : {
289 0 : return new ScChangeActionLinkEntry(&pLinkDeleted, p);
290 : }
291 :
292 : void RemoveAllDeleted();
293 :
294 0 : ScChangeActionLinkEntry* AddDependent( ScChangeAction* p )
295 : {
296 0 : return new ScChangeActionLinkEntry(&pLinkDependent, p);
297 : }
298 :
299 : void RemoveAllDependent();
300 :
301 : void RemoveAllLinks();
302 :
303 : virtual void AddContent( ScChangeActionContent* ) = 0;
304 : virtual void DeleteCellEntries() = 0;
305 :
306 : virtual void UpdateReference( const ScChangeTrack*,
307 : UpdateRefMode, const ScBigRange&,
308 : sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
309 :
310 : void Accept();
311 : virtual bool Reject(ScDocument* pDoc) = 0;
312 : void RejectRestoreContents( ScChangeTrack*, SCsCOL nDx, SCsROW nDy );
313 :
314 : // used in Reject() instead of IsRejectable()
315 : bool IsInternalRejectable() const;
316 :
317 : // Derived classes that hold a pointer to the
318 : // ChangeTrack must return that. Otherwise NULL.
319 : virtual const ScChangeTrack* GetChangeTrack() const = 0;
320 :
321 : public:
322 : bool IsInsertType() const;
323 : bool IsDeleteType() const;
324 : bool IsVirgin() const;
325 : SC_DLLPUBLIC bool IsAccepted() const;
326 : bool IsRejected() const;
327 :
328 : // Action rejects another Action
329 : bool IsRejecting() const;
330 :
331 : // if action is visible in the document
332 : bool IsVisible() const;
333 :
334 : // if action if touchable
335 : bool IsTouchable() const;
336 :
337 : // if action is an entry in dialog root
338 : bool IsDialogRoot() const;
339 :
340 : // if an entry in a dialog shall be a drop down entry
341 : bool IsDialogParent() const;
342 :
343 : // if action is a delete with subdeletes (aufgeklappt = open ?)
344 : bool IsMasterDelete() const;
345 :
346 : // if action is acceptable/selectable/rejectable
347 : bool IsClickable() const;
348 :
349 : // if action is rejectable
350 : bool IsRejectable() const;
351 :
352 0 : const ScBigRange& GetBigRange() const { return aBigRange; }
353 : SC_DLLPUBLIC DateTime GetDateTime() const; // local time
354 0 : const DateTime& GetDateTimeUTC() const // UTC time
355 0 : { return aDateTime; }
356 0 : ScChangeActionType GetType() const { return eType; }
357 0 : ScChangeActionState GetState() const { return eState; }
358 0 : sal_uLong GetActionNumber() const { return nAction; }
359 0 : sal_uLong GetRejectAction() const { return nRejectAction; }
360 :
361 0 : ScChangeAction* GetNext() const { return pNext; }
362 0 : ScChangeAction* GetPrev() const { return pPrev; }
363 :
364 : bool IsDeletedIn() const;
365 : bool IsDeletedIn( const ScChangeAction* ) const;
366 : bool IsDeletedInDelType( ScChangeActionType ) const;
367 : void RemoveAllDeletedIn();
368 :
369 0 : const ScChangeActionLinkEntry* GetFirstDeletedEntry() const
370 0 : { return pLinkDeleted; }
371 0 : const ScChangeActionLinkEntry* GetFirstDependentEntry() const
372 0 : { return pLinkDependent; }
373 : bool HasDependent() const;
374 : bool HasDeleted() const;
375 : // description will be appended to string
376 : // with bSplitRange only one column/row will be considered for delete
377 : // (for a listing of entries)
378 : virtual void GetDescription(
379 : OUString& rStr, ScDocument* pDoc,
380 : bool bSplitRange = false, bool bWarning = true ) const;
381 :
382 : virtual void GetRefString(
383 : OUString& rStr, ScDocument* pDoc, bool bFlag3D = false ) const;
384 :
385 : // for DocumentMerge set old date of the other
386 : // action, fetched by GetDateTimeUTC
387 0 : void SetDateTimeUTC( const DateTime& rDT )
388 0 : { aDateTime = rDT; }
389 :
390 : SC_DLLPUBLIC const OUString& GetUser() const;
391 : const OUString& GetComment() const;
392 :
393 : // set user comment
394 : void SetComment( const OUString& rStr );
395 :
396 : // only to be used in the XML import
397 : void SetDeletedInThis( sal_uLong nActionNumber,
398 : const ScChangeTrack* pTrack );
399 : // only to be used in the XML import
400 : void AddDependent( sal_uLong nActionNumber,
401 : const ScChangeTrack* pTrack );
402 : };
403 :
404 :
405 : // --- ScChangeActionIns ----------------------------------------------------
406 :
407 : class ScChangeActionIns : public ScChangeAction
408 : {
409 : friend class ScChangeTrack;
410 :
411 : ScChangeActionIns( const ScRange& rRange );
412 : virtual ~ScChangeActionIns();
413 :
414 0 : virtual void AddContent( ScChangeActionContent* ) {}
415 0 : virtual void DeleteCellEntries() {}
416 :
417 : virtual bool Reject(ScDocument* pDoc);
418 :
419 0 : virtual const ScChangeTrack* GetChangeTrack() const { return 0; }
420 :
421 : public:
422 : ScChangeActionIns(const sal_uLong nActionNumber,
423 : const ScChangeActionState eState,
424 : const sal_uLong nRejectingNumber,
425 : const ScBigRange& aBigRange,
426 : const OUString& aUser,
427 : const DateTime& aDateTime,
428 : const OUString &sComment,
429 : const ScChangeActionType eType); // only to use in the XML import
430 :
431 : virtual void GetDescription(
432 : OUString& rStr, ScDocument* pDoc, bool bSplitRange = false, bool bWarning = true) const;
433 : };
434 :
435 :
436 : // --- ScChangeActionDel ----------------------------------------------------
437 :
438 : class ScChangeActionMove;
439 :
440 0 : class ScChangeActionDelMoveEntry : public ScChangeActionLinkEntry
441 : {
442 : friend class ScChangeActionDel;
443 : friend class ScChangeTrack;
444 :
445 : short nCutOffFrom;
446 : short nCutOffTo;
447 :
448 0 : ScChangeActionDelMoveEntry(
449 : ScChangeActionDelMoveEntry** ppPrevP,
450 : ScChangeActionMove* pMove,
451 : short nFrom, short nTo )
452 : : ScChangeActionLinkEntry(
453 : (ScChangeActionLinkEntry**)
454 : ppPrevP,
455 : (ScChangeAction*) pMove ),
456 : nCutOffFrom( nFrom ),
457 0 : nCutOffTo( nTo )
458 0 : {}
459 :
460 : ScChangeActionDelMoveEntry* GetNext()
461 : {
462 : return (ScChangeActionDelMoveEntry*)
463 : ScChangeActionLinkEntry::GetNext();
464 : }
465 0 : ScChangeActionMove* GetMove()
466 : {
467 : return (ScChangeActionMove*)
468 0 : ScChangeActionLinkEntry::GetAction();
469 : }
470 :
471 : public:
472 0 : const ScChangeActionDelMoveEntry* GetNext() const
473 : {
474 : return (const ScChangeActionDelMoveEntry*)
475 0 : ScChangeActionLinkEntry::GetNext();
476 : }
477 : const ScChangeActionMove* GetMove() const
478 : {
479 : return (const ScChangeActionMove*)
480 : ScChangeActionLinkEntry::GetAction();
481 : }
482 0 : short GetCutOffFrom() const { return nCutOffFrom; }
483 0 : short GetCutOffTo() const { return nCutOffTo; }
484 : };
485 :
486 :
487 : class ScChangeActionDel : public ScChangeAction
488 : {
489 : friend class ScChangeTrack;
490 : friend void ScChangeAction::Accept();
491 :
492 : ScChangeTrack* pTrack;
493 : ScChangeActionCellListEntry* pFirstCell;
494 : ScChangeActionIns* pCutOff; // cut insert
495 : short nCutOff; // +: start -: end
496 : ScChangeActionDelMoveEntry* pLinkMove;
497 : SCsCOL nDx;
498 : SCsROW nDy;
499 :
500 : ScChangeActionDel( const ScRange& rRange, SCsCOL nDx, SCsROW nDy, ScChangeTrack* );
501 : virtual ~ScChangeActionDel();
502 :
503 : ScChangeActionIns* GetCutOffInsert() { return pCutOff; }
504 :
505 : virtual void AddContent( ScChangeActionContent* );
506 : virtual void DeleteCellEntries();
507 :
508 : void UndoCutOffMoves();
509 : void UndoCutOffInsert();
510 :
511 : virtual void UpdateReference( const ScChangeTrack*,
512 : UpdateRefMode, const ScBigRange&,
513 : sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
514 :
515 : virtual bool Reject(ScDocument* pDoc);
516 :
517 0 : virtual const ScChangeTrack* GetChangeTrack() const { return pTrack; }
518 :
519 : public:
520 : ScChangeActionDel(
521 : const sal_uLong nActionNumber, const ScChangeActionState eState,
522 : const sal_uLong nRejectingNumber, const ScBigRange& aBigRange,
523 : const OUString& aUser, const DateTime& aDateTime,
524 : const OUString &sComment, const ScChangeActionType eType,
525 : const SCsCOLROW nD, ScChangeTrack* pTrack); // only to use in the XML import
526 : // which of nDx and nDy is set is dependend on the type
527 :
528 : // is the last in a row (or single)
529 : bool IsBaseDelete() const;
530 :
531 : // is the first in a row (or single)
532 : bool IsTopDelete() const;
533 :
534 : // is part of a row
535 : bool IsMultiDelete() const;
536 :
537 : // is col, belonging to a TabDelete
538 : bool IsTabDeleteCol() const;
539 :
540 : SCsCOL GetDx() const;
541 : SCsROW GetDy() const;
542 : ScBigRange GetOverAllRange() const; // BigRange + (nDx, nDy)
543 :
544 : const ScChangeActionCellListEntry* GetFirstCellEntry() const
545 : { return pFirstCell; }
546 0 : const ScChangeActionDelMoveEntry* GetFirstMoveEntry() const
547 0 : { return pLinkMove; }
548 0 : const ScChangeActionIns* GetCutOffInsert() const { return pCutOff; }
549 0 : short GetCutOffCount() const { return nCutOff; }
550 :
551 : virtual void GetDescription(
552 : OUString& rStr, ScDocument* pDoc, bool bSplitRange = false, bool bWarning = true ) const;
553 :
554 0 : void SetCutOffInsert( ScChangeActionIns* p, short n )
555 0 : { pCutOff = p; nCutOff = n; } // only to use in the XML import
556 : // this should be protected, but for the XML import it is public
557 : // only to use in the XML import
558 : // this should be protected, but for the XML import it is public
559 : ScChangeActionDelMoveEntry* AddCutOffMove(
560 : ScChangeActionMove* pMove, short nFrom, short nTo );
561 : };
562 :
563 :
564 : // --- ScChangeActionMove ---------------------------------------------------
565 :
566 : class ScChangeActionMove : public ScChangeAction
567 : {
568 : friend class ScChangeTrack;
569 : friend class ScChangeActionDel;
570 :
571 : ScBigRange aFromRange;
572 : ScChangeTrack* pTrack;
573 : ScChangeActionCellListEntry* pFirstCell;
574 : sal_uLong nStartLastCut; // for PasteCut undo
575 : sal_uLong nEndLastCut;
576 :
577 0 : ScChangeActionMove( const ScRange& rFromRange,
578 : const ScRange& rToRange,
579 : ScChangeTrack* pTrackP )
580 : : ScChangeAction( SC_CAT_MOVE, rToRange ),
581 : aFromRange( rFromRange ),
582 : pTrack( pTrackP ),
583 : pFirstCell( NULL ),
584 : nStartLastCut(0),
585 0 : nEndLastCut(0)
586 0 : {}
587 : virtual ~ScChangeActionMove();
588 :
589 : virtual void AddContent( ScChangeActionContent* );
590 : virtual void DeleteCellEntries();
591 :
592 0 : ScBigRange& GetFromRange() { return aFromRange; }
593 :
594 0 : void SetStartLastCut( sal_uLong nVal ) { nStartLastCut = nVal; }
595 0 : sal_uLong GetStartLastCut() const { return nStartLastCut; }
596 0 : void SetEndLastCut( sal_uLong nVal ) { nEndLastCut = nVal; }
597 0 : sal_uLong GetEndLastCut() const { return nEndLastCut; }
598 :
599 : virtual void UpdateReference( const ScChangeTrack*,
600 : UpdateRefMode, const ScBigRange&,
601 : sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
602 :
603 : virtual bool Reject(ScDocument* pDoc);
604 :
605 0 : virtual const ScChangeTrack* GetChangeTrack() const { return pTrack; }
606 :
607 : protected:
608 : using ScChangeAction::GetRefString;
609 :
610 : public:
611 : ScChangeActionMove(const sal_uLong nActionNumber,
612 : const ScChangeActionState eState,
613 : const sal_uLong nRejectingNumber,
614 : const ScBigRange& aToBigRange,
615 : const OUString& aUser,
616 : const DateTime& aDateTime,
617 : const OUString &sComment,
618 : const ScBigRange& aFromBigRange,
619 : ScChangeTrack* pTrack); // only to use in the XML import
620 :
621 : const ScChangeActionCellListEntry* GetFirstCellEntry() const
622 : { return pFirstCell; } // only to use in the XML export
623 :
624 0 : const ScBigRange& GetFromRange() const { return aFromRange; }
625 : SC_DLLPUBLIC void GetDelta( sal_Int32& nDx, sal_Int32& nDy, sal_Int32& nDz ) const;
626 :
627 : virtual void GetDescription(
628 : OUString& rStr, ScDocument* pDoc, bool bSplitRange = false,
629 : bool bWarning = true ) const;
630 :
631 : virtual void GetRefString(
632 : OUString& rStr, ScDocument* pDoc, bool bFlag3D = false ) const;
633 : };
634 :
635 :
636 : // --- ScChangeActionContent ------------------------------------------------
637 :
638 : enum ScChangeActionContentCellType
639 : {
640 : SC_CACCT_NONE = 0,
641 : SC_CACCT_NORMAL,
642 : SC_CACCT_MATORG,
643 : SC_CACCT_MATREF
644 : };
645 :
646 : class ScChangeActionContent : public ScChangeAction
647 : {
648 : friend class ScChangeTrack;
649 :
650 : ScCellValue maOldCell;
651 : ScCellValue maNewCell;
652 :
653 : OUString maOldValue;
654 : OUString maNewValue;
655 : ScChangeActionContent* pNextContent; // at the same position
656 : ScChangeActionContent* pPrevContent;
657 : ScChangeActionContent* pNextInSlot; // in the same slot
658 : ScChangeActionContent** ppPrevInSlot;
659 :
660 0 : void InsertInSlot( ScChangeActionContent** pp )
661 : {
662 0 : if ( !ppPrevInSlot )
663 : {
664 0 : ppPrevInSlot = pp;
665 0 : if ( ( pNextInSlot = *pp ) != NULL )
666 0 : pNextInSlot->ppPrevInSlot = &pNextInSlot;
667 0 : *pp = this;
668 : }
669 0 : }
670 :
671 0 : void RemoveFromSlot()
672 : {
673 0 : if ( ppPrevInSlot )
674 : {
675 0 : if ( ( *ppPrevInSlot = pNextInSlot ) != NULL )
676 0 : pNextInSlot->ppPrevInSlot = ppPrevInSlot;
677 0 : ppPrevInSlot = NULL; // not inserted
678 : }
679 0 : }
680 :
681 0 : ScChangeActionContent* GetNextInSlot() { return pNextInSlot; }
682 :
683 : void ClearTrack();
684 :
685 : static void GetStringOfCell(
686 : OUString& rStr, const ScCellValue& rCell, const ScDocument* pDoc, const ScAddress& rPos );
687 :
688 : static void GetStringOfCell(
689 : OUString& rStr, const ScCellValue& rCell, const ScDocument* pDoc, sal_uLong nFormat );
690 :
691 : static void SetValue( OUString& rStr, ScCellValue& rCell, const ScAddress& rPos,
692 : const ScCellValue& rOrgCell, const ScDocument* pFromDoc,
693 : ScDocument* pToDoc );
694 :
695 : static void SetValue( OUString& rStr, ScCellValue& rCell, sal_uLong nFormat,
696 : const ScCellValue& rOrgCell, const ScDocument* pFromDoc,
697 : ScDocument* pToDoc );
698 :
699 : static void SetCell( OUString& rStr, ScCellValue& rCell, sal_uLong nFormat, const ScDocument* pDoc );
700 :
701 : static bool NeedsNumberFormat( const ScCellValue& rVal );
702 :
703 : void SetValueString( OUString& rValue, ScCellValue& rCell, const OUString& rStr, ScDocument* pDoc );
704 :
705 : void GetValueString( OUString& rStr, const OUString& rValue, const ScCellValue& rCell ) const;
706 :
707 : void GetFormulaString( OUString& rStr, const ScFormulaCell* pCell ) const;
708 :
709 0 : virtual void AddContent( ScChangeActionContent* ) {}
710 0 : virtual void DeleteCellEntries() {}
711 :
712 : virtual void UpdateReference( const ScChangeTrack*,
713 : UpdateRefMode, const ScBigRange&,
714 : sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz );
715 :
716 : virtual bool Reject(ScDocument* pDoc);
717 :
718 0 : virtual const ScChangeTrack* GetChangeTrack() const { return 0; }
719 :
720 : // pRejectActions!=NULL: reject actions get
721 : // stacked, no SetNewValue, no Append
722 : bool Select( ScDocument*, ScChangeTrack*,
723 : bool bOldest, ::std::stack<ScChangeActionContent*>* pRejectActions );
724 :
725 : void PutValueToDoc(
726 : const ScCellValue& rCell, const OUString& rValue, ScDocument* pDoc, SCsCOL nDx, SCsROW nDy ) const;
727 :
728 : protected:
729 : using ScChangeAction::GetRefString;
730 :
731 : public:
732 :
733 0 : DECL_FIXEDMEMPOOL_NEWDEL( ScChangeActionContent )
734 :
735 : ScChangeActionContent( const ScRange& rRange );
736 :
737 : ScChangeActionContent(
738 : const sal_uLong nActionNumber, const ScChangeActionState eState,
739 : const sal_uLong nRejectingNumber, const ScBigRange& aBigRange,
740 : const OUString& aUser, const DateTime& aDateTime,
741 : const OUString &sComment, const ScCellValue& rOldCell,
742 : ScDocument* pDoc, const OUString& sOldValue ); // to use for XML Import
743 :
744 : ScChangeActionContent(
745 : const sal_uLong nActionNumber, const ScCellValue& rNewCell,
746 : const ScBigRange& aBigRange, ScDocument* pDoc,
747 : const OUString& sNewValue ); // to use for XML Import of Generated Actions
748 :
749 : virtual ~ScChangeActionContent();
750 :
751 0 : ScChangeActionContent* GetNextContent() const { return pNextContent; }
752 0 : ScChangeActionContent* GetPrevContent() const { return pPrevContent; }
753 : ScChangeActionContent* GetTopContent() const;
754 0 : bool IsTopContent() const { return pNextContent == NULL; }
755 :
756 : virtual ScChangeActionLinkEntry* GetDeletedIn() const;
757 : virtual ScChangeActionLinkEntry** GetDeletedInAddress();
758 :
759 : void PutOldValueToDoc( ScDocument*,
760 : SCsCOL nDx, SCsROW nDy ) const;
761 : void PutNewValueToDoc( ScDocument*,
762 : SCsCOL nDx, SCsROW nDy ) const;
763 :
764 : void SetOldValue( const ScCellValue& rCell, const ScDocument* pFromDoc, ScDocument* pToDoc, sal_uLong nFormat );
765 :
766 : void SetOldValue( const ScCellValue& rCell, const ScDocument* pFromDoc, ScDocument* pToDoc );
767 :
768 : void SetNewValue( const ScCellValue& rCell, ScDocument* pDoc );
769 :
770 : // Used in import filter AppendContentOnTheFly,
771 : void SetOldNewCells(
772 : const ScCellValue& rOldCell, sal_uLong nOldFormat,
773 : const ScCellValue& rNewCell, sal_uLong nNewFormat, ScDocument* pDoc );
774 :
775 : // Use this only in the XML import,
776 : // takes ownership of cell.
777 : void SetNewCell(
778 : const ScCellValue& rCell, ScDocument* pDoc, const OUString& rFormatted );
779 :
780 : // These functions should be protected but for
781 : // the XML import they are public.
782 0 : void SetNextContent( ScChangeActionContent* p )
783 0 : { pNextContent = p; }
784 0 : void SetPrevContent( ScChangeActionContent* p )
785 0 : { pPrevContent = p; }
786 :
787 : // don't use:
788 : // assigns string / creates forumula cell
789 : void SetOldValue( const OUString& rOld, ScDocument* pDoc );
790 :
791 : void GetOldString( OUString& rStr ) const;
792 : void GetNewString( OUString& rStr ) const;
793 : SC_DLLPUBLIC const ScCellValue& GetOldCell() const;
794 : SC_DLLPUBLIC const ScCellValue& GetNewCell() const;
795 : virtual void GetDescription(
796 : OUString& rStr, ScDocument* pDoc, bool bSplitRange = false, bool bWarning = true ) const;
797 :
798 : virtual void GetRefString(
799 : OUString& rStr, ScDocument* pDoc, bool bFlag3D = false ) const;
800 :
801 : static ScChangeActionContentCellType GetContentCellType( const ScCellValue& rCell );
802 : static ScChangeActionContentCellType GetContentCellType( const ScRefCellValue& rIter );
803 :
804 : // NewCell
805 : bool IsMatrixOrigin() const;
806 : // OldCell
807 : bool IsOldMatrixReference() const;
808 : };
809 :
810 :
811 : // --- ScChangeActionReject -------------------------------------------------
812 :
813 0 : class ScChangeActionReject : public ScChangeAction
814 : {
815 : friend class ScChangeTrack;
816 : friend class ScChangeActionContent;
817 :
818 : ScChangeActionReject( sal_uLong nReject ) :
819 : ScChangeAction( SC_CAT_REJECT, ScRange() )
820 : {
821 : SetRejectAction( nReject );
822 : SetState( SC_CAS_ACCEPTED );
823 : }
824 :
825 0 : virtual void AddContent( ScChangeActionContent* ) {}
826 0 : virtual void DeleteCellEntries() {}
827 :
828 : virtual bool Reject(ScDocument* pDoc);
829 :
830 0 : virtual const ScChangeTrack* GetChangeTrack() const { return 0; }
831 :
832 : public:
833 : ScChangeActionReject(const sal_uLong nActionNumber,
834 : const ScChangeActionState eState,
835 : const sal_uLong nRejectingNumber,
836 : const ScBigRange& aBigRange,
837 : const OUString& aUser,
838 : const DateTime& aDateTime,
839 : const OUString &sComment); // only to use in the XML import
840 : };
841 :
842 :
843 : // --- ScChangeTrack --------------------------------------------------------
844 :
845 : enum ScChangeTrackMsgType
846 : {
847 : SC_CTM_NONE,
848 : SC_CTM_APPEND, // Actions appended
849 : SC_CTM_REMOVE, // Actions removed
850 : SC_CTM_CHANGE, // Actions changed
851 : SC_CTM_PARENT // became a parent (and wasn't before)
852 : };
853 :
854 : struct ScChangeTrackMsgInfo
855 : {
856 0 : DECL_FIXEDMEMPOOL_NEWDEL( ScChangeTrackMsgInfo )
857 :
858 : ScChangeTrackMsgType eMsgType;
859 : sal_uLong nStartAction;
860 : sal_uLong nEndAction;
861 : };
862 :
863 : // MsgQueue for notification via ModifiedLink
864 : typedef std::deque<ScChangeTrackMsgInfo*> ScChangeTrackMsgQueue;
865 : typedef std::stack<ScChangeTrackMsgInfo*> ScChangeTrackMsgStack;
866 : typedef std::map<sal_uLong, ScChangeAction*> ScChangeActionMap;
867 :
868 : enum ScChangeTrackMergeState
869 : {
870 : SC_CTMS_NONE,
871 : SC_CTMS_PREPARE,
872 : SC_CTMS_OWN,
873 : SC_CTMS_UNDO,
874 : SC_CTMS_OTHER
875 : };
876 :
877 : // Internally generated actions start at this value (nearly all bits set)
878 : // and are decremented, to keep values in a table separated from "normal" actions.
879 : #define SC_CHGTRACK_GENERATED_START ((sal_uInt32) 0xfffffff0)
880 :
881 : class ScChangeTrack : public utl::ConfigurationListener
882 : {
883 : friend void ScChangeAction::RejectRestoreContents( ScChangeTrack*, SCsCOL, SCsROW );
884 : friend bool ScChangeActionDel::Reject( ScDocument* pDoc );
885 : friend void ScChangeActionDel::DeleteCellEntries();
886 : friend void ScChangeActionMove::DeleteCellEntries();
887 : friend bool ScChangeActionMove::Reject( ScDocument* pDoc );
888 :
889 : static const SCROW nContentRowsPerSlot;
890 : static const SCSIZE nContentSlots;
891 :
892 : com::sun::star::uno::Sequence< sal_Int8 > aProtectPass;
893 : ScChangeActionMap aMap;
894 : ScChangeActionMap aGeneratedMap;
895 : ScChangeActionMap aPasteCutMap;
896 : ScChangeTrackMsgQueue aMsgQueue;
897 : ScChangeTrackMsgStack aMsgStackTmp;
898 : ScChangeTrackMsgStack aMsgStackFinal;
899 : std::set<OUString> maUserCollection;
900 : OUString maUser;
901 : Link aModifiedLink;
902 : ScRange aInDeleteRange;
903 : DateTime aFixDateTime;
904 : ScChangeAction* pFirst;
905 : ScChangeAction* pLast;
906 : ScChangeActionContent* pFirstGeneratedDelContent;
907 : ScChangeActionContent** ppContentSlots;
908 : ScChangeActionMove* pLastCutMove;
909 : ScChangeActionLinkEntry* pLinkInsertCol;
910 : ScChangeActionLinkEntry* pLinkInsertRow;
911 : ScChangeActionLinkEntry* pLinkInsertTab;
912 : ScChangeActionLinkEntry* pLinkMove;
913 : ScChangeTrackMsgInfo* pBlockModifyMsg;
914 : ScDocument* pDoc;
915 : sal_uLong nActionMax;
916 : sal_uLong nGeneratedMin;
917 : sal_uLong nMarkLastSaved;
918 : sal_uLong nStartLastCut;
919 : sal_uLong nEndLastCut;
920 : sal_uLong nLastMerge;
921 : ScChangeTrackMergeState eMergeState;
922 : bool bLoadSave:1;
923 : bool bInDelete:1;
924 : bool bInDeleteUndo:1;
925 : bool bInDeleteTop:1;
926 : bool bInPasteCut:1;
927 : bool bUseFixDateTime:1;
928 : bool bTimeNanoSeconds:1;
929 :
930 : // not implemented, prevent usage
931 : ScChangeTrack( const ScChangeTrack& );
932 : ScChangeTrack& operator=( const ScChangeTrack& );
933 :
934 : static SCROW InitContentRowsPerSlot();
935 :
936 : // true if one is MM_FORMULA and the other is
937 : // not, or if both are and range differs
938 : static bool IsMatrixFormulaRangeDifferent(
939 : const ScCellValue& rOldCell, const ScCellValue& rNewCell );
940 :
941 : void Init();
942 : void DtorClear();
943 : void SetLoadSave( bool bVal ) { bLoadSave = bVal; }
944 0 : void SetInDeleteRange( const ScRange& rRange )
945 0 : { aInDeleteRange = rRange; }
946 0 : void SetInDelete( bool bVal )
947 0 : { bInDelete = bVal; }
948 0 : void SetInDeleteTop( bool bVal )
949 0 : { bInDeleteTop = bVal; }
950 0 : void SetInDeleteUndo( bool bVal )
951 0 : { bInDeleteUndo = bVal; }
952 0 : void SetInPasteCut( bool bVal )
953 0 : { bInPasteCut = bVal; }
954 0 : void SetMergeState( ScChangeTrackMergeState eState )
955 0 : { eMergeState = eState; }
956 0 : ScChangeTrackMergeState GetMergeState() const { return eMergeState; }
957 0 : void SetLastMerge( sal_uLong nVal ) { nLastMerge = nVal; }
958 0 : sal_uLong GetLastMerge() const { return nLastMerge; }
959 :
960 : void SetLastCutMoveRange( const ScRange&, ScDocument* );
961 :
962 : // create block of ModifyMsg
963 : void StartBlockModify( ScChangeTrackMsgType,
964 : sal_uLong nStartAction );
965 : void EndBlockModify( sal_uLong nEndAction );
966 :
967 : void AddDependentWithNotify( ScChangeAction* pParent,
968 : ScChangeAction* pDependent );
969 :
970 : void Dependencies( ScChangeAction* );
971 : void UpdateReference( ScChangeAction*, bool bUndo );
972 : void UpdateReference( ScChangeAction** ppFirstAction, ScChangeAction* pAct, bool bUndo );
973 : void Append( ScChangeAction* pAppend, sal_uLong nAction );
974 : SC_DLLPUBLIC void AppendDeleteRange( const ScRange&,
975 : ScDocument* pRefDoc, SCsTAB nDz,
976 : sal_uLong nRejectingInsert );
977 : void AppendOneDeleteRange( const ScRange& rOrgRange,
978 : ScDocument* pRefDoc,
979 : SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
980 : sal_uLong nRejectingInsert );
981 : void LookUpContents( const ScRange& rOrgRange,
982 : ScDocument* pRefDoc,
983 : SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
984 : void Remove( ScChangeAction* );
985 : void MasterLinks( ScChangeAction* );
986 :
987 : // Content on top an Position
988 : ScChangeActionContent* SearchContentAt( const ScBigAddress&,
989 : ScChangeAction* pButNotThis ) const;
990 : void DeleteGeneratedDelContent(
991 : ScChangeActionContent* );
992 :
993 : ScChangeActionContent* GenerateDelContent(
994 : const ScAddress& rPos, const ScCellValue& rCell, const ScDocument* pFromDoc );
995 :
996 : void DeleteCellEntries(
997 : ScChangeActionCellListEntry*&,
998 : ScChangeAction* pDeletor );
999 :
1000 : // Reject action and all dependent actions,
1001 : // Table stems from previous GetDependents,
1002 : // only needed for Insert and Move (MasterType),
1003 : // is NULL otherwise.
1004 : // bRecursion == called from reject with table
1005 : bool Reject( ScChangeAction*, ScChangeActionMap*, bool bRecursion );
1006 :
1007 : void ClearMsgQueue();
1008 : virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 );
1009 :
1010 : public:
1011 :
1012 0 : static SCSIZE ComputeContentSlot( sal_Int32 nRow )
1013 : {
1014 0 : if ( nRow < 0 || nRow > MAXROW )
1015 0 : return nContentSlots - 1;
1016 0 : return static_cast< SCSIZE >( nRow / nContentRowsPerSlot );
1017 : }
1018 :
1019 : SC_DLLPUBLIC ScChangeTrack( ScDocument* );
1020 : ScChangeTrack(ScDocument* pDocP, const std::set<OUString>& aTempUserCollection); // only to use in the XML import
1021 : SC_DLLPUBLIC virtual ~ScChangeTrack();
1022 : void Clear();
1023 :
1024 0 : ScChangeActionContent* GetFirstGenerated() const { return pFirstGeneratedDelContent; }
1025 0 : ScChangeAction* GetFirst() const { return pFirst; }
1026 0 : ScChangeAction* GetLast() const { return pLast; }
1027 0 : sal_uLong GetActionMax() const { return nActionMax; }
1028 0 : bool IsGenerated( sal_uLong nAction ) const
1029 0 : { return nAction >= nGeneratedMin; }
1030 0 : ScChangeAction* GetAction( sal_uLong nAction ) const
1031 : {
1032 0 : ScChangeActionMap::const_iterator it = aMap.find( nAction );
1033 0 : if( it != aMap.end() )
1034 0 : return it->second;
1035 : else
1036 0 : return NULL;
1037 : }
1038 0 : ScChangeAction* GetGenerated( sal_uLong nGenerated ) const
1039 : {
1040 0 : ScChangeActionMap::const_iterator it = aGeneratedMap.find( nGenerated );
1041 0 : if( it != aGeneratedMap.end() )
1042 0 : return it->second;
1043 : else
1044 0 : return NULL;
1045 : }
1046 0 : ScChangeAction* GetActionOrGenerated( sal_uLong nAction ) const
1047 : {
1048 0 : return IsGenerated( nAction ) ?
1049 : GetGenerated( nAction ) :
1050 0 : GetAction( nAction );
1051 : }
1052 0 : sal_uLong GetLastSavedActionNumber() const
1053 0 : { return nMarkLastSaved; }
1054 0 : void SetLastSavedActionNumber(sal_uLong nNew)
1055 0 : { nMarkLastSaved = nNew; }
1056 0 : ScChangeAction* GetLastSaved() const
1057 : {
1058 0 : ScChangeActionMap::const_iterator it = aMap.find( nMarkLastSaved );
1059 0 : if( it != aMap.end() )
1060 0 : return it->second;
1061 : else
1062 0 : return NULL;
1063 : }
1064 0 : ScChangeActionContent** GetContentSlots() const { return ppContentSlots; }
1065 :
1066 0 : bool IsLoadSave() const { return bLoadSave; }
1067 0 : const ScRange& GetInDeleteRange() const
1068 0 : { return aInDeleteRange; }
1069 0 : bool IsInDelete() const { return bInDelete; }
1070 0 : bool IsInDeleteTop() const { return bInDeleteTop; }
1071 0 : bool IsInDeleteUndo() const { return bInDeleteUndo; }
1072 0 : bool IsInPasteCut() const { return bInPasteCut; }
1073 : SC_DLLPUBLIC void SetUser( const OUString& rUser );
1074 : SC_DLLPUBLIC const OUString& GetUser() const;
1075 : SC_DLLPUBLIC const std::set<OUString>& GetUserCollection() const;
1076 0 : ScDocument* GetDocument() const { return pDoc; }
1077 : // for import filter
1078 0 : const DateTime& GetFixDateTime() const { return aFixDateTime; }
1079 :
1080 : // set this if the date/time set with
1081 : // SetFixDateTime...() shall be applied to
1082 : // appended actions
1083 0 : void SetUseFixDateTime( bool bVal )
1084 0 : { bUseFixDateTime = bVal; }
1085 : // for MergeDocument, apply original date/time as UTC
1086 0 : void SetFixDateTimeUTC( const DateTime& rDT )
1087 0 : { aFixDateTime = rDT; }
1088 : // for import filter, apply original date/time as local time
1089 0 : void SetFixDateTimeLocal( const DateTime& rDT )
1090 0 : { aFixDateTime = rDT; aFixDateTime.ConvertToUTC(); }
1091 :
1092 : void Append( ScChangeAction* );
1093 :
1094 : // pRefDoc may be NULL => no lookup of contents
1095 : // => no generation of deleted contents
1096 : SC_DLLPUBLIC void AppendDeleteRange( const ScRange&,
1097 : ScDocument* pRefDoc,
1098 : sal_uLong& nStartAction, sal_uLong& nEndAction,
1099 : SCsTAB nDz = 0 );
1100 : // nDz: multi TabDel, LookUpContent must be searched
1101 : // with an offset of -nDz
1102 :
1103 : // after new value was set in the document,
1104 : // old value from RefDoc/UndoDoc
1105 : void AppendContent( const ScAddress& rPos,
1106 : ScDocument* pRefDoc );
1107 : // after new values were set in the document,
1108 : // old values from RefDoc/UndoDoc
1109 : void AppendContentRange( const ScRange& rRange,
1110 : ScDocument* pRefDoc,
1111 : sal_uLong& nStartAction, sal_uLong& nEndAction,
1112 : ScChangeActionClipMode eMode = SC_CACM_NONE );
1113 : // after new value was set in the document,
1114 : // old value from pOldCell, nOldFormat,
1115 : // RefDoc==NULL => Doc
1116 : void AppendContent( const ScAddress& rPos, const ScCellValue& rOldCell,
1117 : sal_uLong nOldFormat, ScDocument* pRefDoc = NULL );
1118 : // after new value was set in the document,
1119 : // old value from pOldCell, format from Doc
1120 : void AppendContent( const ScAddress& rPos, const ScCellValue& rOldCell );
1121 : // after new values were set in the document,
1122 : // old values from RefDoc/UndoDoc.
1123 : // All contents with a cell in RefDoc
1124 : void AppendContentsIfInRefDoc( ScDocument* pRefDoc,
1125 : sal_uLong& nStartAction, sal_uLong& nEndAction );
1126 :
1127 : // Meant for import filter, creates and inserts
1128 : // an unconditional content action of the two
1129 : // cells without querying the document, not
1130 : // even for number formats (though the number
1131 : // formatter of the document may be used).
1132 : // The action is returned and may be used to
1133 : // set user name, description, date/time et al.
1134 : // Takes ownership of the cells!
1135 : SC_DLLPUBLIC ScChangeActionContent* AppendContentOnTheFly(
1136 : const ScAddress& rPos, const ScCellValue& rOldCell, const ScCellValue& rNewCell,
1137 : sal_uLong nOldFormat = 0, sal_uLong nNewFormat = 0 );
1138 :
1139 : // Only use the following two if there is no different solution! (Assign
1140 : // string for NewValue or creation of a formula respectively)
1141 :
1142 : SC_DLLPUBLIC void AppendInsert( const ScRange& );
1143 :
1144 : // pRefDoc may be NULL => no lookup of contents
1145 : // => no generation of deleted contents
1146 : SC_DLLPUBLIC void AppendMove( const ScRange& rFromRange, const ScRange& rToRange,
1147 : ScDocument* pRefDoc );
1148 :
1149 : // Cut to Clipboard
1150 0 : void ResetLastCut()
1151 : {
1152 0 : nStartLastCut = nEndLastCut = 0;
1153 0 : if ( pLastCutMove )
1154 : {
1155 0 : delete pLastCutMove;
1156 0 : pLastCutMove = NULL;
1157 : }
1158 0 : }
1159 0 : bool HasLastCut() const
1160 : {
1161 0 : return nEndLastCut > 0 &&
1162 0 : nStartLastCut <= nEndLastCut &&
1163 0 : pLastCutMove;
1164 : }
1165 :
1166 : SC_DLLPUBLIC void Undo( sal_uLong nStartAction, sal_uLong nEndAction, bool bMerge = false );
1167 :
1168 : // adjust references for MergeDocument
1169 : //! may only be used in a temporary opened document.
1170 : //! the Track (?) is unclean afterwards
1171 : void MergePrepare( ScChangeAction* pFirstMerge, bool bShared = false );
1172 : void MergeOwn( ScChangeAction* pAct, sal_uLong nFirstMerge, bool bShared = false );
1173 : static bool MergeIgnore( const ScChangeAction&, sal_uLong nFirstMerge );
1174 :
1175 : // This comment was already really strange in German.
1176 : // Tried to structure it a little. Hope no information got lost...
1177 : //
1178 : // Insert dependents into table.
1179 : // ScChangeAction is
1180 : // - "Insert": really dependents
1181 : // - "Move": dependent contents in FromRange /
1182 : // deleted contents in ToRange
1183 : // OR inserts in FromRange or ToRange
1184 : // - "Delete": a list of deleted (what?)
1185 : // OR for content, different contents at the same position
1186 : // OR MatrixReferences belonging to MatrixOrigin
1187 : //
1188 : // With bListMasterDelete (==TRUE ?) all Deletes of a row belonging
1189 : // to a MasterDelete are listed (possibly it is
1190 : // "all Deletes belonging...are listed in a row?)
1191 : //
1192 : // With bAllFlat (==TRUE ?) all dependents of dependents
1193 : // will be inserted flatly.
1194 :
1195 : SC_DLLPUBLIC void GetDependents(
1196 : ScChangeAction*, ScChangeActionMap&, bool bListMasterDelete = false, bool bAllFlat = false ) const;
1197 :
1198 : // Reject visible action (and dependents)
1199 : bool Reject( ScChangeAction*, bool bShared = false );
1200 :
1201 : // Accept visible action (and dependents)
1202 : SC_DLLPUBLIC bool Accept( ScChangeAction* );
1203 :
1204 : void AcceptAll(); // all Virgins
1205 : bool RejectAll(); // all Virgins
1206 :
1207 : // Selects a content of several contents at the same
1208 : // position and accepts this one and
1209 : // the older ones, rejects the more recent ones.
1210 : // If bOldest==TRUE then the first OldValue
1211 : // of a Virgin-Content-List will be restored.
1212 : bool SelectContent( ScChangeAction*, bool bOldest = false );
1213 :
1214 : // If ModifiedLink is set, changes go to
1215 : // ScChangeTrackMsgQueue
1216 0 : void SetModifiedLink( const Link& r )
1217 0 : { aModifiedLink = r; ClearMsgQueue(); }
1218 : const Link& GetModifiedLink() const { return aModifiedLink; }
1219 0 : ScChangeTrackMsgQueue& GetMsgQueue() { return aMsgQueue; }
1220 :
1221 : void NotifyModified( ScChangeTrackMsgType eMsgType,
1222 : sal_uLong nStartAction, sal_uLong nEndAction );
1223 :
1224 : sal_uLong AddLoadedGenerated(
1225 : const ScCellValue& rNewCell, const ScBigRange& aBigRange, const OUString& sNewValue ); // only to use in the XML import
1226 : void AppendLoaded( ScChangeAction* pAppend ); // this is only for the XML import public, it should be protected
1227 0 : void SetActionMax(sal_uLong nTempActionMax)
1228 0 : { nActionMax = nTempActionMax; } // only to use in the XML import
1229 :
1230 0 : void SetProtection( const com::sun::star::uno::Sequence< sal_Int8 >& rPass )
1231 0 : { aProtectPass = rPass; }
1232 0 : com::sun::star::uno::Sequence< sal_Int8 > GetProtection() const
1233 0 : { return aProtectPass; }
1234 0 : bool IsProtected() const { return aProtectPass.getLength() != 0; }
1235 :
1236 : // If time stamps of actions of this
1237 : // ChangeTrack and a second one are to be
1238 : // compared including nanoseconds.
1239 0 : void SetTimeNanoSeconds( bool bVal ) { bTimeNanoSeconds = bVal; }
1240 0 : bool IsTimeNanoSeconds() const { return bTimeNanoSeconds; }
1241 :
1242 : void AppendCloned( ScChangeAction* pAppend );
1243 : SC_DLLPUBLIC ScChangeTrack* Clone( ScDocument* pDocument ) const;
1244 : void MergeActionState( ScChangeAction* pAct, const ScChangeAction* pOtherAct );
1245 : };
1246 :
1247 :
1248 : #endif
1249 :
1250 :
1251 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|