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 #pragma once
21 
22 #include "undobase.hxx"
23 #include <tools/color.hxx>
24 #include <tabbgcolor.hxx>
25 
26 #include <memory>
27 #include <vector>
28 
29 class ScDocShell;
30 class SdrUndoAction;
31 class ScPrintRangeSaver;
32 class SdrObject;
33 class ScDocProtection;
34 class ScTableProtection;
35 class ScMarkData;
36 
37 class ScUndoInsertTab : public ScSimpleUndo
38 {
39 public:
40                     ScUndoInsertTab(
41                             ScDocShell* pNewDocShell,
42                             SCTAB nTabNum,
43                             bool bApp,
44                             const OUString& rNewName);
45     virtual         ~ScUndoInsertTab() override;
46 
47     virtual void    Undo() override;
48     virtual void    Redo() override;
49     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
50     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
51 
52     virtual OUString GetComment() const override;
53 
54 private:
55     OUString        sNewName;
56     std::unique_ptr<SdrUndoAction> pDrawUndo;
57     sal_uLong       nEndChangeAction;
58     SCTAB           nTab;
59     bool            bAppend;
60 
61     void            SetChangeTrack();
62 };
63 
64 class ScUndoInsertTables : public ScSimpleUndo
65 {
66 public:
67                     ScUndoInsertTables(
68                             ScDocShell* pNewDocShell,
69                             SCTAB nTabNum,
70                             const std::vector<OUString>& newNameList);
71     virtual         ~ScUndoInsertTables() override;
72 
73     virtual void    Undo() override;
74     virtual void    Redo() override;
75     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
76     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
77 
78     virtual OUString GetComment() const override;
79 
80 private:
81 
82     std::unique_ptr<SdrUndoAction> pDrawUndo;
83     std::vector<OUString>      aNameList;
84     sal_uLong           nStartChangeAction;
85     sal_uLong           nEndChangeAction;
86     SCTAB           nTab;
87 
88     void            SetChangeTrack();
89 };
90 
91 class ScUndoDeleteTab: public ScMoveUndo
92 {
93 public:
94                     ScUndoDeleteTab(
95                             ScDocShell* pNewDocShell,
96                             const std::vector<SCTAB> &theTabs,      //SCTAB nNewTab,
97                             ScDocumentUniquePtr pUndoDocument,
98                             std::unique_ptr<ScRefUndoData> pRefData );
99     virtual         ~ScUndoDeleteTab() override;
100 
101     virtual void    Undo() override;
102     virtual void    Redo() override;
103     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
104     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
105 
106     virtual OUString GetComment() const override;
107 
108 private:
109     std::vector<SCTAB> theTabs;
110     sal_uLong           nStartChangeAction;
111     sal_uLong           nEndChangeAction;
112 
113     void            SetChangeTrack();
114 };
115 
116 class ScUndoRenameTab: public ScSimpleUndo
117 {
118 public:
119                     ScUndoRenameTab(
120                             ScDocShell* pNewDocShell,
121                             SCTAB nT,
122                             const OUString& rOldName,
123                             const OUString& rNewName);
124     virtual         ~ScUndoRenameTab() override;
125 
126     virtual void    Undo() override;
127     virtual void    Redo() override;
128     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
129     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
130 
131     virtual OUString GetComment() const override;
132 
133 private:
134     SCTAB     nTab;
135     OUString  sOldName;
136     OUString  sNewName;
137 
138     void DoChange( SCTAB nTab, const OUString& rName ) const;
139 };
140 
141 class ScUndoMoveTab: public ScSimpleUndo
142 {
143 public:
144                     ScUndoMoveTab(
145                         ScDocShell* pNewDocShell,
146                         std::unique_ptr<std::vector<SCTAB>> pOldTabs,
147                         std::unique_ptr<std::vector<SCTAB>> pNewTabs,
148                         std::unique_ptr<std::vector< OUString>> pOldNames = nullptr,
149                         std::unique_ptr<std::vector< OUString>> pNewNames = nullptr );
150 
151     virtual         ~ScUndoMoveTab() override;
152 
153     virtual void    Undo() override;
154     virtual void    Redo() override;
155     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
156     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
157 
158     virtual OUString GetComment() const override;
159 
160 private:
161     std::unique_ptr< ::std::vector<SCTAB> > mpOldTabs;
162     std::unique_ptr< ::std::vector<SCTAB> > mpNewTabs;
163     std::unique_ptr< ::std::vector< OUString> > mpOldNames;
164     std::unique_ptr< ::std::vector< OUString> > mpNewNames;
165 
166     void DoChange( bool bUndo ) const;
167 };
168 
169 class ScUndoCopyTab: public ScSimpleUndo
170 {
171 public:
172                     ScUndoCopyTab(
173                         ScDocShell* pNewDocShell,
174                         std::unique_ptr<std::vector<SCTAB>> pOldTabs,
175                         std::unique_ptr<std::vector<SCTAB>> pNewTabs,
176                         std::unique_ptr<std::vector< OUString>> pNewNames = nullptr );
177 
178     virtual         ~ScUndoCopyTab() override;
179 
180     virtual void    Undo() override;
181     virtual void    Redo() override;
182     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
183     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
184 
185     virtual OUString GetComment() const override;
186 
187 private:
188     std::unique_ptr< ::std::vector<SCTAB> > mpOldTabs;
189     std::unique_ptr< ::std::vector<SCTAB> > mpNewTabs;
190     std::unique_ptr< ::std::vector< OUString> > mpNewNames;
191     std::unique_ptr<SdrUndoAction> pDrawUndo;
192 
193     void DoChange() const;
194 };
195 
196 class ScUndoTabColor: public ScSimpleUndo
197 {
198 public:
199                     ScUndoTabColor(
200                             ScDocShell* pNewDocShell,
201                             SCTAB nT,
202                             const Color& aOTabBgColor,
203                             const Color& aNTabBgColor);
204                     ScUndoTabColor(
205                             ScDocShell* pNewDocShell,
206                             const ScUndoTabColorInfo::List& rUndoTabColorList);
207     virtual         ~ScUndoTabColor() override;
208 
209     virtual void    Undo() override;
210     virtual void    Redo() override;
211     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
212     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
213 
214     virtual OUString GetComment() const override;
215 
216 private:
217     ScUndoTabColorInfo::List aTabColorList;
218 
219     void DoChange(bool bUndoType) const;
220 };
221 
222 class ScUndoMakeScenario: public ScSimpleUndo
223 {
224 public:
225                     ScUndoMakeScenario(
226                             ScDocShell* pNewDocShell,
227                             SCTAB nSrc, SCTAB nDest,
228                             const OUString& rN, const OUString& rC,
229                             const Color& rCol, ScScenarioFlags nF,
230                             const ScMarkData& rMark );
231     virtual         ~ScUndoMakeScenario() override;
232 
233     virtual void    Undo() override;
234     virtual void    Redo() override;
235     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
236     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
237 
238     virtual OUString GetComment() const override;
239 
240 private:
241     std::unique_ptr<ScMarkData> mpMarkData;
242     SCTAB       nSrcTab;
243     SCTAB       nDestTab;
244     OUString    aName;
245     OUString    aComment;
246     Color       aColor;
247     ScScenarioFlags nFlags;
248     std::unique_ptr<SdrUndoAction> pDrawUndo;
249 };
250 
251 class ScUndoImportTab : public ScSimpleUndo
252 {
253 public:
254                     ScUndoImportTab(
255                             ScDocShell* pShell,
256                             SCTAB nNewTab, SCTAB nNewCount );
257     virtual         ~ScUndoImportTab() override;
258 
259     virtual void    Undo() override;
260     virtual void    Redo() override;
261     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
262     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
263 
264     virtual OUString GetComment() const override;
265 
266 private:
267     SCTAB       nTab;
268     SCTAB       nCount;
269     ScDocumentUniquePtr xRedoDoc;
270     std::unique_ptr<SdrUndoAction> pDrawUndo;
271 
272     void DoChange() const;
273 };
274 
275 class ScUndoRemoveLink : public ScSimpleUndo
276 {
277 public:
278                     ScUndoRemoveLink(               // Call before delete!
279                             ScDocShell* pShell,
280                             const OUString& rDoc );
281     virtual         ~ScUndoRemoveLink() override;
282 
283     virtual void    Undo() override;
284     virtual void    Redo() override;
285     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
286     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
287 
288     virtual OUString GetComment() const override;
289 
290 private:
291     OUString    aDocName;
292     OUString    aFltName;
293     OUString    aOptions;
294     sal_uLong   nRefreshDelay;
295     sal_uInt16  nCount;
296     std::unique_ptr<SCTAB[]>
297                 pTabs;
298     std::unique_ptr<ScLinkMode[]>
299                 pModes;
300     std::unique_ptr<OUString[]>
301                 pTabNames;
302 
303     void DoChange( bool bLink ) const;
304 };
305 
306 class ScUndoShowHideTab : public ScSimpleUndo
307 {
308 public:
309                     ScUndoShowHideTab(
310                             ScDocShell* pShell,
311                             const std::vector<SCTAB>& newUndoTabs,
312                             bool bNewShow );
313     virtual         ~ScUndoShowHideTab() override;
314 
315     virtual void    Undo() override;
316     virtual void    Redo() override;
317     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
318     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
319 
320     virtual OUString GetComment() const override;
321 
322 private:
323     std::vector<SCTAB>  undoTabs;
324     bool                bShow;
325 
326     void DoChange( bool bShow ) const;
327 };
328 
329 /** This class implements undo & redo of document protect & unprotect
330     operations. */
331 class ScUndoDocProtect : public ScSimpleUndo
332 {
333 public:
334                     ScUndoDocProtect(ScDocShell* pShell, ::std::unique_ptr<ScDocProtection> && pProtectSettings);
335     virtual         ~ScUndoDocProtect() override;
336 
337     virtual void    Undo() override;
338     virtual void    Redo() override;
339     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
340     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
341 
342     virtual OUString GetComment() const override;
343 
344 private:
345     ::std::unique_ptr<ScDocProtection> mpProtectSettings;
346 
347     void    DoProtect(bool bProtect);
348 };
349 
350 /** This class implements undo & redo of both protect and unprotect of
351     sheet. */
352 class ScUndoTabProtect : public ScSimpleUndo
353 {
354 public:
355                     ScUndoTabProtect(ScDocShell* pShell, SCTAB nTab,
356                                      std::unique_ptr<ScTableProtection> && pProtectSettings);
357     virtual         ~ScUndoTabProtect() override;
358 
359     virtual void    Undo() override;
360     virtual void    Redo() override;
361     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
362     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
363 
364     virtual OUString GetComment() const override;
365 
366 private:
367     SCTAB   mnTab;
368     ::std::unique_ptr<ScTableProtection> mpProtectSettings;
369 
370     void    DoProtect(bool bProtect);
371 };
372 
373 class ScUndoPrintRange : public ScSimpleUndo
374 {
375 public:
376                     ScUndoPrintRange( ScDocShell* pShell, SCTAB nNewTab,
377                                       std::unique_ptr<ScPrintRangeSaver> pOld,
378                                       std::unique_ptr<ScPrintRangeSaver> pNew );
379     virtual         ~ScUndoPrintRange() override;
380 
381     virtual void    Undo() override;
382     virtual void    Redo() override;
383     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
384     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
385 
386     virtual OUString GetComment() const override;
387 
388 private:
389     SCTAB               nTab;
390     std::unique_ptr<ScPrintRangeSaver> pOldRanges;
391     std::unique_ptr<ScPrintRangeSaver> pNewRanges;
392 
393     void DoChange( bool bUndo );
394 };
395 
396 class ScUndoScenarioFlags: public ScSimpleUndo
397 {
398 public:
399                     ScUndoScenarioFlags(
400                             ScDocShell* pNewDocShell, SCTAB nT,
401                             const OUString& rON, const OUString& rNN,
402                             const OUString& rOC, const OUString& rNC,
403                             const Color& rOCol, const Color& rNCol,
404                             ScScenarioFlags nOF, ScScenarioFlags nNF);
405 
406     virtual         ~ScUndoScenarioFlags() override;
407 
408     virtual void    Undo() override;
409     virtual void    Redo() override;
410     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
411     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
412 
413     virtual OUString GetComment() const override;
414 
415 private:
416     SCTAB       nTab;
417     OUString    aOldName;
418     OUString    aNewName;
419     OUString    aOldComment;
420     OUString    aNewComment;
421     Color       aOldColor;
422     Color       aNewColor;
423     ScScenarioFlags nOldFlags;
424     ScScenarioFlags nNewFlags;
425 };
426 
427 class ScUndoRenameObject: public ScSimpleUndo
428 {
429 public:
430                     ScUndoRenameObject(
431                             ScDocShell* pNewDocShell, const OUString& rPN,
432                             const OUString& rON, const OUString& rNN );
433 
434     virtual         ~ScUndoRenameObject() override;
435 
436     virtual void    Undo() override;
437     virtual void    Redo() override;
438     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
439     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
440 
441     virtual OUString GetComment() const override;
442 
443 private:
444     OUString  aPersistName;       // to find object (works only for OLE objects)
445     OUString  aOldName;
446     OUString  aNewName;
447 
448     SdrObject*  GetObject();
449 };
450 
451 class ScUndoLayoutRTL : public ScSimpleUndo
452 {
453 public:
454                     ScUndoLayoutRTL( ScDocShell* pShell, SCTAB nNewTab, bool bNewRTL );
455     virtual         ~ScUndoLayoutRTL() override;
456 
457     virtual void    Undo() override;
458     virtual void    Redo() override;
459     virtual void    Repeat(SfxRepeatTarget& rTarget) override;
460     virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const override;
461 
462     virtual OUString GetComment() const override;
463 
464 private:
465     SCTAB   nTab;
466     bool    bRTL;
467 
468     void DoChange( bool bNew );
469 };
470 
471 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
472