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