xref: /trunk/main/sw/source/core/inc/rolbck.hxx (revision 56b35d86)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _ROLBCK_HXX
24 #define _ROLBCK_HXX
25 
26 #include <tools/solar.h>
27 #ifndef _SVSTDARR_HXX
28 #define _SVSTDARR_USHORTS
29 #define _SVSTDARR_USHORTSSORT
30 #include <svl/svstdarr.hxx>
31 #endif
32 #include <svl/itemset.hxx>
33 
34 //Nur die History anziehen, um das docnew.cxx gegen die CLOOK's zu behaupten.
35 
36 namespace sfx2 {
37     class MetadatableUndo;
38 }
39 
40 class SwDoc;
41 class SwFmt;
42 class SwFmtColl;
43 class SwHistoryHint;
44 class SwTxtAttr;
45 class SfxPoolItem;
46 class SwTxtNode;
47 class SwUndoSaveSection;
48 class SwTxtFtn;
49 class SwTxtFlyCnt;
50 class SwUndoDelLayFmt;
51 class SwFlyFrmFmt;
52 class SwFmtFld;
53 class SwTxtFld;
54 class SwFieldType;
55 class SwTxtTOXMark;
56 class SwTxtRefMark;
57 class SwFrmFmt;
58 class SwpHints;
59 class SwFmtChain;
60 class SwNode;
61 class SwCharFmt;
62 
63 #ifndef ROLBCK_HISTORY_ONLY
64 
65 #include <tox.hxx>
66 
67 #include <SwNumberTreeTypes.hxx>
68 // --> OD 2007-10-17 #i81002#
69 #include <IDocumentMarkAccess.hxx>
70 // <--
71 
72 #include <memory>
73 
74 
75 enum HISTORY_HINT {
76     HSTRY_SETFMTHNT,
77     HSTRY_RESETFMTHNT,
78     HSTRY_SETTXTHNT,
79     HSTRY_SETTXTFLDHNT,
80     HSTRY_SETREFMARKHNT,
81     HSTRY_SETTOXMARKHNT,
82     HSTRY_RESETTXTHNT,
83     HSTRY_SETFTNHNT,
84     HSTRY_CHGFMTCOLL,
85     HSTRY_FLYCNT,
86     HSTRY_BOOKMARK,
87     HSTRY_SETATTRSET,
88     HSTRY_RESETATTRSET,
89     HSTRY_CHGFLYANCHOR,
90     HSTRY_CHGFLYCHAIN,
91     HSTRY_CHGCHARFMT, // #i27615#
92     HSTRY_END
93 };
94 
95 class SwHistoryHint
96 {
97     const HISTORY_HINT m_eWhichId;
98 
99 public:
SwHistoryHint(HISTORY_HINT eWhich)100     SwHistoryHint( HISTORY_HINT eWhich ) : m_eWhichId( eWhich ) {}
~SwHistoryHint()101     virtual ~SwHistoryHint() {}
102     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) = 0;
Which() const103     HISTORY_HINT Which() const                     { return m_eWhichId; }
104     virtual String GetDescription() const;
105 };
106 
107 class SwHistorySetFmt : public SwHistoryHint
108 {
109     ::std::auto_ptr<SfxPoolItem> m_pAttr;
110     const sal_uLong m_nNodeIndex;
111 
112 public:
113     SwHistorySetFmt( const SfxPoolItem* pFmtHt, sal_uLong nNode );
114     virtual ~SwHistorySetFmt();
115     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
116     virtual String GetDescription() const;
117 
118 };
119 
120 class SwHistoryResetFmt : public SwHistoryHint
121 {
122     const sal_uLong m_nNodeIndex;
123     const sal_uInt16 m_nWhich;
124 
125 public:
126     // --> OD 2008-02-27 #refactorlists# - removed <rDoc>
127     SwHistoryResetFmt( const SfxPoolItem* pFmtHt, sal_uLong nNodeIdx );
128     // <--
129     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
130 
131 };
132 
133 class SwHistorySetTxt : public SwHistoryHint
134 {
135     ::std::auto_ptr<SfxPoolItem> m_pAttr;
136     const sal_uLong m_nNodeIndex;
137     const xub_StrLen m_nStart;
138     const xub_StrLen m_nEnd;
139 
140 public:
141     SwHistorySetTxt( SwTxtAttr* pTxtHt, sal_uLong nNode );
142     virtual ~SwHistorySetTxt();
143     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
144 
145 };
146 
147 class SwHistorySetTxtFld : public SwHistoryHint
148 {
149     //!! beware of the order for the declation of the auto_ptrs.
150     //!! If they get destroyed in the wrong order sw may crash (namely mail-merge as well)
151     ::std::auto_ptr<SwFieldType> m_pFldType;
152     const ::std::auto_ptr<SwFmtFld> m_pFld;
153 
154     sal_uLong m_nNodeIndex;
155     xub_StrLen m_nPos;
156     sal_uInt16 m_nFldWhich;
157 
158 public:
159     SwHistorySetTxtFld( SwTxtFld* pTxtFld, sal_uLong nNode );
160     virtual ~SwHistorySetTxtFld();
161     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
162 
163     virtual String GetDescription() const;
164 
165 };
166 
167 class SwHistorySetRefMark : public SwHistoryHint
168 {
169     const String m_RefName;
170     const sal_uLong m_nNodeIndex;
171     const xub_StrLen m_nStart;
172     const xub_StrLen m_nEnd;
173 
174 public:
175     SwHistorySetRefMark( SwTxtRefMark* pTxtHt, sal_uLong nNode );
176     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
177 
178 };
179 
180 class SwHistorySetTOXMark : public SwHistoryHint
181 {
182     SwTOXMark m_TOXMark;
183     const String m_TOXName;
184     const TOXTypes m_eTOXTypes;
185     const sal_uLong m_nNodeIndex;
186     const xub_StrLen m_nStart;
187     const xub_StrLen m_nEnd;
188 
189 public:
190     SwHistorySetTOXMark( SwTxtTOXMark* pTxtHt, sal_uLong nNode );
191     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
192     int IsEqual( const SwTOXMark& rCmp ) const;
193 
194 };
195 
196 class SwHistoryResetTxt : public SwHistoryHint
197 {
198     const sal_uLong m_nNodeIndex;
199     const xub_StrLen m_nStart;
200     const xub_StrLen m_nEnd;
201     const sal_uInt16 m_nAttr;
202 
203 public:
204     SwHistoryResetTxt( sal_uInt16 nWhich, xub_StrLen nStt, xub_StrLen nEnd,
205                        sal_uLong nNode );
206     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
207 
GetWhich() const208     sal_uInt16 GetWhich() const         { return m_nAttr; }
GetNode() const209     sal_uLong GetNode() const           { return m_nNodeIndex; }
GetCntnt() const210     xub_StrLen GetCntnt() const     { return m_nStart; }
211 
212 };
213 
214 class SwHistorySetFootnote : public SwHistoryHint
215 {
216     const ::std::auto_ptr<SwUndoSaveSection> m_pUndo;
217     const String m_FootnoteNumber;
218     sal_uLong m_nNodeIndex;
219     const xub_StrLen m_nStart;
220     const bool m_bEndNote;
221 
222 public:
223     SwHistorySetFootnote( SwTxtFtn* pTxtFtn, sal_uLong nNode );
224     SwHistorySetFootnote( const SwTxtFtn& );
225     virtual ~SwHistorySetFootnote();
226     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
227 
228     virtual String GetDescription() const;
229 
230 };
231 
232 class SwHistoryChangeFmtColl : public SwHistoryHint
233 {
234     SwFmtColl * const m_pColl;
235     const sal_uLong m_nNodeIndex;
236     const sal_uInt8 m_nNodeType;
237 
238 public:
239     SwHistoryChangeFmtColl( SwFmtColl* pColl, sal_uLong nNode, sal_uInt8 nNodeWhich );
240     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
241 
242 };
243 
244 class SwHistoryTxtFlyCnt : public SwHistoryHint
245 {
246     ::std::auto_ptr<SwUndoDelLayFmt> m_pUndo;
247 
248 public:
249     SwHistoryTxtFlyCnt( SwFrmFmt* const pFlyFmt );
250     virtual ~SwHistoryTxtFlyCnt();
251     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
GetUDelLFmt()252     SwUndoDelLayFmt* GetUDelLFmt() { return m_pUndo.get(); }
253 
254 };
255 
256 class SwHistoryBookmark : public SwHistoryHint
257 {
258     public:
259         SwHistoryBookmark(const ::sw::mark::IMark& rBkmk,
260                         bool bSavePos, bool bSaveOtherPos);
261         virtual void SetInDoc(SwDoc * pDoc, bool);
262 
263         bool IsEqualBookmark(const ::sw::mark::IMark& rBkmk);
264         const ::rtl::OUString& GetName() const;
265 
266 
267     private:
268         const ::rtl::OUString m_aName;
269         ::rtl::OUString m_aShortName;
270         KeyCode m_aKeycode;
271         const sal_uLong m_nNode;
272         const sal_uLong m_nOtherNode;
273         const xub_StrLen m_nCntnt;
274         const xub_StrLen m_nOtherCntnt;
275         const bool m_bSavePos;
276         const bool m_bSaveOtherPos;
277         const bool m_bHadOtherPos;
278         const IDocumentMarkAccess::MarkType m_eBkmkType;
279         ::boost::shared_ptr< ::sfx2::MetadatableUndo > m_pMetadataUndo;
280 };
281 
282 class SwHistorySetAttrSet : public SwHistoryHint
283 {
284     SfxItemSet m_OldSet;
285     SvUShorts m_ResetArray;
286     const sal_uLong m_nNodeIndex;
287 
288 public:
289     SwHistorySetAttrSet( const SfxItemSet& rSet, sal_uLong nNode,
290                          const SvUShortsSort& rSetArr );
291     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
292 
293 };
294 
295 
296 class SwHistoryResetAttrSet : public SwHistoryHint
297 {
298     const sal_uLong m_nNodeIndex;
299     const xub_StrLen m_nStart;
300     const xub_StrLen m_nEnd;
301     SvUShorts m_Array;
302 
303 public:
304     SwHistoryResetAttrSet( const SfxItemSet& rSet, sal_uLong nNode,
305                         xub_StrLen nStt = STRING_MAXLEN,
306                         xub_StrLen nEnd = STRING_MAXLEN );
307     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
308 
GetArr() const309     const SvUShorts& GetArr() const     { return m_Array; }
GetNode() const310     sal_uLong GetNode() const               { return m_nNodeIndex; }
GetCntnt() const311     xub_StrLen GetCntnt() const         { return m_nStart; }
312 
313 };
314 
315 class SwHistoryChangeFlyAnchor : public SwHistoryHint
316 {
317     SwFrmFmt & m_rFmt;
318     const sal_uLong m_nOldNodeIndex;
319     const xub_StrLen m_nOldContentIndex;
320 
321 public:
322     SwHistoryChangeFlyAnchor( SwFrmFmt& rFmt );
323     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
324 };
325 
326 class SwHistoryChangeFlyChain : public SwHistoryHint
327 {
328     SwFlyFrmFmt * const m_pPrevFmt;
329     SwFlyFrmFmt * const m_pNextFmt;
330     SwFlyFrmFmt * const m_pFlyFmt;
331 
332 public:
333     SwHistoryChangeFlyChain( SwFlyFrmFmt& rFmt, const SwFmtChain& rAttr );
334     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
335 };
336 
337 // #i27615#
338 class SwHistoryChangeCharFmt : public SwHistoryHint
339 {
340     const SfxItemSet m_OldSet;
341     const String m_Fmt;
342 
343 public:
344     SwHistoryChangeCharFmt( const SfxItemSet& rSet, const String & sFmt);
345     virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet );
346 
347 };
348 
349 
350 #endif
351 
352 typedef SwHistoryHint* SwHistoryHintPtr;
353 SV_DECL_PTRARR_DEL( SwpHstry, SwHistoryHintPtr, 0, 2 )
354 
355 class SwHistory
356 {
357     friend class SwDoc;         // actually only SwDoc::DelUndoObj may access
358     friend class SwUndoWriter;  // for Undo/Redo Writer
359     friend class SwRegHistory;  // for inserting History attributes
360 
361     SwpHstry m_SwpHstry;
362     sal_uInt16 m_nEndDiff;
363 
364 public:
365     SwHistory( sal_uInt16 nInitSz = 0, sal_uInt16 nGrowSz = 2 );
366     ~SwHistory();
367 
368     // delete History from nStart to array end
369     void Delete( sal_uInt16 nStart = 0 );
370     // call and delete all objects between nStart and array end
371     bool Rollback( SwDoc* pDoc, sal_uInt16 nStart = 0 );
372     // call all objects between nStart and TmpEnd; store nStart as TmpEnd
373     bool TmpRollback( SwDoc* pDoc, sal_uInt16 nStart, bool ToFirst = true );
374 
375     // --> OD 2008-02-27 #refactorlists# - removed <rDoc>
376     void Add(
377         const SfxPoolItem* pOldValue,
378         const SfxPoolItem* pNewValue,
379         sal_uLong nNodeIdx);
380 
381     void Add( SwTxtAttr* pTxtHt, sal_uLong nNodeIdx, bool bNewAttr = true );
382     void Add( SwFmtColl*, sal_uLong nNodeIdx, sal_uInt8 nWhichNd );
383     void Add( const ::sw::mark::IMark&, bool bSavePos, bool bSaveOtherPos );
384     void Add( SwFrmFmt& rFmt );
385     void Add( SwFlyFrmFmt&, sal_uInt16& rSetPos );
386     void Add( const SwTxtFtn& );
387     void Add( const SfxItemSet & rSet, const SwCharFmt & rCharFmt); // #i27615#
388 
Count() const389     sal_uInt16 Count() const { return m_SwpHstry.Count(); }
GetTmpEnd() const390     sal_uInt16 GetTmpEnd() const { return m_SwpHstry.Count() - m_nEndDiff; }
391     sal_uInt16 SetTmpEnd( sal_uInt16 nTmpEnd );        // return previous value
operator [](sal_uInt16 nPos)392     SwHistoryHint      * operator[]( sal_uInt16 nPos ) { return m_SwpHstry[nPos]; }
operator [](sal_uInt16 nPos) const393     SwHistoryHint const* operator[]( sal_uInt16 nPos ) const
394         { return m_SwpHstry[nPos]; }
395 
396     // for SwUndoDelete::Undo/Redo
Move(sal_uInt16 nPos,SwHistory * pIns,sal_uInt16 nStart=0,sal_uInt16 nEnd=USHRT_MAX)397     void Move( sal_uInt16 nPos, SwHistory *pIns,
398                sal_uInt16 nStart = 0, sal_uInt16 nEnd = USHRT_MAX )
399     {
400         m_SwpHstry.Insert( &pIns->m_SwpHstry, nPos, nStart, nEnd );
401         pIns->m_SwpHstry.Remove( nStart, (nEnd == USHRT_MAX)
402                                             ? pIns->Count() - nStart
403                                             : nEnd );
404     }
405 
406     // helper methods for recording attribute in History
407     // used by Undo classes (Delete/Overwrite/Inserts)
408     void CopyAttr(
409         SwpHints* pHts,
410         const sal_uLong nNodeIdx,
411         const xub_StrLen nStart,
412         const xub_StrLen nEnd,
413         const bool bCopyFields );
414 
415     void CopyFmtAttr( const SfxItemSet& rSet, sal_uLong nNodeIdx );
416 };
417 
418 #ifndef ROLBCK_HISTORY_ONLY
419 
420 class SwRegHistory : public SwClient
421 {
422 private:
423     SvUShortsSort m_WhichIdSet;
424     SwHistory * const m_pHistory;
425     sal_uLong m_nNodeIndex;
426 
427     void _MakeSetWhichIds();
428 
429 protected:
430     virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew );
431 
432 public:
433     // --> OD 2008-02-27 #refactorlists# - removed <rDoc>
434     SwRegHistory( SwHistory* pHst );
435     // <--
436     SwRegHistory( const SwNode& rNd, SwHistory* pHst );
437     SwRegHistory( SwModify* pRegIn, const SwNode& rNd, SwHistory* pHst );
438 
439     /// @return true iff at least 1 item was inserted
440     bool InsertItems( const SfxItemSet& rSet,
441         xub_StrLen const nStart, xub_StrLen const nEnd,
442         SetAttrMode const nFlags );
443 
444     void AddHint( SwTxtAttr* pHt, const bool bNew = false );
445 
446     void RegisterInModify( SwModify* pRegIn, const SwNode& rNd );
ChangeNodeIndex(sal_uLong nNew)447     void ChangeNodeIndex( sal_uLong nNew ) { m_nNodeIndex = nNew; }
448 };
449 
450 #endif
451 
452 
453 #endif // _ROLBCK_HXX
454 
455