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