xref: /AOO41X/main/sc/source/ui/undo/undotab.cxx (revision 37e3d887af66515c2891f0d8511e7cf8ed2da81c)
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 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 #include <sfx2/app.hxx>
28 #include <sfx2/bindings.hxx>
29 #include <sfx2/dispatch.hxx>
30 #include <svl/smplhint.hxx>
31 
32 #include "undotab.hxx"
33 #include "document.hxx"
34 #include "docsh.hxx"
35 #include "tabvwsh.hxx"
36 #include "globstr.hrc"
37 #include "global.hxx"
38 #include "sc.hrc"
39 #include "undoolk.hxx"
40 #include "target.hxx"
41 #include "uiitems.hxx"
42 #include "prnsave.hxx"
43 #include "printfun.hxx"
44 #include "chgtrack.hxx"
45 #include "tabprotection.hxx"
46 #include "viewdata.hxx"
47 
48 // for ScUndoRenameObject - might me moved to another file later
49 #include <svx/svditer.hxx>
50 #include <svx/svdoole2.hxx>
51 #include <svx/svdpage.hxx>
52 #include "drwlayer.hxx"
53 #include "scresid.hxx"
54 
55 extern sal_Bool bDrawIsInUndo;          //! irgendwo als Member !!!
56 
57 using namespace com::sun::star;
58 using ::com::sun::star::uno::Sequence;
59 using ::std::auto_ptr;
60 
61 // STATIC DATA -----------------------------------------------------------
62 
63 TYPEINIT1(ScUndoInsertTab,      SfxUndoAction);
64 TYPEINIT1(ScUndoInsertTables,   SfxUndoAction);
65 TYPEINIT1(ScUndoDeleteTab,      SfxUndoAction);
66 TYPEINIT1(ScUndoRenameTab,      SfxUndoAction);
67 TYPEINIT1(ScUndoMoveTab,        SfxUndoAction);
68 TYPEINIT1(ScUndoCopyTab,        SfxUndoAction);
69 TYPEINIT1(ScUndoMakeScenario,   SfxUndoAction);
70 TYPEINIT1(ScUndoImportTab,      SfxUndoAction);
71 TYPEINIT1(ScUndoRemoveLink,     SfxUndoAction);
72 TYPEINIT1(ScUndoShowHideTab,    SfxUndoAction);
73 TYPEINIT1(ScUndoPrintRange,     SfxUndoAction);
74 TYPEINIT1(ScUndoScenarioFlags,  SfxUndoAction);
75 TYPEINIT1(ScUndoRenameObject,   SfxUndoAction);
76 TYPEINIT1(ScUndoLayoutRTL,      SfxUndoAction);
77 //UNUSED2009-05 TYPEINIT1(ScUndoSetGrammar,     SfxUndoAction);
78 TYPEINIT1(ScUndoTabColor,  SfxUndoAction);
79 
80 
81 // -----------------------------------------------------------------------
82 //
83 //      Tabelle einfuegen
84 //
85 
ScUndoInsertTab(ScDocShell * pNewDocShell,SCTAB nTabNum,sal_Bool bApp,const String & rNewName)86 ScUndoInsertTab::ScUndoInsertTab( ScDocShell* pNewDocShell,
87                                   SCTAB nTabNum,
88                                   sal_Bool bApp,
89                                   const String& rNewName) :
90     ScSimpleUndo( pNewDocShell ),
91     sNewName( rNewName ),
92     pDrawUndo( NULL ),
93     nTab( nTabNum ),
94     bAppend( bApp )
95 {
96     pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
97     SetChangeTrack();
98 }
99 
~ScUndoInsertTab()100 ScUndoInsertTab::~ScUndoInsertTab()
101 {
102     DeleteSdrUndoAction( pDrawUndo );
103 }
104 
GetComment() const105 String ScUndoInsertTab::GetComment() const
106 {
107     if (bAppend)
108         return ScGlobal::GetRscString( STR_UNDO_APPEND_TAB );
109     else
110         return ScGlobal::GetRscString( STR_UNDO_INSERT_TAB );
111 }
112 
SetChangeTrack()113 void ScUndoInsertTab::SetChangeTrack()
114 {
115     ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
116     if ( pChangeTrack )
117     {
118         ScRange aRange( 0, 0, nTab, MAXCOL, MAXROW, nTab );
119         pChangeTrack->AppendInsert( aRange );
120         nEndChangeAction = pChangeTrack->GetActionMax();
121     }
122     else
123         nEndChangeAction = 0;
124 }
125 
Undo()126 void ScUndoInsertTab::Undo()
127 {
128     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
129     pViewShell->SetTabNo(nTab);
130 
131     pDocShell->SetInUndo( sal_True );               //! BeginUndo
132     bDrawIsInUndo = sal_True;
133     pViewShell->DeleteTable( nTab, sal_False );
134     bDrawIsInUndo = sal_False;
135     pDocShell->SetInUndo( sal_False );              //! EndUndo
136 
137     DoSdrUndoAction( pDrawUndo, pDocShell->GetDocument() );
138 
139     ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
140     if ( pChangeTrack )
141         pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
142 
143     //  SetTabNo(...,sal_True) for all views to sync with drawing layer pages
144     pDocShell->Broadcast( SfxSimpleHint( SC_HINT_FORCESETTAB ) );
145 }
146 
Redo()147 void ScUndoInsertTab::Redo()
148 {
149     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
150 
151     RedoSdrUndoAction( pDrawUndo );             // Draw Redo first
152 
153     pDocShell->SetInUndo( sal_True );               //! BeginRedo
154     bDrawIsInUndo = sal_True;
155     if (bAppend)
156         pViewShell->AppendTable( sNewName, sal_False );
157     else
158     {
159         pViewShell->SetTabNo(nTab);
160         pViewShell->InsertTable( sNewName, nTab, sal_False );
161     }
162     bDrawIsInUndo = sal_False;
163     pDocShell->SetInUndo( sal_False );              //! EndRedo
164 
165     SetChangeTrack();
166 }
167 
Repeat(SfxRepeatTarget & rTarget)168 void ScUndoInsertTab::Repeat(SfxRepeatTarget& rTarget)
169 {
170     if (rTarget.ISA(ScTabViewTarget))
171         ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
172             Execute(FID_INS_TABLE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
173 }
174 
CanRepeat(SfxRepeatTarget & rTarget) const175 sal_Bool ScUndoInsertTab::CanRepeat(SfxRepeatTarget& rTarget) const
176 {
177     return (rTarget.ISA(ScTabViewTarget));
178 }
179 
180 // -----------------------------------------------------------------------
181 //
182 //      Tabellen einfuegen
183 //
184 
ScUndoInsertTables(ScDocShell * pNewDocShell,SCTAB nTabNum,sal_Bool bApp,SvStrings * pNewNameList)185 ScUndoInsertTables::ScUndoInsertTables( ScDocShell* pNewDocShell,
186                                         SCTAB nTabNum,
187                                         sal_Bool bApp,SvStrings *pNewNameList) :
188     ScSimpleUndo( pNewDocShell ),
189     pDrawUndo( NULL ),
190     nTab( nTabNum ),
191     bAppend( bApp )
192 {
193     pNameList = pNewNameList;
194     pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
195 
196     SetChangeTrack();
197 }
198 
~ScUndoInsertTables()199 ScUndoInsertTables::~ScUndoInsertTables()
200 {
201     String *pStr=NULL;
202     if(pNameList!=NULL)
203     {
204         for(int i=0;i<pNameList->Count();i++)
205         {
206             pStr=pNameList->GetObject(sal::static_int_cast<sal_uInt16>(i));
207             delete pStr;
208         }
209         pNameList->Remove(0,pNameList->Count());
210         delete pNameList;
211     }
212     DeleteSdrUndoAction( pDrawUndo );
213 }
214 
GetComment() const215 String ScUndoInsertTables::GetComment() const
216 {
217     return ScGlobal::GetRscString( STR_UNDO_INSERT_TAB );
218 }
219 
SetChangeTrack()220 void ScUndoInsertTables::SetChangeTrack()
221 {
222     ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
223     if ( pChangeTrack )
224     {
225         nStartChangeAction = pChangeTrack->GetActionMax() + 1;
226         nEndChangeAction = 0;
227         ScRange aRange( 0, 0, nTab, MAXCOL, MAXROW, nTab );
228         for( int i = 0; i < pNameList->Count(); i++ )
229         {
230             aRange.aStart.SetTab( sal::static_int_cast<SCTAB>( nTab + i ) );
231             aRange.aEnd.SetTab( sal::static_int_cast<SCTAB>( nTab + i ) );
232             pChangeTrack->AppendInsert( aRange );
233             nEndChangeAction = pChangeTrack->GetActionMax();
234         }
235     }
236     else
237         nStartChangeAction = nEndChangeAction = 0;
238 }
239 
Undo()240 void ScUndoInsertTables::Undo()
241 {
242     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
243     pViewShell->SetTabNo(nTab);
244 
245     pDocShell->SetInUndo( sal_True );               //! BeginUndo
246     bDrawIsInUndo = sal_True;
247 
248     SvShorts TheTabs;
249     for(int i=0;i<pNameList->Count();i++)
250     {
251         TheTabs.push_back( sal::static_int_cast<short>(nTab+i) );
252     }
253 
254     pViewShell->DeleteTables( TheTabs, sal_False );
255     TheTabs.clear();
256 
257     bDrawIsInUndo = sal_False;
258     pDocShell->SetInUndo( sal_False );              //! EndUndo
259 
260     DoSdrUndoAction( pDrawUndo, pDocShell->GetDocument() );
261 
262     ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
263     if ( pChangeTrack )
264         pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
265 
266     //  SetTabNo(...,sal_True) for all views to sync with drawing layer pages
267     pDocShell->Broadcast( SfxSimpleHint( SC_HINT_FORCESETTAB ) );
268 }
269 
Redo()270 void ScUndoInsertTables::Redo()
271 {
272     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
273 
274     RedoSdrUndoAction( pDrawUndo );             // Draw Redo first
275 
276     pDocShell->SetInUndo( sal_True );               //! BeginRedo
277     bDrawIsInUndo = sal_True;
278     pViewShell->SetTabNo(nTab);
279     pViewShell->InsertTables( pNameList, nTab, static_cast<SCTAB>(pNameList->Count()),sal_False );
280 
281     bDrawIsInUndo = sal_False;
282     pDocShell->SetInUndo( sal_False );              //! EndRedo
283 
284     SetChangeTrack();
285 }
286 
Repeat(SfxRepeatTarget & rTarget)287 void ScUndoInsertTables::Repeat(SfxRepeatTarget& rTarget)
288 {
289     if (rTarget.ISA(ScTabViewTarget))
290         ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
291             Execute(FID_INS_TABLE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
292 }
293 
CanRepeat(SfxRepeatTarget & rTarget) const294 sal_Bool ScUndoInsertTables::CanRepeat(SfxRepeatTarget& rTarget) const
295 {
296     return (rTarget.ISA(ScTabViewTarget));
297 }
298 
299 
300 //----------------------------------------------------------------------------------
301 //
302 //      Tabelle loeschen
303 //
304 
ScUndoDeleteTab(ScDocShell * pNewDocShell,const SvShorts & aTab,ScDocument * pUndoDocument,ScRefUndoData * pRefData)305 ScUndoDeleteTab::ScUndoDeleteTab( ScDocShell* pNewDocShell,const SvShorts &aTab, //SCTAB nNewTab,
306                                     ScDocument* pUndoDocument, ScRefUndoData* pRefData ) :
307     ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST )
308 {
309         theTabs=aTab;
310 
311         SetChangeTrack();
312 }
313 
~ScUndoDeleteTab()314 ScUndoDeleteTab::~ScUndoDeleteTab()
315 {
316     theTabs.clear();
317 }
318 
GetComment() const319 String ScUndoDeleteTab::GetComment() const
320 {
321     return ScGlobal::GetRscString( STR_UNDO_DELETE_TAB );
322 }
323 
SetChangeTrack()324 void ScUndoDeleteTab::SetChangeTrack()
325 {
326     ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
327     if ( pChangeTrack )
328     {
329         sal_uLong nTmpChangeAction;
330         nStartChangeAction = pChangeTrack->GetActionMax() + 1;
331         nEndChangeAction = 0;
332         ScRange aRange( 0, 0, 0, MAXCOL, MAXROW, 0 );
333         for ( size_t i = 0; i < theTabs.size(); i++ )
334         {
335             aRange.aStart.SetTab( theTabs[sal::static_int_cast<sal_uInt16>(i)] );
336             aRange.aEnd.SetTab( theTabs[sal::static_int_cast<sal_uInt16>(i)] );
337             pChangeTrack->AppendDeleteRange( aRange, pRefUndoDoc,
338                 nTmpChangeAction, nEndChangeAction, (short) i );
339         }
340     }
341     else
342         nStartChangeAction = nEndChangeAction = 0;
343 }
344 
lcl_GetVisibleTabBefore(ScDocument & rDoc,SCTAB nTab)345 SCTAB lcl_GetVisibleTabBefore( ScDocument& rDoc, SCTAB nTab )
346 {
347     while ( nTab > 0 && !rDoc.IsVisible( nTab ) )
348         --nTab;
349 
350     return nTab;
351 }
352 
Undo()353 void ScUndoDeleteTab::Undo()
354 {
355     BeginUndo();
356     size_t i=0;
357     ScDocument* pDoc = pDocShell->GetDocument();
358 
359     sal_Bool bLink = sal_False;
360     String aName;
361 
362     for(i=0;i<theTabs.size();i++)
363     {
364         SCTAB nTab = theTabs[sal::static_int_cast<sal_uInt16>(i)];
365         pRefUndoDoc->GetName( nTab, aName );
366 
367         bDrawIsInUndo = sal_True;
368         sal_Bool bOk = pDoc->InsertTab( nTab, aName );
369         bDrawIsInUndo = sal_False;
370         if (bOk)
371         {
372             //  Ref-Undo passiert in EndUndo
373     //      pUndoDoc->UndoToDocument(0,0,nTab, MAXCOL,MAXROW,nTab, IDF_ALL,sal_False, pDoc );
374             pRefUndoDoc->CopyToDocument(0,0,nTab, MAXCOL,MAXROW,nTab, IDF_ALL,sal_False, pDoc );
375 
376             String aOldName;
377             pRefUndoDoc->GetName( nTab, aOldName );
378             pDoc->RenameTab( nTab, aOldName, sal_False );
379             if (pRefUndoDoc->IsLinked(nTab))
380             {
381                 pDoc->SetLink( nTab, pRefUndoDoc->GetLinkMode(nTab), pRefUndoDoc->GetLinkDoc(nTab),
382                                      pRefUndoDoc->GetLinkFlt(nTab), pRefUndoDoc->GetLinkOpt(nTab),
383                                      pRefUndoDoc->GetLinkTab(nTab), pRefUndoDoc->GetLinkRefreshDelay(nTab) );
384                 bLink = sal_True;
385             }
386 
387             if ( pRefUndoDoc->IsScenario(nTab) )
388             {
389                 pDoc->SetScenario( nTab, sal_True );
390                 String aComment;
391                 Color  aColor;
392                 sal_uInt16 nScenFlags;
393                 pRefUndoDoc->GetScenarioData( nTab, aComment, aColor, nScenFlags );
394                 pDoc->SetScenarioData( nTab, aComment, aColor, nScenFlags );
395                 sal_Bool bActive = pRefUndoDoc->IsActiveScenario( nTab );
396                 pDoc->SetActiveScenario( nTab, bActive );
397             }
398             pDoc->SetVisible( nTab, pRefUndoDoc->IsVisible( nTab ) );
399             pDoc->SetTabBgColor( nTab, pRefUndoDoc->GetTabBgColor(nTab) );
400             pDoc->SetSheetEvents( nTab, pRefUndoDoc->GetSheetEvents( nTab ) );
401 
402             if ( pRefUndoDoc->IsTabProtected( nTab ) )
403                 pDoc->SetTabProtection(nTab, pRefUndoDoc->GetTabProtection(nTab));
404 
405             //  Drawing-Layer passiert beim MoveUndo::EndUndo
406     //      pDoc->TransferDrawPage(pRefUndoDoc, nTab,nTab);
407         }
408     }
409     if (bLink)
410     {
411         pDocShell->UpdateLinks();               // Link-Manager updaten
412     }
413 
414     EndUndo();      // Draw-Undo muss vor dem Broadcast kommen!
415 
416     ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
417     if ( pChangeTrack )
418         pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
419 
420     for(i=0;i<theTabs.size();i++)
421     {
422         pDocShell->Broadcast( ScTablesHint( SC_TAB_INSERTED, theTabs[sal::static_int_cast<sal_uInt16>(i)]) );
423     }
424     SfxApplication* pSfxApp = SFX_APP();                                // Navigator
425     pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
426     pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
427     pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
428 
429     pDocShell->PostPaint(0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_ALL );  // incl. Extras
430 
431     //  nicht ShowTable wegen SetTabNo(..., sal_True):
432     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
433     if (pViewShell)
434         pViewShell->SetTabNo( lcl_GetVisibleTabBefore( *pDoc, theTabs.front() ), sal_True );
435 
436 //  EndUndo();
437 }
438 
Redo()439 void ScUndoDeleteTab::Redo()
440 {
441     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
442     pViewShell->SetTabNo( lcl_GetVisibleTabBefore( *pDocShell->GetDocument(), theTabs.front() ) );
443 
444     RedoSdrUndoAction( pDrawUndo );             // Draw Redo first
445 
446     pDocShell->SetInUndo( sal_True );               //! BeginRedo
447     bDrawIsInUndo = sal_True;
448     pViewShell->DeleteTables( theTabs, sal_False );
449     bDrawIsInUndo = sal_False;
450     pDocShell->SetInUndo( sal_True );               //! EndRedo
451 
452     SetChangeTrack();
453 
454     //  SetTabNo(...,sal_True) for all views to sync with drawing layer pages
455     pDocShell->Broadcast( SfxSimpleHint( SC_HINT_FORCESETTAB ) );
456 }
457 
Repeat(SfxRepeatTarget & rTarget)458 void ScUndoDeleteTab::Repeat(SfxRepeatTarget& rTarget)
459 {
460     if (rTarget.ISA(ScTabViewTarget))
461     {
462         ScTabViewShell* pViewShell = ((ScTabViewTarget&)rTarget).GetViewShell();
463         pViewShell->DeleteTable( pViewShell->GetViewData()->GetTabNo(), sal_True );
464     }
465 }
466 
CanRepeat(SfxRepeatTarget & rTarget) const467 sal_Bool ScUndoDeleteTab::CanRepeat(SfxRepeatTarget& rTarget) const
468 {
469     return (rTarget.ISA(ScTabViewTarget));
470 }
471 
472 
473 //---------------------------------------------------------------------------------
474 //
475 //      Tabelle umbenennen
476 //
477 
ScUndoRenameTab(ScDocShell * pNewDocShell,SCTAB nT,const String & rOldName,const String & rNewName)478 ScUndoRenameTab::ScUndoRenameTab( ScDocShell* pNewDocShell,
479                                   SCTAB nT,
480                                   const String& rOldName,
481                                   const String& rNewName) :
482     ScSimpleUndo( pNewDocShell ),
483     nTab     ( nT )
484 {
485     sOldName = rOldName;
486     sNewName = rNewName;
487 }
488 
~ScUndoRenameTab()489 ScUndoRenameTab::~ScUndoRenameTab()
490 {
491 }
492 
GetComment() const493 String ScUndoRenameTab::GetComment() const
494 {
495     return ScGlobal::GetRscString( STR_UNDO_RENAME_TAB );
496 }
497 
DoChange(SCTAB nTabP,const String & rName) const498 void ScUndoRenameTab::DoChange( SCTAB nTabP, const String& rName ) const
499 {
500     ScDocument* pDoc = pDocShell->GetDocument();
501     pDoc->RenameTab( nTabP, rName );
502 
503     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );    // Navigator
504 
505     pDocShell->PostPaintGridAll();
506     pDocShell->PostPaintExtras();
507     pDocShell->PostDataChanged();
508 
509     //  Der Tabellenname koennte in einer Formel vorkommen...
510     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
511     if (pViewShell)
512         pViewShell->UpdateInputHandler();
513 }
514 
Undo()515 void ScUndoRenameTab::Undo()
516 {
517     DoChange(nTab, sOldName);
518 }
519 
Redo()520 void ScUndoRenameTab::Redo()
521 {
522     DoChange(nTab, sNewName);
523 }
524 
Repeat(SfxRepeatTarget &)525 void ScUndoRenameTab::Repeat(SfxRepeatTarget& /* rTarget */)
526 {
527     //  Repeat macht keinen Sinn
528 }
529 
CanRepeat(SfxRepeatTarget &) const530 sal_Bool ScUndoRenameTab::CanRepeat(SfxRepeatTarget& /* rTarget */) const
531 {
532     return sal_False;
533 }
534 
535 
536 //----------------------------------------------------------------------------------
537 //
538 //      Tabelle verschieben
539 //
540 
ScUndoMoveTab(ScDocShell * pNewDocShell,const SvShorts & aOldTab,const SvShorts & aNewTab)541 ScUndoMoveTab::ScUndoMoveTab( ScDocShell* pNewDocShell,
542                                   const SvShorts &aOldTab,
543                                   const SvShorts &aNewTab) :
544     ScSimpleUndo( pNewDocShell )
545 {
546     theOldTabs=aOldTab;
547     theNewTabs=aNewTab;
548 }
549 
~ScUndoMoveTab()550 ScUndoMoveTab::~ScUndoMoveTab()
551 {
552     theNewTabs.clear();
553     theOldTabs.clear();
554 }
555 
GetComment() const556 String ScUndoMoveTab::GetComment() const
557 {
558     return ScGlobal::GetRscString( STR_UNDO_MOVE_TAB );
559 }
560 
DoChange(sal_Bool bUndo) const561 void ScUndoMoveTab::DoChange( sal_Bool bUndo ) const
562 {
563     ScDocument* pDoc = pDocShell->GetDocument();
564     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
565 
566     if (bUndo)                                      // UnDo
567     {
568         for (size_t i = theNewTabs.size(); i > 0; i--)
569         {
570             SCTAB nDestTab = theNewTabs[i - 1];
571             SCTAB nOldTab = theOldTabs[i - 1];
572             if (nDestTab > MAXTAB)                          // append ?
573                 nDestTab = pDoc->GetTableCount() - 1;
574 
575             pDoc->MoveTab( nDestTab, nOldTab );
576             pViewShell->GetViewData()->MoveTab( nDestTab, nOldTab );
577             pViewShell->SetTabNo( nOldTab, sal_True );
578         }
579     }
580     else
581     {
582         for(size_t i=0;i<theNewTabs.size();i++)
583         {
584             SCTAB nDestTab = theNewTabs[i];
585             SCTAB nNewTab = theNewTabs[i];
586             SCTAB nOldTab = theOldTabs[i];
587             if (nDestTab > MAXTAB)                          // append ?
588                 nDestTab = pDoc->GetTableCount() - 1;
589 
590             pDoc->MoveTab( nOldTab, nNewTab );
591             pViewShell->GetViewData()->MoveTab( nOldTab, nNewTab );
592             pViewShell->SetTabNo( nDestTab, sal_True );
593         }
594     }
595 
596     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );    // Navigator
597 
598     pDocShell->PostPaintGridAll();
599     pDocShell->PostPaintExtras();
600     pDocShell->PostDataChanged();
601 }
602 
Undo()603 void ScUndoMoveTab::Undo()
604 {
605     DoChange( sal_True );
606 }
607 
Redo()608 void ScUndoMoveTab::Redo()
609 {
610     DoChange( sal_False );
611 }
612 
Repeat(SfxRepeatTarget &)613 void ScUndoMoveTab::Repeat(SfxRepeatTarget& /* rTarget */)
614 {
615         // No Repeat ! ? !
616 }
617 
CanRepeat(SfxRepeatTarget &) const618 sal_Bool ScUndoMoveTab::CanRepeat(SfxRepeatTarget& /* rTarget */) const
619 {
620     return sal_False;
621 }
622 
623 
624 //----------------------------------------------------------------------------------
625 //
626 //      Copy table
627 //
628 
ScUndoCopyTab(ScDocShell * pNewDocShell,const SvShorts & aOldTab,const SvShorts & aNewTab)629 ScUndoCopyTab::ScUndoCopyTab( ScDocShell* pNewDocShell,
630                                   const SvShorts &aOldTab,
631                                   const SvShorts &aNewTab) :
632     ScSimpleUndo( pNewDocShell ),
633     pDrawUndo( NULL )
634 {
635     pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
636 
637     theOldTabs=aOldTab;
638     theNewTabs=aNewTab;
639 }
640 
~ScUndoCopyTab()641 ScUndoCopyTab::~ScUndoCopyTab()
642 {
643     DeleteSdrUndoAction( pDrawUndo );
644 }
645 
GetComment() const646 String ScUndoCopyTab::GetComment() const
647 {
648     return ScGlobal::GetRscString( STR_UNDO_COPY_TAB );
649 }
650 
DoChange() const651 void ScUndoCopyTab::DoChange() const
652 {
653     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
654 
655     if (pViewShell)
656         pViewShell->SetTabNo(theOldTabs.front(),sal_True);
657 
658     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );    // Navigator
659 
660     pDocShell->PostPaintGridAll();
661     pDocShell->PostPaintExtras();
662     pDocShell->PostDataChanged();
663 }
664 
Undo()665 void ScUndoCopyTab::Undo()
666 {
667     ScDocument* pDoc = pDocShell->GetDocument();
668 
669     DoSdrUndoAction( pDrawUndo, pDoc );                 // before the sheets are deleted
670 
671     for (size_t i = theNewTabs.size(); i > 0; i--)
672     {
673         SCTAB nDestTab = theNewTabs[i - 1];
674         if (nDestTab > MAXTAB)                          // append?
675             nDestTab = pDoc->GetTableCount() - 1;
676 
677         bDrawIsInUndo = sal_True;
678         pDoc->DeleteTab(nDestTab);
679         bDrawIsInUndo = sal_False;
680     }
681 
682     //  ScTablesHint broadcasts after all sheets have been deleted,
683     //  so sheets and draw pages are in sync!
684 
685     for (size_t i = theNewTabs.size(); i > 0; i--)
686     {
687         SCTAB nDestTab = theNewTabs[i - 1];
688         if (nDestTab > MAXTAB)                          // append?
689             nDestTab = pDoc->GetTableCount() - 1;
690 
691         pDocShell->Broadcast( ScTablesHint( SC_TAB_DELETED, nDestTab ) );
692     }
693 
694     DoChange();
695 }
696 
Redo()697 void ScUndoCopyTab::Redo()
698 {
699     ScDocument* pDoc = pDocShell->GetDocument();
700     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
701 
702     SCTAB nDestTab = 0;
703     for(size_t i=0;i<theNewTabs.size();i++)
704     {
705         nDestTab = theNewTabs[i];
706         SCTAB nNewTab = theNewTabs[i];
707         SCTAB nOldTab = theOldTabs[i];
708         if (nDestTab > MAXTAB)                          // append ?
709             nDestTab = pDoc->GetTableCount() - 1;
710 
711         bDrawIsInUndo = sal_True;
712         pDoc->CopyTab( nOldTab, nNewTab );
713         bDrawIsInUndo = sal_False;
714 
715         pViewShell->GetViewData()->MoveTab( nOldTab, nNewTab );
716 
717         SCTAB nAdjSource = nOldTab;
718         if ( nNewTab <= nOldTab )
719             ++nAdjSource;               // new position of source table after CopyTab
720 
721         if ( pDoc->IsScenario(nAdjSource) )
722         {
723             pDoc->SetScenario(nNewTab, sal_True );
724             String aComment;
725             Color  aColor;
726             sal_uInt16 nScenFlags;
727             pDoc->GetScenarioData(nAdjSource, aComment, aColor, nScenFlags );
728             pDoc->SetScenarioData(nNewTab, aComment, aColor, nScenFlags );
729             sal_Bool bActive = pDoc->IsActiveScenario(nAdjSource);
730             pDoc->SetActiveScenario(nNewTab, bActive );
731             sal_Bool bVisible=pDoc->IsVisible(nAdjSource);
732             pDoc->SetVisible(nNewTab,bVisible );
733         }
734 
735         if ( pDoc->IsTabProtected( nAdjSource ) )
736             pDoc->CopyTabProtection(nAdjSource, nNewTab);
737     }
738 
739     RedoSdrUndoAction( pDrawUndo );             // after the sheets are inserted
740 
741     pViewShell->SetTabNo( nDestTab, sal_True );     // after draw-undo
742 
743     DoChange();
744 
745 }
746 
Repeat(SfxRepeatTarget &)747 void ScUndoCopyTab::Repeat(SfxRepeatTarget& /* rTarget */)
748 {
749         // kein Repeat ! ? !
750 }
751 
CanRepeat(SfxRepeatTarget &) const752 sal_Bool ScUndoCopyTab::CanRepeat(SfxRepeatTarget& /* rTarget */) const
753 {
754     return sal_False;
755 }
756 
757 //---------------------------------------------------------------------------------
758 //
759 //      Tab Bg Color
760 //
761 
ScUndoTabColor(ScDocShell * pNewDocShell,SCTAB nT,const Color & aOTabBgColor,const Color & aNTabBgColor)762 ScUndoTabColor::ScUndoTabColor(
763     ScDocShell* pNewDocShell, SCTAB nT, const Color& aOTabBgColor, const Color& aNTabBgColor) :
764     ScSimpleUndo( pNewDocShell )
765 {
766     ScUndoTabColorInfo aInfo(nT);
767     aInfo.maOldTabBgColor = aOTabBgColor;
768     aInfo.maNewTabBgColor = aNTabBgColor;
769     aTabColorList.push_back(aInfo);
770 }
771 
ScUndoTabColor(ScDocShell * pNewDocShell,const ScUndoTabColorInfo::List & rUndoTabColorList)772 ScUndoTabColor::ScUndoTabColor(
773     ScDocShell* pNewDocShell,
774     const ScUndoTabColorInfo::List& rUndoTabColorList) :
775     ScSimpleUndo(pNewDocShell),
776     aTabColorList(rUndoTabColorList)
777 {
778 }
779 
~ScUndoTabColor()780 ScUndoTabColor::~ScUndoTabColor()
781 {
782 }
783 
GetComment() const784 String ScUndoTabColor::GetComment() const
785 {
786     if (aTabColorList.size() > 1)
787         return ScGlobal::GetRscString(STR_UNDO_SET_MULTI_TAB_BG_COLOR);
788     return ScGlobal::GetRscString(STR_UNDO_SET_TAB_BG_COLOR);
789 }
790 
DoChange(bool bUndoType) const791 void ScUndoTabColor::DoChange(bool bUndoType) const
792 {
793     ScDocument* pDoc = pDocShell->GetDocument();
794     if (!pDoc)
795         return;
796 
797     size_t nTabColorCount = aTabColorList.size();
798     for (size_t i = 0; i < nTabColorCount; ++i)
799     {
800         const ScUndoTabColorInfo& rTabColor = aTabColorList[i];
801         pDoc->SetTabBgColor(rTabColor.mnTabId,
802             bUndoType ? rTabColor.maOldTabBgColor : rTabColor.maNewTabBgColor);
803     }
804 
805     pDocShell->PostPaintExtras();
806     ScDocShellModificator aModificator( *pDocShell );
807     aModificator.SetDocumentModified();
808 }
809 
Undo()810 void ScUndoTabColor::Undo()
811 {
812     DoChange(true);
813 }
814 
Redo()815 void ScUndoTabColor::Redo()
816 {
817     DoChange(false);
818 }
819 
Repeat(SfxRepeatTarget &)820 void ScUndoTabColor::Repeat(SfxRepeatTarget& /* rTarget */)
821 {
822     //  No Repeat
823 }
824 
CanRepeat(SfxRepeatTarget &) const825 sal_Bool ScUndoTabColor::CanRepeat(SfxRepeatTarget& /* rTarget */) const
826 {
827     return sal_False;
828 }
829 
830 // -----------------------------------------------------------------------
831 //
832 //      Szenario anlegen
833 //
834 
ScUndoMakeScenario(ScDocShell * pNewDocShell,SCTAB nSrc,SCTAB nDest,const String & rN,const String & rC,const Color & rCol,sal_uInt16 nF,const ScMarkData & rMark)835 ScUndoMakeScenario::ScUndoMakeScenario( ScDocShell* pNewDocShell,
836                         SCTAB nSrc, SCTAB nDest,
837                         const String& rN, const String& rC,
838                         const Color& rCol, sal_uInt16 nF,
839                         const ScMarkData& rMark ) :
840     ScSimpleUndo( pNewDocShell ),
841     nSrcTab( nSrc ),
842     nDestTab( nDest ),
843     aName( rN ),
844     aComment( rC ),
845     aColor( rCol ),
846     nFlags( nF ),
847     aMarkData( rMark ),
848     pDrawUndo( NULL )
849 {
850     pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
851 }
852 
~ScUndoMakeScenario()853 ScUndoMakeScenario::~ScUndoMakeScenario()
854 {
855     DeleteSdrUndoAction( pDrawUndo );
856 }
857 
GetComment() const858 String ScUndoMakeScenario::GetComment() const
859 {
860     return ScGlobal::GetRscString( STR_UNDO_MAKESCENARIO );
861 }
862 
Undo()863 void ScUndoMakeScenario::Undo()
864 {
865     ScDocument* pDoc = pDocShell->GetDocument();
866 
867     pDocShell->SetInUndo( sal_True );
868     bDrawIsInUndo = sal_True;
869     pDoc->DeleteTab( nDestTab );
870     bDrawIsInUndo = sal_False;
871     pDocShell->SetInUndo( sal_False );
872 
873     DoSdrUndoAction( pDrawUndo, pDoc );
874 
875     pDocShell->PostPaint(0,0,nDestTab,MAXCOL,MAXROW,MAXTAB, PAINT_ALL);
876     pDocShell->PostDataChanged();
877 
878     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
879     if (pViewShell)
880         pViewShell->SetTabNo( nSrcTab, sal_True );
881 
882     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
883 
884     //  SetTabNo(...,sal_True) for all views to sync with drawing layer pages
885     pDocShell->Broadcast( SfxSimpleHint( SC_HINT_FORCESETTAB ) );
886 }
887 
Redo()888 void ScUndoMakeScenario::Redo()
889 {
890     SetViewMarkData( aMarkData );
891 
892     RedoSdrUndoAction( pDrawUndo );             // Draw Redo first
893 
894     pDocShell->SetInUndo( sal_True );
895     bDrawIsInUndo = sal_True;
896 
897     pDocShell->MakeScenario( nSrcTab, aName, aComment, aColor, nFlags, aMarkData, sal_False );
898 
899     bDrawIsInUndo = sal_False;
900     pDocShell->SetInUndo( sal_False );
901 
902     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
903     if (pViewShell)
904         pViewShell->SetTabNo( nDestTab, sal_True );
905 
906     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
907 }
908 
Repeat(SfxRepeatTarget & rTarget)909 void ScUndoMakeScenario::Repeat(SfxRepeatTarget& rTarget)
910 {
911     if (rTarget.ISA(ScTabViewTarget))
912     {
913         ((ScTabViewTarget&)rTarget).GetViewShell()->MakeScenario( aName, aComment, aColor, nFlags );
914     }
915 }
916 
CanRepeat(SfxRepeatTarget & rTarget) const917 sal_Bool ScUndoMakeScenario::CanRepeat(SfxRepeatTarget& rTarget) const
918 {
919     return (rTarget.ISA(ScTabViewTarget));
920 }
921 
922 
923 // -----------------------------------------------------------------------
924 //
925 //      Tabelle einfuegen
926 //
927 
ScUndoImportTab(ScDocShell * pShell,SCTAB nNewTab,SCTAB nNewCount,sal_Bool bNewLink)928 ScUndoImportTab::ScUndoImportTab( ScDocShell* pShell,
929                         SCTAB nNewTab, SCTAB nNewCount, sal_Bool bNewLink ) :
930     ScSimpleUndo( pShell ),
931     nTab( nNewTab ),
932     nCount( nNewCount ),
933     bLink( bNewLink ),
934     pRedoDoc( NULL ),
935     pDrawUndo( NULL )
936 {
937     pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
938 }
939 
~ScUndoImportTab()940 ScUndoImportTab::~ScUndoImportTab()
941 {
942     delete pRedoDoc;
943     DeleteSdrUndoAction( pDrawUndo );
944 }
945 
GetComment() const946 String ScUndoImportTab::GetComment() const
947 {
948     return ScGlobal::GetRscString( STR_UNDO_INSERT_TAB );
949 }
950 
DoChange() const951 void ScUndoImportTab::DoChange() const
952 {
953     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
954     ScDocument* pDoc = pDocShell->GetDocument();
955     SCTAB nTabCount = pDoc->GetTableCount();
956     if (pViewShell)
957     {
958         if(nTab<nTabCount)
959         {
960             pViewShell->SetTabNo(nTab,sal_True);
961         }
962         else
963         {
964             pViewShell->SetTabNo(nTab-1,sal_True);
965         }
966     }
967 
968     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );    // Navigator
969     pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB,
970                                 PAINT_GRID | PAINT_TOP | PAINT_LEFT | PAINT_EXTRAS );
971 }
972 
Undo()973 void ScUndoImportTab::Undo()
974 {
975     //! eingefuegte Bereichsnamen etc.
976 
977     SCTAB i;
978     ScDocument* pDoc = pDocShell->GetDocument();
979     sal_Bool bMakeRedo = !pRedoDoc;
980     if (bMakeRedo)
981     {
982         pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
983         pRedoDoc->InitUndo( pDoc, nTab,nTab+nCount-1, sal_True,sal_True );
984 
985         String aOldName;
986         for (i=0; i<nCount; i++)
987         {
988             SCTAB nTabPos=nTab+i;
989 
990             pDoc->CopyToDocument(0,0,nTabPos, MAXCOL,MAXROW,nTabPos, IDF_ALL,sal_False, pRedoDoc );
991             pDoc->GetName( nTabPos, aOldName );
992             pRedoDoc->RenameTab( nTabPos, aOldName, sal_False );
993             pRedoDoc->SetTabBgColor( nTabPos, pDoc->GetTabBgColor(nTabPos) );
994 
995             if ( pDoc->IsScenario(nTabPos) )
996             {
997                 pRedoDoc->SetScenario(nTabPos, sal_True );
998                 String aComment;
999                 Color  aColor;
1000                 sal_uInt16 nScenFlags;
1001                 pDoc->GetScenarioData(nTabPos, aComment, aColor, nScenFlags );
1002                 pRedoDoc->SetScenarioData(nTabPos, aComment, aColor, nScenFlags );
1003                 sal_Bool bActive = pDoc->IsActiveScenario(nTabPos);
1004                 pRedoDoc->SetActiveScenario(nTabPos, bActive );
1005                 sal_Bool bVisible=pDoc->IsVisible(nTabPos);
1006                 pRedoDoc->SetVisible(nTabPos,bVisible );
1007             }
1008 
1009             if ( pDoc->IsTabProtected( nTabPos ) )
1010                 pRedoDoc->SetTabProtection(nTabPos, pDoc->GetTabProtection(nTabPos));
1011         }
1012 
1013     }
1014 
1015     DoSdrUndoAction( pDrawUndo, pDoc );             // before the sheets are deleted
1016 
1017     bDrawIsInUndo = sal_True;
1018     for (i=0; i<nCount; i++)
1019         pDoc->DeleteTab( nTab );
1020     bDrawIsInUndo = sal_False;
1021 
1022     DoChange();
1023 }
1024 
Redo()1025 void ScUndoImportTab::Redo()
1026 {
1027     if (!pRedoDoc)
1028     {
1029         DBG_ERROR("wo ist mein Redo-Document?");
1030         return;
1031     }
1032 
1033     ScDocument* pDoc = pDocShell->GetDocument();
1034     String aName;
1035     SCTAB i;
1036     for (i=0; i<nCount; i++)                // first insert all sheets (#63304#)
1037     {
1038         SCTAB nTabPos=nTab+i;
1039         pRedoDoc->GetName(nTabPos,aName);
1040         bDrawIsInUndo = sal_True;
1041         pDoc->InsertTab(nTabPos,aName);
1042         bDrawIsInUndo = sal_False;
1043     }
1044     for (i=0; i<nCount; i++)                // then copy into inserted sheets
1045     {
1046         SCTAB nTabPos=nTab+i;
1047         pRedoDoc->CopyToDocument(0,0,nTabPos, MAXCOL,MAXROW,nTabPos, IDF_ALL,sal_False, pDoc );
1048         pDoc->SetTabBgColor( nTabPos, pRedoDoc->GetTabBgColor(nTabPos) );
1049 
1050         if ( pRedoDoc->IsScenario(nTabPos) )
1051         {
1052             pDoc->SetScenario(nTabPos, sal_True );
1053             String aComment;
1054             Color  aColor;
1055             sal_uInt16 nScenFlags;
1056             pRedoDoc->GetScenarioData(nTabPos, aComment, aColor, nScenFlags );
1057             pDoc->SetScenarioData(nTabPos, aComment, aColor, nScenFlags );
1058             sal_Bool bActive = pRedoDoc->IsActiveScenario(nTabPos);
1059             pDoc->SetActiveScenario(nTabPos, bActive );
1060             sal_Bool bVisible=pRedoDoc->IsVisible(nTabPos);
1061             pDoc->SetVisible(nTabPos,bVisible );
1062         }
1063 
1064         if ( pRedoDoc->IsTabProtected( nTabPos ) )
1065             pDoc->SetTabProtection(nTabPos, pRedoDoc->GetTabProtection(nTabPos));
1066     }
1067 
1068     RedoSdrUndoAction( pDrawUndo );     // after the sheets are inserted
1069 
1070     DoChange();
1071 }
1072 
Repeat(SfxRepeatTarget & rTarget)1073 void ScUndoImportTab::Repeat(SfxRepeatTarget& rTarget)
1074 {
1075     if (rTarget.ISA(ScTabViewTarget))
1076         ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
1077             Execute(FID_INS_TABLE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
1078 }
1079 
CanRepeat(SfxRepeatTarget & rTarget) const1080 sal_Bool ScUndoImportTab::CanRepeat(SfxRepeatTarget& rTarget) const
1081 {
1082     return (rTarget.ISA(ScTabViewTarget));
1083 }
1084 
1085 
1086 // -----------------------------------------------------------------------
1087 //
1088 //      Tabellen-Verknuepfung aufheben
1089 //
1090 
ScUndoRemoveLink(ScDocShell * pShell,const String & rDoc)1091 ScUndoRemoveLink::ScUndoRemoveLink( ScDocShell* pShell, const String& rDoc ) :
1092     ScSimpleUndo( pShell ),
1093     aDocName( rDoc ),
1094     nCount( 0 )
1095 {
1096     ScDocument* pDoc = pDocShell->GetDocument();
1097     SCTAB nTabCount = pDoc->GetTableCount();
1098     pTabs     = new SCTAB[nTabCount];
1099     pModes    = new sal_uInt8[nTabCount];
1100     pTabNames = new String[nTabCount];
1101 
1102     for (SCTAB i=0; i<nTabCount; i++)
1103     {
1104         sal_uInt8 nMode = pDoc->GetLinkMode(i);
1105         if (nMode)
1106             if (pDoc->GetLinkDoc(i) == aDocName)
1107             {
1108                 if (!nCount)
1109                 {
1110                     aFltName = pDoc->GetLinkFlt(i);
1111                     aOptions = pDoc->GetLinkOpt(i);
1112                     nRefreshDelay = pDoc->GetLinkRefreshDelay(i);
1113                 }
1114                 else
1115                 {
1116                     DBG_ASSERT(aFltName == pDoc->GetLinkFlt(i) &&
1117                                aOptions == pDoc->GetLinkOpt(i),
1118                                     "verschiedene Filter fuer ein Dokument?");
1119                 }
1120                 pTabs[nCount] = i;
1121                 pModes[nCount] = nMode;
1122                 pTabNames[nCount] = pDoc->GetLinkTab(i);
1123                 ++nCount;
1124             }
1125     }
1126 }
1127 
~ScUndoRemoveLink()1128 ScUndoRemoveLink::~ScUndoRemoveLink()
1129 {
1130     delete pTabs;
1131     delete pModes;
1132     delete[] pTabNames;
1133 }
1134 
GetComment() const1135 String ScUndoRemoveLink::GetComment() const
1136 {
1137     return ScGlobal::GetRscString( STR_UNDO_REMOVELINK );
1138 }
1139 
DoChange(sal_Bool bLink) const1140 void ScUndoRemoveLink::DoChange( sal_Bool bLink ) const
1141 {
1142     ScDocument* pDoc = pDocShell->GetDocument();
1143     String aEmpty;
1144     for (sal_uInt16 i=0; i<nCount; i++)
1145         if (bLink)      // establish link
1146             pDoc->SetLink( pTabs[i], pModes[i], aDocName, aFltName, aOptions, pTabNames[i], nRefreshDelay );
1147         else            // remove link
1148             pDoc->SetLink( pTabs[i], SC_LINK_NONE, aEmpty, aEmpty, aEmpty, aEmpty, 0 );
1149     pDocShell->UpdateLinks();
1150 }
1151 
Undo()1152 void ScUndoRemoveLink::Undo()
1153 {
1154     DoChange( sal_True );
1155 }
1156 
Redo()1157 void ScUndoRemoveLink::Redo()
1158 {
1159     DoChange( sal_False );
1160 }
1161 
Repeat(SfxRepeatTarget &)1162 void ScUndoRemoveLink::Repeat(SfxRepeatTarget& /* rTarget */)
1163 {
1164     //  gippsnich
1165 }
1166 
CanRepeat(SfxRepeatTarget &) const1167 sal_Bool ScUndoRemoveLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1168 {
1169     return sal_False;
1170 }
1171 
1172 
1173 // -----------------------------------------------------------------------
1174 //
1175 //      Tabellen ein-/ausblenden
1176 //
1177 
ScUndoShowHideTab(ScDocShell * pShell,SCTAB nNewTab,sal_Bool bNewShow)1178 ScUndoShowHideTab::ScUndoShowHideTab( ScDocShell* pShell, SCTAB nNewTab, sal_Bool bNewShow ) :
1179     ScSimpleUndo( pShell ),
1180     nTab( nNewTab ),
1181     bShow( bNewShow )
1182 {
1183 }
1184 
~ScUndoShowHideTab()1185 ScUndoShowHideTab::~ScUndoShowHideTab()
1186 {
1187 }
1188 
DoChange(sal_Bool bShowP) const1189 void ScUndoShowHideTab::DoChange( sal_Bool bShowP ) const
1190 {
1191     ScDocument* pDoc = pDocShell->GetDocument();
1192     pDoc->SetVisible( nTab, bShowP );
1193 
1194     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1195     if (pViewShell)
1196         pViewShell->SetTabNo(nTab,sal_True);
1197 
1198     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
1199     pDocShell->SetDocumentModified();
1200 }
1201 
Undo()1202 void ScUndoShowHideTab::Undo()
1203 {
1204     DoChange(!bShow);
1205 }
1206 
Redo()1207 void ScUndoShowHideTab::Redo()
1208 {
1209     DoChange(bShow);
1210 }
1211 
Repeat(SfxRepeatTarget & rTarget)1212 void ScUndoShowHideTab::Repeat(SfxRepeatTarget& rTarget)
1213 {
1214     if (rTarget.ISA(ScTabViewTarget))
1215         ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
1216             Execute( bShow ? FID_TABLE_SHOW : FID_TABLE_HIDE,
1217                                 SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
1218 }
1219 
CanRepeat(SfxRepeatTarget & rTarget) const1220 sal_Bool ScUndoShowHideTab::CanRepeat(SfxRepeatTarget& rTarget) const
1221 {
1222     return (rTarget.ISA(ScTabViewTarget));
1223 }
1224 
GetComment() const1225 String ScUndoShowHideTab::GetComment() const
1226 {
1227     sal_uInt16 nId = bShow ? STR_UNDO_SHOWTAB : STR_UNDO_HIDETAB;
1228     return ScGlobal::GetRscString( nId );
1229 }
1230 
1231 // ============================================================================
1232 
ScUndoDocProtect(ScDocShell * pShell,auto_ptr<ScDocProtection> pProtectSettings)1233 ScUndoDocProtect::ScUndoDocProtect(ScDocShell* pShell, auto_ptr<ScDocProtection> pProtectSettings) :
1234     ScSimpleUndo(pShell),
1235     mpProtectSettings(pProtectSettings)
1236 {
1237 }
1238 
~ScUndoDocProtect()1239 ScUndoDocProtect::~ScUndoDocProtect()
1240 {
1241 }
1242 
DoProtect(bool bProtect)1243 void ScUndoDocProtect::DoProtect(bool bProtect)
1244 {
1245     ScDocument* pDoc = pDocShell->GetDocument();
1246 
1247     if (bProtect)
1248     {
1249         // set protection.
1250         auto_ptr<ScDocProtection> pCopy(new ScDocProtection(*mpProtectSettings));
1251         pCopy->setProtected(true);
1252         pDoc->SetDocProtection(pCopy.get());
1253     }
1254     else
1255     {
1256         // remove protection.
1257         pDoc->SetDocProtection(NULL);
1258     }
1259 
1260     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1261     if (pViewShell)
1262     {
1263         pViewShell->UpdateLayerLocks();
1264         pViewShell->UpdateInputHandler(sal_True);   // damit sofort wieder eingegeben werden kann
1265     }
1266 
1267     pDocShell->PostPaintGridAll();
1268 }
1269 
Undo()1270 void ScUndoDocProtect::Undo()
1271 {
1272     BeginUndo();
1273     DoProtect(!mpProtectSettings->isProtected());
1274     EndUndo();
1275 }
1276 
Redo()1277 void ScUndoDocProtect::Redo()
1278 {
1279     BeginRedo();
1280     DoProtect(mpProtectSettings->isProtected());
1281     EndRedo();
1282 }
1283 
Repeat(SfxRepeatTarget &)1284 void ScUndoDocProtect::Repeat(SfxRepeatTarget& /* rTarget */)
1285 {
1286     //  gippsnich
1287 }
1288 
CanRepeat(SfxRepeatTarget &) const1289 sal_Bool ScUndoDocProtect::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1290 {
1291     return sal_False;       // gippsnich
1292 }
1293 
GetComment() const1294 String ScUndoDocProtect::GetComment() const
1295 {
1296     sal_uInt16 nId = mpProtectSettings->isProtected() ? STR_UNDO_PROTECT_DOC : STR_UNDO_UNPROTECT_DOC;
1297     return ScGlobal::GetRscString( nId );
1298 }
1299 
1300 // ============================================================================
1301 
ScUndoTabProtect(ScDocShell * pShell,SCTAB nTab,auto_ptr<ScTableProtection> pProtectSettings)1302 ScUndoTabProtect::ScUndoTabProtect(ScDocShell* pShell, SCTAB nTab, auto_ptr<ScTableProtection> pProtectSettings) :
1303     ScSimpleUndo(pShell),
1304     mnTab(nTab),
1305     mpProtectSettings(pProtectSettings)
1306 {
1307 }
1308 
~ScUndoTabProtect()1309 ScUndoTabProtect::~ScUndoTabProtect()
1310 {
1311 }
1312 
DoProtect(bool bProtect)1313 void ScUndoTabProtect::DoProtect(bool bProtect)
1314 {
1315     ScDocument* pDoc = pDocShell->GetDocument();
1316 
1317     if (bProtect)
1318     {
1319         // set protection.
1320         auto_ptr<ScTableProtection> pCopy(new ScTableProtection(*mpProtectSettings));
1321         pCopy->setProtected(true);
1322         pDoc->SetTabProtection(mnTab, pCopy.get());
1323     }
1324     else
1325     {
1326         // remove protection.
1327         pDoc->SetTabProtection(mnTab, NULL);
1328     }
1329 
1330     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1331     if (pViewShell)
1332     {
1333         pViewShell->UpdateLayerLocks();
1334         pViewShell->UpdateInputHandler(sal_True);   // damit sofort wieder eingegeben werden kann
1335     }
1336 
1337     pDocShell->PostPaintGridAll();
1338 }
1339 
Undo()1340 void ScUndoTabProtect::Undo()
1341 {
1342     BeginUndo();
1343     DoProtect(!mpProtectSettings->isProtected());
1344     EndUndo();
1345 }
1346 
Redo()1347 void ScUndoTabProtect::Redo()
1348 {
1349     BeginRedo();
1350     DoProtect(mpProtectSettings->isProtected());
1351     EndRedo();
1352 }
1353 
Repeat(SfxRepeatTarget &)1354 void ScUndoTabProtect::Repeat(SfxRepeatTarget& /* rTarget */)
1355 {
1356     //  gippsnich
1357 }
1358 
CanRepeat(SfxRepeatTarget &) const1359 sal_Bool ScUndoTabProtect::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1360 {
1361     return sal_False;       // gippsnich
1362 }
1363 
GetComment() const1364 String ScUndoTabProtect::GetComment() const
1365 {
1366     sal_uInt16 nId = mpProtectSettings->isProtected() ? STR_UNDO_PROTECT_TAB : STR_UNDO_UNPROTECT_TAB;
1367     return ScGlobal::GetRscString( nId );
1368 }
1369 
1370 // -----------------------------------------------------------------------
1371 //
1372 //      Druck-/Wiederholungsbereiche aendern
1373 //
1374 
ScUndoPrintRange(ScDocShell * pShell,SCTAB nNewTab,ScPrintRangeSaver * pOld,ScPrintRangeSaver * pNew)1375 ScUndoPrintRange::ScUndoPrintRange( ScDocShell* pShell, SCTAB nNewTab,
1376                                     ScPrintRangeSaver* pOld, ScPrintRangeSaver* pNew ) :
1377     ScSimpleUndo( pShell ),
1378     nTab( nNewTab ),
1379     pOldRanges( pOld ),
1380     pNewRanges( pNew )
1381 {
1382 }
1383 
~ScUndoPrintRange()1384 ScUndoPrintRange::~ScUndoPrintRange()
1385 {
1386     delete pOldRanges;
1387     delete pNewRanges;
1388 }
1389 
DoChange(sal_Bool bUndo)1390 void ScUndoPrintRange::DoChange(sal_Bool bUndo)
1391 {
1392     ScDocument* pDoc = pDocShell->GetDocument();
1393     if (bUndo)
1394         pDoc->RestorePrintRanges( *pOldRanges );
1395     else
1396         pDoc->RestorePrintRanges( *pNewRanges );
1397 
1398     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1399     if (pViewShell)
1400         pViewShell->SetTabNo( nTab );
1401 
1402     ScPrintFunc( pDocShell, pDocShell->GetPrinter(), nTab ).UpdatePages();
1403 
1404     pDocShell->PostPaint( ScRange(0,0,nTab,MAXCOL,MAXROW,nTab), PAINT_GRID );
1405 }
1406 
Undo()1407 void ScUndoPrintRange::Undo()
1408 {
1409     BeginUndo();
1410     DoChange( sal_True );
1411     EndUndo();
1412 }
1413 
Redo()1414 void ScUndoPrintRange::Redo()
1415 {
1416     BeginRedo();
1417     DoChange( sal_False );
1418     EndRedo();
1419 }
1420 
Repeat(SfxRepeatTarget &)1421 void ScUndoPrintRange::Repeat(SfxRepeatTarget& /* rTarget */)
1422 {
1423     //  gippsnich
1424 }
1425 
CanRepeat(SfxRepeatTarget &) const1426 sal_Bool ScUndoPrintRange::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1427 {
1428     return sal_False;       // gippsnich
1429 }
1430 
GetComment() const1431 String ScUndoPrintRange::GetComment() const
1432 {
1433     return ScGlobal::GetRscString( STR_UNDO_PRINTRANGES );
1434 }
1435 
1436 
1437 //------------------------------------------------------------------------
1438 
1439 //---------------------------------------------------------------------------------
1440 //
1441 //      Szenario-Flags
1442 //
1443 
ScUndoScenarioFlags(ScDocShell * pNewDocShell,SCTAB nT,const String & rON,const String & rNN,const String & rOC,const String & rNC,const Color & rOCol,const Color & rNCol,sal_uInt16 nOF,sal_uInt16 nNF)1444 ScUndoScenarioFlags::ScUndoScenarioFlags( ScDocShell* pNewDocShell, SCTAB nT,
1445                     const String& rON, const String& rNN, const String& rOC, const String& rNC,
1446                     const Color& rOCol, const Color& rNCol, sal_uInt16 nOF, sal_uInt16 nNF ) :
1447     ScSimpleUndo( pNewDocShell ),
1448     nTab        ( nT ),
1449     aOldName    ( rON ),
1450     aNewName    ( rNN ),
1451     aOldComment ( rOC ),
1452     aNewComment ( rNC ),
1453     aOldColor   ( rOCol ),
1454     aNewColor   ( rNCol ),
1455     nOldFlags   ( nOF ),
1456     nNewFlags   ( nNF )
1457 {
1458 }
1459 
~ScUndoScenarioFlags()1460 ScUndoScenarioFlags::~ScUndoScenarioFlags()
1461 {
1462 }
1463 
GetComment() const1464 String ScUndoScenarioFlags::GetComment() const
1465 {
1466     return ScGlobal::GetRscString( STR_UNDO_EDITSCENARIO );
1467 }
1468 
Undo()1469 void ScUndoScenarioFlags::Undo()
1470 {
1471     ScDocument* pDoc = pDocShell->GetDocument();
1472 
1473     pDoc->RenameTab( nTab, aOldName );
1474     pDoc->SetScenarioData( nTab, aOldComment, aOldColor, nOldFlags );
1475 
1476     pDocShell->PostPaintGridAll();
1477     //  Der Tabellenname koennte in einer Formel vorkommen...
1478     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1479     if (pViewShell)
1480         pViewShell->UpdateInputHandler();
1481 
1482     if ( aOldName != aNewName )
1483         SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
1484 }
1485 
Redo()1486 void ScUndoScenarioFlags::Redo()
1487 {
1488     ScDocument* pDoc = pDocShell->GetDocument();
1489 
1490     pDoc->RenameTab( nTab, aNewName );
1491     pDoc->SetScenarioData( nTab, aNewComment, aNewColor, nNewFlags );
1492 
1493     pDocShell->PostPaintGridAll();
1494     //  Der Tabellenname koennte in einer Formel vorkommen...
1495     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1496     if (pViewShell)
1497         pViewShell->UpdateInputHandler();
1498 
1499     if ( aOldName != aNewName )
1500         SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
1501 }
1502 
Repeat(SfxRepeatTarget &)1503 void ScUndoScenarioFlags::Repeat(SfxRepeatTarget& /* rTarget */)
1504 {
1505     //  Repeat macht keinen Sinn
1506 }
1507 
CanRepeat(SfxRepeatTarget &) const1508 sal_Bool ScUndoScenarioFlags::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1509 {
1510     return sal_False;
1511 }
1512 
1513 
1514 //---------------------------------------------------------------------------------
1515 //
1516 //      rename object
1517 //      (move to different file?)
1518 //
1519 
ScUndoRenameObject(ScDocShell * pNewDocShell,const String & rPN,const String & rON,const String & rNN)1520 ScUndoRenameObject::ScUndoRenameObject( ScDocShell* pNewDocShell, const String& rPN,
1521                                         const String& rON, const String& rNN ) :
1522     ScSimpleUndo( pNewDocShell ),
1523     aPersistName( rPN ),
1524     aOldName    ( rON ),
1525     aNewName    ( rNN )
1526 {
1527 }
1528 
~ScUndoRenameObject()1529 ScUndoRenameObject::~ScUndoRenameObject()
1530 {
1531 }
1532 
GetComment() const1533 String ScUndoRenameObject::GetComment() const
1534 {
1535     //  string resource shared with title for dialog
1536     return String( ScResId(SCSTR_RENAMEOBJECT) );
1537 }
1538 
GetObject()1539 SdrObject* ScUndoRenameObject::GetObject()
1540 {
1541     ScDocument* pDoc = pDocShell->GetDocument();
1542     ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
1543     if ( pDrawLayer )
1544     {
1545         sal_uInt16 nCount = pDrawLayer->GetPageCount();
1546         for (sal_uInt16 nTab=0; nTab<nCount; nTab++)
1547         {
1548             SdrPage* pPage = pDrawLayer->GetPage(nTab);
1549             DBG_ASSERT(pPage,"Page ?");
1550 
1551             SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
1552             SdrObject* pObject = aIter.Next();
1553             while (pObject)
1554             {
1555                 if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
1556                         ((SdrOle2Obj*)pObject)->GetPersistName() == aPersistName )
1557                 {
1558                     return pObject;
1559                 }
1560 
1561                 pObject = aIter.Next();
1562             }
1563         }
1564     }
1565     DBG_ERROR("Object not found");
1566     return NULL;
1567 }
1568 
Undo()1569 void ScUndoRenameObject::Undo()
1570 {
1571     BeginUndo();
1572     SdrObject* pObj = GetObject();
1573     if ( pObj )
1574         pObj->SetName( aOldName );
1575     EndUndo();
1576 }
1577 
Redo()1578 void ScUndoRenameObject::Redo()
1579 {
1580     BeginRedo();
1581     SdrObject* pObj = GetObject();
1582     if ( pObj )
1583         pObj->SetName( aNewName );
1584     EndRedo();
1585 }
1586 
Repeat(SfxRepeatTarget &)1587 void ScUndoRenameObject::Repeat(SfxRepeatTarget& /* rTarget */)
1588 {
1589 }
1590 
CanRepeat(SfxRepeatTarget &) const1591 sal_Bool ScUndoRenameObject::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1592 {
1593     return sal_False;
1594 }
1595 
1596 // -----------------------------------------------------------------------
1597 //
1598 //      Switch sheet between left-to-right and right-to-left
1599 //
1600 
ScUndoLayoutRTL(ScDocShell * pShell,SCTAB nNewTab,sal_Bool bNewRTL)1601 ScUndoLayoutRTL::ScUndoLayoutRTL( ScDocShell* pShell, SCTAB nNewTab, sal_Bool bNewRTL ) :
1602     ScSimpleUndo( pShell ),
1603     nTab( nNewTab ),
1604     bRTL( bNewRTL )
1605 {
1606 }
1607 
~ScUndoLayoutRTL()1608 ScUndoLayoutRTL::~ScUndoLayoutRTL()
1609 {
1610 }
1611 
DoChange(sal_Bool bNew)1612 void ScUndoLayoutRTL::DoChange( sal_Bool bNew )
1613 {
1614     pDocShell->SetInUndo( sal_True );
1615 
1616     ScDocument* pDoc = pDocShell->GetDocument();
1617     pDoc->SetLayoutRTL( nTab, bNew );
1618 
1619     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1620     if (pViewShell)
1621         pViewShell->SetTabNo(nTab,sal_True);
1622 
1623     pDocShell->SetDocumentModified();
1624 
1625     pDocShell->SetInUndo( sal_False );
1626 }
1627 
Undo()1628 void ScUndoLayoutRTL::Undo()
1629 {
1630     DoChange(!bRTL);
1631 }
1632 
Redo()1633 void ScUndoLayoutRTL::Redo()
1634 {
1635     DoChange(bRTL);
1636 }
1637 
Repeat(SfxRepeatTarget & rTarget)1638 void ScUndoLayoutRTL::Repeat(SfxRepeatTarget& rTarget)
1639 {
1640     if (rTarget.ISA(ScTabViewTarget))
1641         ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
1642             Execute( FID_TAB_RTL, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
1643 }
1644 
CanRepeat(SfxRepeatTarget & rTarget) const1645 sal_Bool ScUndoLayoutRTL::CanRepeat(SfxRepeatTarget& rTarget) const
1646 {
1647     return (rTarget.ISA(ScTabViewTarget));
1648 }
1649 
GetComment() const1650 String ScUndoLayoutRTL::GetComment() const
1651 {
1652     return ScGlobal::GetRscString( STR_UNDO_TAB_RTL );
1653 }
1654 
1655 
1656 
1657 // -----------------------------------------------------------------------
1658 //
1659 //      Set the grammar used for the sheet
1660 //
1661 
1662 //UNUSED2009-05 ScUndoSetGrammar::ScUndoSetGrammar( ScDocShell* pShell,
1663 //UNUSED2009-05                                     formula::FormulaGrammar::Grammar eGrammar ) :
1664 //UNUSED2009-05     ScSimpleUndo( pShell ),
1665 //UNUSED2009-05     meNewGrammar( eGrammar )
1666 //UNUSED2009-05 {
1667 //UNUSED2009-05     meOldGrammar = pDocShell->GetDocument()->GetGrammar();
1668 //UNUSED2009-05 }
1669 //UNUSED2009-05
1670 //UNUSED2009-05 __EXPORT ScUndoSetGrammar::~ScUndoSetGrammar()
1671 //UNUSED2009-05 {
1672 //UNUSED2009-05 }
1673 //UNUSED2009-05
1674 //UNUSED2009-05 void ScUndoSetGrammar::DoChange( formula::FormulaGrammar::Grammar eGrammar )
1675 //UNUSED2009-05 {
1676 //UNUSED2009-05     pDocShell->SetInUndo( sal_True );
1677 //UNUSED2009-05     ScDocument* pDoc = pDocShell->GetDocument();
1678 //UNUSED2009-05     pDoc->SetGrammar( eGrammar );
1679 //UNUSED2009-05     pDocShell->SetDocumentModified();
1680 //UNUSED2009-05     pDocShell->SetInUndo( sal_False );
1681 //UNUSED2009-05 }
1682 //UNUSED2009-05
1683 //UNUSED2009-05 void __EXPORT ScUndoSetGrammar::Undo()
1684 //UNUSED2009-05 {
1685 //UNUSED2009-05     DoChange( meOldGrammar );
1686 //UNUSED2009-05 }
1687 //UNUSED2009-05
1688 //UNUSED2009-05 void __EXPORT ScUndoSetGrammar::Redo()
1689 //UNUSED2009-05 {
1690 //UNUSED2009-05     DoChange( meNewGrammar );
1691 //UNUSED2009-05 }
1692 //UNUSED2009-05
1693 //UNUSED2009-05 void __EXPORT ScUndoSetGrammar::Repeat(SfxRepeatTarget& /* rTarget */)
1694 //UNUSED2009-05 {
1695 //UNUSED2009-05 #if 0
1696 //UNUSED2009-05 // erAck: 2006-09-07T23:00+0200  commented out in CWS scr1c1
1697 //UNUSED2009-05     if (rTarget.ISA(ScTabViewTarget))
1698 //UNUSED2009-05         ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
1699 //UNUSED2009-05             Execute( FID_TAB_USE_R1C1, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
1700 //UNUSED2009-05 #endif
1701 //UNUSED2009-05 }
1702 //UNUSED2009-05
1703 //UNUSED2009-05 sal_Bool __EXPORT ScUndoSetGrammar::CanRepeat(SfxRepeatTarget& rTarget) const
1704 //UNUSED2009-05 {
1705 //UNUSED2009-05     return (rTarget.ISA(ScTabViewTarget));
1706 //UNUSED2009-05 }
1707 //UNUSED2009-05
1708 //UNUSED2009-05 String __EXPORT ScUndoSetGrammar::GetComment() const
1709 //UNUSED2009-05 {
1710 //UNUSED2009-05     return ScGlobal::GetRscString( STR_UNDO_TAB_R1C1 );
1711 //UNUSED2009-05 }
1712 
1713