1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: undobj.hxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
33 #ifndef _SVMEMPOOL_HXX //autogen
34 #include <tools/mempool.hxx>
37 #define _SVSTDARR_USHORTS
38 #define _SVSTDARR_ULONGS
39 #define _SVSTDARR_BOOLS
40 #define _SVSTDARR_BYTES
41 #define _SVSTDARR_USHORTSSORT
42 #include <bf_svtools/svstdarr.hxx>
44 #ifndef _SFXITEMSET_HXX //autogen
45 #include <bf_svtools/itemset.hxx>
47 #ifndef _COM_SUN_STAR_UNO_SEQUENCE_H_
48 #include <com/sun/star/uno/Sequence.h>
51 #include <numrule.hxx>
54 #include <redlenum.hxx>
77 class SwHstryBookmark
;
92 struct SwUndoGroupObjImpl
;
100 class SwTableAutoFmt
;
102 class SwTableSortBoxes
;
103 class SwUndoSaveSections
;
107 class SwTblToTxtSaves
;
109 class SwRedlineSaveData
;
114 class TransliterationWrapper
;
120 #define OUT_UNDOBJ( name ) \
121 friend Writer& OutUndo_ ## name( Writer&, const SwUndo& );
123 #define OUT_UNDOBJ( name )
127 typedef SwRedlineSaveData
* SwRedlineSaveDataPtr
;
128 SV_DECL_PTRARR_DEL( SwRedlineSaveDatas
, SwRedlineSaveDataPtr
, 8, 8 )
133 USHORT nOrigRedlineMode
;
136 void SetId( USHORT nNew
) { nId
= nNew
; }
139 SwUndo( USHORT nI
) { nId
= nI
; nOrigRedlineMode
= REDLINE_NONE
; }
142 USHORT
GetId() const { return nId
; }
144 // das UndoObject merkt sich, welcher Mode eingeschaltet war.
145 // In Undo/Redo/Repeat wird dann immer auf diesen zurueck geschaltet
146 USHORT
GetRedlineMode() const { return nOrigRedlineMode
; }
147 void SetRedlineMode( USHORT eMode
) { nOrigRedlineMode
= eMode
; }
149 // sicher und setze die RedlineDaten
150 static BOOL
FillSaveData( const SwPaM
& rRange
, SwRedlineSaveDatas
& rSData
,
151 BOOL bDelRange
= TRUE
, BOOL bCopyNext
= TRUE
);
155 // diese Klasse muss in ein Undo-Object vererbt werden, wenn dieses Inhalt
156 // fuers Redo/Undo ... speichert
157 class SwUndoSaveCntnt
163 // wird fuer das loeschen von Inhalt benoetigt. Fuer das ReDo werden
164 // Inhalte in das UndoNodesArray verschoben. Diese Methoden fuegen
165 // am Ende eines TextNodes ein Trenner fuer die Attribute. Damit werden
166 // Attribute nicht expandiert.
167 // MoveTo.. verschiebt aus dem NodesArray in das UndoNodesArray
168 // MoveFrom.. verschiebt aus dem UndoNodesArray in das NodesArray
169 void MoveToUndoNds( SwPaM
& rPam
,
170 SwNodeIndex
* pNodeIdx
= 0, SwIndex
* pCntIdx
= 0,
171 ULONG
* pEndNdIdx
= 0, xub_StrLen
* pEndCntIdx
= 0 );
173 // diese beiden Methoden bewegen den SPoint vom Pam zurueck/vor. Damit
174 // kann fuer ein Undo/Redo ein Bereich aufgespannt werden. (Der
175 // SPoint liegt dann vor dem manipuliertem Bereich !!)
176 // Das Flag gibt an, ob noch vorm SPoint Inhalt steht.
178 // vor dem Move ins UndoNodes-Array muss dafuer gesorgt werden, das
179 // die Inhaltstragenden Attribute aus dem Nodes-Array entfernt werden.
180 enum DelCntntType
{ DELCNT_FTN
= 0x01,
185 DELCNT_CHKNOCNTNT
= 0x80 // nur den NodeIndex beachten
187 void DelCntntIndex( const SwPosition
& pMark
, const SwPosition
& pPoint
,
188 DelCntntType nDelCntntType
= DELCNT_ALL
);
193 OUT_UNDOBJ( SaveCntnt
)
197 // sicher eine vollstaendige Section im Nodes-Array
198 class SwUndoSaveSection
: private SwUndoSaveCntnt
201 SwRedlineSaveDatas
* pRedlSaveData
;
202 ULONG nMvLen
; // Index ins UndoNodes-Array
206 SwNodeIndex
* GetMvSttIdx() const { return pMvStt
; }
207 ULONG
GetMvNodeCnt() const { return nMvLen
; }
211 ~SwUndoSaveSection();
213 void SaveSection( SwDoc
* pDoc
, const SwNodeIndex
& rSttIdx
);
214 void SaveSection( SwDoc
* pDoc
, const SwNodeRange
& rRange
);
216 const SwHistory
* GetHistory() const { return pHistory
; }
217 SwHistory
* GetHistory() { return pHistory
; }
218 OUT_UNDOBJ( SaveSection
)
222 // Diese Klasse speichert den Pam als USHORT's und kann diese wieder zu
223 // einem PaM zusammensetzen
227 ULONG nSttNode
, nEndNode
;
228 xub_StrLen nSttCntnt
, nEndCntnt
;
230 SwUndRng( const SwPaM
& );
232 void SetValues( const SwPaM
& rPam
);
236 class SwUndoStart
: public SwUndo
238 // Um innerhalb von Undo zuerkennen, wann ein Start vorliegt, gibt
239 // GetId() immer die UNDO_START zurueck. Die UserId kann ueber
240 // GetUserId() erfragt werden.
242 // fuer die "Verpointerung" von Start- und End-Undos
245 SwUndoStart( USHORT nId
);
246 USHORT
GetUserId() const { return nUserId
; }
247 // Setzen vom End-Undo-Offset geschieht im Doc::EndUndo
248 USHORT
GetEndOffset() const { return nEndOffset
; }
249 void SetEndOffset( USHORT n
) { nEndOffset
= n
; }
253 class SwUndoEnd
: public SwUndo
255 // Um innerhalb von Undo zuerkennen, wann ein Ende vorliegt, gibt
256 // GetId() immer die UNDO_END zurueck. Die UserId kann ueber
257 // GetUserId() erfragt werden.
259 // fuer die "Verpointerung" von Start- und End-Undos
262 SwUndoEnd( USHORT nId
);
263 USHORT
GetUserId() const { return nUserId
; }
264 // Setzen vom Start-Undo-Offset geschieht im Doc::EndUndo
265 USHORT
GetSttOffset() const { return nSttOffset
; }
266 void SetSttOffset( USHORT n
) { nSttOffset
= n
; }
270 class SwUndoInsert
: public SwUndo
, private SwUndoSaveCntnt
272 SwPosition
*pPos
; // Inhalt fuers Redo
274 SwRedlineData
* pRedlData
;
276 xub_StrLen nCntnt
, nLen
;
277 BOOL bIsWordDelim
: 1;
280 friend class SwDoc
; // eigentlich nur SwDoc::Insert( String )
281 BOOL
CanGrouping( sal_Unicode cIns
);
282 BOOL
CanGrouping( const SwPosition
& rPos
);
285 SwUndoInsert( const SwNodeIndex
& rNode
, xub_StrLen nCntnt
, xub_StrLen nLen
,
286 BOOL bWDelim
= TRUE
);
287 SwUndoInsert( const SwNodeIndex
& rNode
);
288 virtual ~SwUndoInsert();
290 BOOL
CanGrouping( const SwPosition
&, sal_Unicode cIns
);
293 DECL_FIXEDMEMPOOL_NEWDEL(SwUndoInsert
)
297 class SwUndoDelete
: public SwUndo
, private SwUndRng
, private SwUndoSaveCntnt
299 SwNodeIndex
* pMvStt
; // Position der Nodes im UndoNodes-Array
300 String
*pSttStr
, *pEndStr
;
301 SwRedlineData
* pRedlData
;
302 SwRedlineSaveDatas
* pRedlSaveData
;
305 ULONG nNdDiff
; // Differenz von Nodes vor-nach Delete
306 ULONG nSectDiff
; // Diff. von Nodes vor/nach Move mit SectionNodes
309 BOOL bGroup
: 1; // TRUE: ist schon eine Gruppe; wird in CanGrouping() ausgwertet !!
310 BOOL bBackSp
: 1; // TRUE: wenn Gruppierung und der Inhalt davor geloescht wird
311 BOOL bJoinNext
: 1; // TRUE: wenn der Bereich von Oben nach unten geht
312 BOOL bSectNdFnd
: 1; // TRUE: Sonderbehandlung fuer SectionNodes
313 BOOL bMvAroundSectNd
:1;// TRUE: Sonderbehandlung fuer SectionNodes
314 BOOL bTblDelLastNd
: 1; // TRUE: TextNode hinter der Tabelle einf./loeschen
315 BOOL bDelFullPara
: 1; // TRUE: gesamte Nodes wurden geloescht
316 BOOL bResetPgDesc
: 1; // TRUE: am nachfolgenden Node das PgDsc zuruecksetzen
317 BOOL bResetPgBrk
: 1; // TRUE: am nachfolgenden Node das PgBreak zuruecksetzen
319 BOOL
SaveCntnt( const SwPosition
* pStt
, const SwPosition
* pEnd
,
320 SwTxtNode
* pSttTxtNd
, SwTxtNode
* pEndTxtNd
);
322 SwUndoDelete( SwPaM
&, BOOL bFullPara
= FALSE
);
323 virtual ~SwUndoDelete();
324 BOOL
CanGrouping( SwDoc
*, const SwPaM
& );
326 void SetTblDelLastNd() { bTblDelLastNd
= TRUE
; }
328 // fuer die PageDesc/PageBreak Attribute einer Tabelle
329 void SetPgBrkFlags( BOOL bPageBreak
, BOOL bPageDesc
)
330 { bResetPgDesc
= bPageDesc
; bResetPgBrk
= bPageBreak
; }
334 DECL_FIXEDMEMPOOL_NEWDEL(SwUndoDelete
)
340 class SwUndoSplitNode
: public SwUndo
343 SwRedlineData
* pRedlData
;
349 SwUndoSplitNode( SwDoc
* pDoc
, const SwPosition
& rPos
, BOOL bChkTbl
);
350 virtual ~SwUndoSplitNode();
351 void SetTblFlag() { bTblFlag
= TRUE
; }
352 OUT_UNDOBJ( SplitNode
)
358 class SwUndoAttr
: public SwUndo
, private SwUndRng
360 SfxItemSet aSet
; // Attribute fuers Redo
361 SwHistory
* pHistory
; // History fuers Undo
362 SwRedlineData
* pRedlData
; // Redlining
363 SwRedlineSaveDatas
* pRedlSaveData
;
364 ULONG nNdIdx
; // fuers Redlining - Offset
365 USHORT nInsFlags
; // Einfuege Flags
368 SwUndoAttr( const SwPaM
&, const SfxItemSet
&, USHORT nFlags
= 0 );
369 SwUndoAttr( const SwPaM
&, const SfxPoolItem
&, USHORT nFlags
= 0 );
370 virtual ~SwUndoAttr();
371 SwHistory
* GetHistory() { return pHistory
; }
373 OUT_UNDOBJ( InsAttr
)
378 class SwUndoFmtAttr
: public SwUndo
380 friend class SwUndoDefaultAttr
;
382 SfxItemSet
* pOldSet
; // die alten Attribute
387 void SaveFlyAnchor( BOOL bSaveDrawPt
= FALSE
);
391 // meldet sich im Format an und sichert sich die alten Attribute
392 SwUndoFmtAttr( const SfxItemSet
& rOldSet
, SwFmt
& rFmt
,
393 BOOL bSaveDrawPt
= TRUE
);
394 virtual ~SwUndoFmtAttr();
395 OUT_UNDOBJ( InsFmtAttr
)
400 // Hilfs-Klasse, um die geaenderten Sets zu "empfangen"
401 struct _UndoFmtAttr
: public SwClient
403 SwUndoFmtAttr
* pUndo
;
406 _UndoFmtAttr( SwFmt
& rFmt
, BOOL bSaveDrawPt
= TRUE
);
407 virtual void Modify( SfxPoolItem
*, SfxPoolItem
* );
411 class SwUndoFmtColl
: public SwUndo
, private SwUndRng
416 SwUndoFmtColl( const SwPaM
&, SwFmtColl
* );
417 virtual ~SwUndoFmtColl();
418 SwHistory
* GetHistory() { return pHistory
; }
419 OUT_UNDOBJ( SetFmtColl
)
424 // Basis-Klasse fuer Insert von Dokument, Glossaries und Kopieren
426 class SwUndoInsDoc
//STRIP001 : public SwUndoInserts
429 SwUndoInsDoc( const SwPaM
& ){DBG_BF_ASSERT(0, "STRIP");} //STRIP001 SwUndoInsDoc( const SwPaM& );
433 class SwUndoInsTbl
: public SwUndo
436 SwDDEFieldType
* pDDEFldType
;
437 SvUShorts
* pColWidth
;
438 SwRedlineData
* pRedlData
;
439 SwTableAutoFmt
* pAutoFmt
;
446 SwUndoInsTbl( const SwPosition
&, USHORT nCols
, USHORT nRows
,
447 USHORT eAdjust
, USHORT nInsert
,
448 const SwTableAutoFmt
* pTAFmt
, const SvUShorts
* pColArr
);
449 virtual ~SwUndoInsTbl();
450 OUT_UNDOBJ( InsTable
)
453 class SwUndoTblNdsChg
: public SwUndo
455 _SaveTable
* pSaveTbl
;
459 SvULongs
* pNewSttNds
;
460 SwUndoSaveSections
* pDelSects
;
462 SvBools aMvBoxes
; // fuers SplitRow (aufgeteilte Nodes einer Box)
464 ULONG nSttNode
, nCurrBox
;
465 USHORT nCount
, nRelDiff
, nAbsDiff
, nSetColType
;
467 BOOL bSameHeight
; // only used for SplitRow
469 SwUndoTblNdsChg( USHORT UndoId
, const SwSelBoxes
& rBoxes
,
470 const SwTableNode
& rTblNd
);
471 virtual ~SwUndoTblNdsChg();
472 //STRIP001 virtual void Undo( SwUndoIter& );
473 //STRIP001 virtual void Redo( SwUndoIter& );
475 void SaveSection( SwStartNode
* pSttNd
);
477 void SetColWidthParam( ULONG nBoxIdx
, USHORT nMode
, USHORT nType
,
478 SwTwips nAbsDif
, SwTwips nRelDif
)
483 nAbsDiff
= (USHORT
)nAbsDif
;
484 nRelDiff
= (USHORT
)nRelDif
;
486 OUT_UNDOBJ( TblNodesChg
)
489 class SwUndoTblMerge
: public SwUndo
, private SwUndRng
497 SwUndoTblMerge( const SwPaM
& rTblSel
);
498 virtual ~SwUndoTblMerge();
499 void SetSelBoxes( const SwSelBoxes
& rBoxes
);
500 void AddNewBox( ULONG nSttNdIdx
)
501 { aNewSttNds
.Insert( nSttNdIdx
, aNewSttNds
.Count() ); }
506 class _UndoTblCpyTbl_Entries
;
509 class SwUndoCpyTbl
: public SwUndo
515 virtual ~SwUndoCpyTbl();
516 virtual void Undo( SwUndoIter
& );
517 virtual void Redo( SwUndoIter
& );
519 void SetTableSttIdx( ULONG nIdx
) { nTblNode
= nIdx
; }
526 class SwUndoBookmark
: public SwUndo
528 SwHstryBookmark
* pHBookmark
;
530 SwUndoBookmark( USHORT nUndoId
, const SwBookmark
& );
534 virtual ~SwUndoBookmark();
539 class SwUndoInsBookmark
: public SwUndoBookmark
542 SwUndoInsBookmark( const SwBookmark
& );
543 OUT_UNDOBJ( InsBookmark
)
547 /*--------------------------------------------------------------------
548 Beschreibung: Undo auf Sorting
549 --------------------------------------------------------------------*/
556 //--------------------------------------------------------------------
558 class SwUndoFlyBase
: public SwUndo
, private SwUndoSaveSection
561 SwFrmFmt
* pFrmFmt
; // das gespeicherte FlyFormat
563 xub_StrLen nCntPos
; // Seite/am Absatz/im Absatz
565 BOOL bDelFmt
; // loesche das gespeicherte Format
568 SwUndoFlyBase( SwFrmFmt
* pFormat
, USHORT nUndoId
);
570 SwNodeIndex
* GetMvSttIdx() const { return SwUndoSaveSection::GetMvSttIdx(); }
571 ULONG
GetMvNodeCnt() const { return SwUndoSaveSection::GetMvNodeCnt(); }
574 virtual ~SwUndoFlyBase();
576 OUT_UNDOBJ( FlyBase
)
579 class SwUndoInsLayFmt
: public SwUndoFlyBase
582 SwUndoInsLayFmt( SwFrmFmt
* pFormat
);
584 OUT_UNDOBJ( InsLayFmt
)
587 class SwUndoDelLayFmt
: public SwUndoFlyBase
590 SwUndoDelLayFmt( SwFrmFmt
* pFormat
);
594 class SwUndoSetFlyFmt
: public SwUndo
, public SwClient
596 SwFrmFmt
* pFrmFmt
; // das gespeicherte FlyFormat
597 SwFrmFmt
* pOldFmt
; // die alte Fly Vorlage
598 SwFrmFmt
* pNewFmt
; // die neue Fly Vorlage
599 SfxItemSet
* pItemSet
; // die zurueck-/ gesetzten Attribute
600 ULONG nOldNode
, nNewNode
;
601 xub_StrLen nOldCntnt
, nNewCntnt
;
602 USHORT nOldAnchorTyp
, nNewAnchorTyp
;
607 SwUndoSetFlyFmt( SwFrmFmt
& rFlyFmt
, SwFrmFmt
& rNewFrmFmt
);
608 virtual ~SwUndoSetFlyFmt();
612 //--------------------------------------------------------------------
614 class _UnReplaceData
;
615 SV_DECL_PTRARR_DEL( _UnReplaceDatas
, _UnReplaceData
*, 10, 25 )//STRIP008 ;
619 //--------------------------------------------------------------------
624 //------------ Undo von Insert-/Delete-Sections ----------------------
626 class SwUndoInsSection
: public SwUndo
, private SwUndRng
630 SwRedlineData
* pRedlData
;
633 BOOL bSplitAtStt
: 1;
634 BOOL bSplitAtEnd
: 1;
639 SwUndoInsSection( const SwPaM
&, const SwSection
&,
640 const SfxItemSet
* pSet
);
641 virtual ~SwUndoInsSection();
642 OUT_UNDOBJ( SwUndoInsSection
)
644 void SetSectNdPos( ULONG nPos
) { nSectNodePos
= nPos
; }
645 void SaveSplitNode( SwTxtNode
* pTxtNd
, BOOL bAtStt
);
646 void SetUpdtFtnFlag( BOOL bFlag
) { bUpdateFtn
= bFlag
; }
650 class SwUndoChgSection
: public SwUndo
657 SwUndoChgSection( const SwSectionFmt
&, BOOL bOnlyAttrChgd
);
658 virtual ~SwUndoChgSection();
661 class SwUndoChgSectPsswd
: public SwUndo
663 ::com::sun::star::uno::Sequence
<sal_Int8
> aPasswd
;
667 const ::com::sun::star::uno::Sequence
<sal_Int8
> & rOld
,
668 const SwSectionNode
* pSectNd
= 0 );
669 virtual void Undo( SwUndoIter
& );
670 virtual void Redo( SwUndoIter
& );
671 OUT_UNDOBJ( SwUndoChgSectPsswd
)
674 //------------ Undo von verschieben/stufen von Gliederung ----------------
677 //--------------------------------------------------------------------
679 class SwUndoDefaultAttr
: public SwUndo
681 SfxItemSet
* pOldSet
; // die alten Attribute
682 SvxTabStopItem
* pTabStop
;
684 // meldet sich im Format an und sichert sich die alten Attribute
685 SwUndoDefaultAttr( const SfxItemSet
& rOldSet
);
686 virtual ~SwUndoDefaultAttr();
687 OUT_UNDOBJ( DefaultAttr
)
690 //--------------------------------------------------------------------
691 // ---------- Undo fuer Numerierung ----------------------------------
693 class SwUndoInsNum
: public SwUndo
, private SwUndRng
698 SwNumRule
* pOldNumRule
;
702 SwUndoInsNum( const SwPaM
& rPam
, const SwNumRule
& rRule
);
703 virtual ~SwUndoInsNum();
705 void SetSttNum( ULONG nNdIdx
) { nSttSet
= nNdIdx
; }
713 class SwUndoNumUpDown
: public SwUndo
, private SwUndRng
717 SwUndoNumUpDown( const SwPaM
& rPam
, short nOffset
);
718 OUT_UNDOBJ( NumUpDown
)
722 class SwUndoNumRuleStart
: public SwUndo
725 USHORT nOldStt
, nNewStt
;
726 BOOL bSetSttValue
: 1;
729 SwUndoNumRuleStart( const SwPosition
& rPos
, USHORT nStt
);
730 OUT_UNDOBJ( NumRuleStart
)
733 //--------------------------------------------------------------------
734 // ---------- Undo fuer DrawObjecte ----------------------------------
740 //--------------------------------------------------------------------
743 //--------------------------------------------------------------------
746 //--------------------------------------------------------------------
748 class SwUndoChgFtn
: public SwUndo
, private SwUndRng
755 SwUndoChgFtn( const SwPaM
& rRange
, const String
& rTxt
,
756 USHORT nNum
, BOOL bIsEndNote
);
757 virtual ~SwUndoChgFtn();
760 SwHistory
* GetHistory() { return pHistory
; }
766 //--------------------------------------------------------------------
769 //--------------------------------------------------------------------
776 //--------------------------------------------------------------------
780 //--------------------------------------------------------------------
782 // Object der als Iterator durch die Undo-Liste laeuft, bis die
783 // letze oder die angegebene Klammerung/Id erreicht ist.