Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <sfx2/app.hxx>
21 : #include <sfx2/bindings.hxx>
22 : #include <sfx2/dispatch.hxx>
23 : #include <svl/smplhint.hxx>
24 :
25 : #include "undotab.hxx"
26 : #include "document.hxx"
27 : #include "docsh.hxx"
28 : #include "tabvwsh.hxx"
29 : #include "globstr.hrc"
30 : #include "global.hxx"
31 : #include "sc.hrc"
32 : #include "undoolk.hxx"
33 : #include "target.hxx"
34 : #include "uiitems.hxx"
35 : #include "prnsave.hxx"
36 : #include "printfun.hxx"
37 : #include "chgtrack.hxx"
38 : #include "tabprotection.hxx"
39 : #include "viewdata.hxx"
40 : #include "progress.hxx"
41 : #include "markdata.hxx"
42 :
43 : // for ScUndoRenameObject - might me moved to another file later
44 : #include <svx/svditer.hxx>
45 : #include <svx/svdoole2.hxx>
46 : #include <svx/svdpage.hxx>
47 : #include "drwlayer.hxx"
48 : #include "scresid.hxx"
49 :
50 : #include <vector>
51 :
52 : extern sal_Bool bDrawIsInUndo; // somewhere as member!
53 :
54 : using namespace com::sun::star;
55 : using ::com::sun::star::uno::Sequence;
56 : using ::rtl::OUString;
57 : using ::std::auto_ptr;
58 : using ::std::vector;
59 : using ::boost::shared_ptr;
60 :
61 0 : TYPEINIT1(ScUndoInsertTab, SfxUndoAction);
62 0 : TYPEINIT1(ScUndoInsertTables, SfxUndoAction);
63 0 : TYPEINIT1(ScUndoDeleteTab, SfxUndoAction);
64 0 : TYPEINIT1(ScUndoRenameTab, SfxUndoAction);
65 0 : TYPEINIT1(ScUndoMoveTab, SfxUndoAction);
66 0 : TYPEINIT1(ScUndoCopyTab, SfxUndoAction);
67 0 : TYPEINIT1(ScUndoMakeScenario, SfxUndoAction);
68 0 : TYPEINIT1(ScUndoImportTab, SfxUndoAction);
69 0 : TYPEINIT1(ScUndoRemoveLink, SfxUndoAction);
70 0 : TYPEINIT1(ScUndoShowHideTab, SfxUndoAction);
71 0 : TYPEINIT1(ScUndoPrintRange, SfxUndoAction);
72 0 : TYPEINIT1(ScUndoScenarioFlags, SfxUndoAction);
73 0 : TYPEINIT1(ScUndoRenameObject, SfxUndoAction);
74 0 : TYPEINIT1(ScUndoLayoutRTL, SfxUndoAction);
75 0 : TYPEINIT1(ScUndoTabColor, SfxUndoAction);
76 :
77 0 : ScUndoInsertTab::ScUndoInsertTab( ScDocShell* pNewDocShell,
78 : SCTAB nTabNum,
79 : sal_Bool bApp,
80 : const String& rNewName) :
81 : ScSimpleUndo( pNewDocShell ),
82 : sNewName( rNewName ),
83 : pDrawUndo( NULL ),
84 : nTab( nTabNum ),
85 0 : bAppend( bApp )
86 : {
87 0 : pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
88 0 : SetChangeTrack();
89 0 : }
90 :
91 0 : ScUndoInsertTab::~ScUndoInsertTab()
92 : {
93 0 : DeleteSdrUndoAction( pDrawUndo );
94 0 : }
95 :
96 0 : rtl::OUString ScUndoInsertTab::GetComment() const
97 : {
98 0 : if (bAppend)
99 0 : return ScGlobal::GetRscString( STR_UNDO_APPEND_TAB );
100 : else
101 0 : return ScGlobal::GetRscString( STR_UNDO_INSERT_TAB );
102 : }
103 :
104 0 : void ScUndoInsertTab::SetChangeTrack()
105 : {
106 0 : ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
107 0 : if ( pChangeTrack )
108 : {
109 0 : ScRange aRange( 0, 0, nTab, MAXCOL, MAXROW, nTab );
110 0 : pChangeTrack->AppendInsert( aRange );
111 0 : nEndChangeAction = pChangeTrack->GetActionMax();
112 : }
113 : else
114 0 : nEndChangeAction = 0;
115 0 : }
116 :
117 0 : void ScUndoInsertTab::Undo()
118 : {
119 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
120 0 : pViewShell->SetTabNo(nTab);
121 :
122 0 : pDocShell->SetInUndo( sal_True ); //! BeginUndo
123 0 : bDrawIsInUndo = sal_True;
124 0 : pViewShell->DeleteTable( nTab, false );
125 0 : bDrawIsInUndo = false;
126 0 : pDocShell->SetInUndo( false ); //! EndUndo
127 :
128 0 : DoSdrUndoAction( pDrawUndo, pDocShell->GetDocument() );
129 :
130 0 : ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
131 0 : if ( pChangeTrack )
132 0 : pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
133 :
134 : // SetTabNo(...,sal_True) for all views to sync with drawing layer pages
135 0 : pDocShell->Broadcast( SfxSimpleHint( SC_HINT_FORCESETTAB ) );
136 0 : }
137 :
138 0 : void ScUndoInsertTab::Redo()
139 : {
140 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
141 :
142 0 : RedoSdrUndoAction( pDrawUndo ); // Draw Redo first
143 :
144 0 : pDocShell->SetInUndo( sal_True ); //! BeginRedo
145 0 : bDrawIsInUndo = sal_True;
146 0 : if (bAppend)
147 0 : pViewShell->AppendTable( sNewName, false );
148 : else
149 : {
150 0 : pViewShell->SetTabNo(nTab);
151 0 : pViewShell->InsertTable( sNewName, nTab, false );
152 : }
153 0 : bDrawIsInUndo = false;
154 0 : pDocShell->SetInUndo( false ); //! EndRedo
155 :
156 0 : SetChangeTrack();
157 0 : }
158 :
159 0 : void ScUndoInsertTab::Repeat(SfxRepeatTarget& rTarget)
160 : {
161 0 : if (rTarget.ISA(ScTabViewTarget))
162 0 : ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
163 0 : Execute(FID_INS_TABLE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
164 0 : }
165 :
166 0 : sal_Bool ScUndoInsertTab::CanRepeat(SfxRepeatTarget& rTarget) const
167 : {
168 0 : return (rTarget.ISA(ScTabViewTarget));
169 : }
170 :
171 0 : ScUndoInsertTables::ScUndoInsertTables( ScDocShell* pNewDocShell,
172 : SCTAB nTabNum,
173 : std::vector<rtl::OUString>& newNameList) :
174 : ScSimpleUndo( pNewDocShell ),
175 : pDrawUndo( NULL ),
176 : aNameList( newNameList ),
177 0 : nTab( nTabNum )
178 : {
179 0 : pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
180 :
181 0 : SetChangeTrack();
182 0 : }
183 :
184 0 : ScUndoInsertTables::~ScUndoInsertTables()
185 : {
186 0 : DeleteSdrUndoAction( pDrawUndo );
187 0 : }
188 :
189 0 : rtl::OUString ScUndoInsertTables::GetComment() const
190 : {
191 0 : return ScGlobal::GetRscString( STR_UNDO_INSERT_TAB );
192 : }
193 :
194 0 : void ScUndoInsertTables::SetChangeTrack()
195 : {
196 0 : ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
197 0 : if ( pChangeTrack )
198 : {
199 0 : nStartChangeAction = pChangeTrack->GetActionMax() + 1;
200 0 : nEndChangeAction = 0;
201 0 : ScRange aRange( 0, 0, nTab, MAXCOL, MAXROW, nTab );
202 0 : for( size_t i = 0; i < aNameList.size(); i++ )
203 : {
204 0 : aRange.aStart.SetTab( sal::static_int_cast<SCTAB>( nTab + i ) );
205 0 : aRange.aEnd.SetTab( sal::static_int_cast<SCTAB>( nTab + i ) );
206 0 : pChangeTrack->AppendInsert( aRange );
207 0 : nEndChangeAction = pChangeTrack->GetActionMax();
208 : }
209 : }
210 : else
211 0 : nStartChangeAction = nEndChangeAction = 0;
212 0 : }
213 :
214 0 : void ScUndoInsertTables::Undo()
215 : {
216 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
217 0 : pViewShell->SetTabNo(nTab);
218 :
219 0 : pDocShell->SetInUndo( sal_True ); //! BeginUndo
220 0 : bDrawIsInUndo = sal_True;
221 :
222 0 : pViewShell->DeleteTables( nTab, static_cast<SCTAB>(aNameList.size()) );
223 :
224 0 : bDrawIsInUndo = false;
225 0 : pDocShell->SetInUndo( false ); //! EndUndo
226 :
227 0 : DoSdrUndoAction( pDrawUndo, pDocShell->GetDocument() );
228 :
229 0 : ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
230 0 : if ( pChangeTrack )
231 0 : pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
232 :
233 : // SetTabNo(...,sal_True) for all views to sync with drawing layer pages
234 0 : pDocShell->Broadcast( SfxSimpleHint( SC_HINT_FORCESETTAB ) );
235 0 : }
236 :
237 0 : void ScUndoInsertTables::Redo()
238 : {
239 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
240 :
241 0 : RedoSdrUndoAction( pDrawUndo ); // Draw Redo first
242 :
243 0 : pDocShell->SetInUndo( sal_True ); //! BeginRedo
244 0 : bDrawIsInUndo = sal_True;
245 0 : pViewShell->SetTabNo(nTab);
246 0 : pViewShell->InsertTables( aNameList, nTab, static_cast<SCTAB>(aNameList.size()),false );
247 :
248 0 : bDrawIsInUndo = false;
249 0 : pDocShell->SetInUndo( false ); //! EndRedo
250 :
251 0 : SetChangeTrack();
252 0 : }
253 :
254 0 : void ScUndoInsertTables::Repeat(SfxRepeatTarget& rTarget)
255 : {
256 0 : if (rTarget.ISA(ScTabViewTarget))
257 0 : ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
258 0 : Execute(FID_INS_TABLE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
259 0 : }
260 :
261 0 : sal_Bool ScUndoInsertTables::CanRepeat(SfxRepeatTarget& rTarget) const
262 : {
263 0 : return (rTarget.ISA(ScTabViewTarget));
264 : }
265 :
266 0 : ScUndoDeleteTab::ScUndoDeleteTab( ScDocShell* pNewDocShell, const vector<SCTAB> &aTab,
267 : ScDocument* pUndoDocument, ScRefUndoData* pRefData ) :
268 0 : ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST )
269 : {
270 0 : theTabs.insert(theTabs.end(), aTab.begin(), aTab.end() );
271 0 : SetChangeTrack();
272 0 : }
273 :
274 0 : ScUndoDeleteTab::~ScUndoDeleteTab()
275 : {
276 0 : theTabs.clear();
277 0 : }
278 :
279 0 : rtl::OUString ScUndoDeleteTab::GetComment() const
280 : {
281 0 : return ScGlobal::GetRscString( STR_UNDO_DELETE_TAB );
282 : }
283 :
284 0 : void ScUndoDeleteTab::SetChangeTrack()
285 : {
286 0 : ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
287 0 : if ( pChangeTrack )
288 : {
289 : sal_uLong nTmpChangeAction;
290 0 : nStartChangeAction = pChangeTrack->GetActionMax() + 1;
291 0 : nEndChangeAction = 0;
292 0 : ScRange aRange( 0, 0, 0, MAXCOL, MAXROW, 0 );
293 0 : for ( unsigned int i = 0; i < theTabs.size(); ++i )
294 : {
295 0 : aRange.aStart.SetTab( theTabs[i] );
296 0 : aRange.aEnd.SetTab( theTabs[i] );
297 : pChangeTrack->AppendDeleteRange( aRange, pRefUndoDoc,
298 0 : nTmpChangeAction, nEndChangeAction, (short) i );
299 : }
300 : }
301 : else
302 0 : nStartChangeAction = nEndChangeAction = 0;
303 0 : }
304 :
305 0 : static SCTAB lcl_GetVisibleTabBefore( ScDocument& rDoc, SCTAB nTab )
306 : {
307 0 : while ( nTab > 0 && !rDoc.IsVisible( nTab ) )
308 0 : --nTab;
309 :
310 0 : return nTab;
311 : }
312 :
313 0 : void ScUndoDeleteTab::Undo()
314 : {
315 0 : BeginUndo();
316 0 : unsigned int i=0;
317 0 : ScDocument* pDoc = pDocShell->GetDocument();
318 :
319 0 : sal_Bool bLink = false;
320 0 : rtl::OUString aName;
321 :
322 0 : for(i=0; i<theTabs.size(); ++i)
323 : {
324 0 : SCTAB nTab = theTabs[i];
325 0 : pRefUndoDoc->GetName( nTab, aName );
326 :
327 0 : bDrawIsInUndo = sal_True;
328 0 : sal_Bool bOk = pDoc->InsertTab( nTab, aName );
329 0 : bDrawIsInUndo = false;
330 0 : if (bOk)
331 : {
332 0 : pRefUndoDoc->CopyToDocument(0,0,nTab, MAXCOL,MAXROW,nTab, IDF_ALL,false, pDoc );
333 :
334 0 : rtl::OUString aOldName;
335 0 : pRefUndoDoc->GetName( nTab, aOldName );
336 0 : pDoc->RenameTab( nTab, aOldName, false );
337 0 : if (pRefUndoDoc->IsLinked(nTab))
338 : {
339 0 : pDoc->SetLink( nTab, pRefUndoDoc->GetLinkMode(nTab), pRefUndoDoc->GetLinkDoc(nTab),
340 : pRefUndoDoc->GetLinkFlt(nTab), pRefUndoDoc->GetLinkOpt(nTab),
341 0 : pRefUndoDoc->GetLinkTab(nTab), pRefUndoDoc->GetLinkRefreshDelay(nTab) );
342 0 : bLink = sal_True;
343 : }
344 :
345 0 : if ( pRefUndoDoc->IsScenario(nTab) )
346 : {
347 0 : pDoc->SetScenario( nTab, sal_True );
348 0 : rtl::OUString aComment;
349 0 : Color aColor;
350 : sal_uInt16 nScenFlags;
351 0 : pRefUndoDoc->GetScenarioData( nTab, aComment, aColor, nScenFlags );
352 0 : pDoc->SetScenarioData( nTab, aComment, aColor, nScenFlags );
353 0 : sal_Bool bActive = pRefUndoDoc->IsActiveScenario( nTab );
354 0 : pDoc->SetActiveScenario( nTab, bActive );
355 : }
356 0 : pDoc->SetVisible( nTab, pRefUndoDoc->IsVisible( nTab ) );
357 0 : pDoc->SetTabBgColor( nTab, pRefUndoDoc->GetTabBgColor(nTab) );
358 0 : pDoc->SetSheetEvents( nTab, pRefUndoDoc->GetSheetEvents( nTab ) );
359 :
360 0 : if ( pRefUndoDoc->IsTabProtected( nTab ) )
361 0 : pDoc->SetTabProtection(nTab, pRefUndoDoc->GetTabProtection(nTab));
362 : }
363 : }
364 0 : if (bLink)
365 : {
366 0 : pDocShell->UpdateLinks(); // update Link Manager
367 : }
368 :
369 0 : EndUndo(); // Draw-Undo has to be called before Broadcast!
370 :
371 0 : ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
372 0 : if ( pChangeTrack )
373 0 : pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
374 :
375 0 : for(i=0; i<theTabs.size(); ++i)
376 : {
377 0 : pDocShell->Broadcast( ScTablesHint( SC_TAB_INSERTED, theTabs[i]) );
378 : }
379 0 : SfxApplication* pSfxApp = SFX_APP(); // Navigator
380 0 : pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
381 0 : pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
382 0 : pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
383 :
384 0 : pDocShell->PostPaint(0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_ALL ); // incl. extras
385 :
386 : // not ShowTable due to SetTabNo(..., sal_True):
387 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
388 0 : if (pViewShell)
389 0 : pViewShell->SetTabNo( lcl_GetVisibleTabBefore( *pDoc, theTabs[0] ), true );
390 0 : }
391 :
392 0 : void ScUndoDeleteTab::Redo()
393 : {
394 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
395 0 : pViewShell->SetTabNo( lcl_GetVisibleTabBefore( *pDocShell->GetDocument(), theTabs.front() ) );
396 :
397 0 : RedoSdrUndoAction( pDrawUndo ); // Draw Redo first
398 :
399 0 : pDocShell->SetInUndo( sal_True ); //! BeginRedo
400 0 : bDrawIsInUndo = sal_True;
401 0 : pViewShell->DeleteTables( theTabs, false );
402 0 : bDrawIsInUndo = false;
403 0 : pDocShell->SetInUndo( sal_True ); //! EndRedo
404 :
405 0 : SetChangeTrack();
406 :
407 : // SetTabNo(...,sal_True) for all views to sync with drawing layer pages
408 0 : pDocShell->Broadcast( SfxSimpleHint( SC_HINT_FORCESETTAB ) );
409 0 : }
410 :
411 0 : void ScUndoDeleteTab::Repeat(SfxRepeatTarget& rTarget)
412 : {
413 0 : if (rTarget.ISA(ScTabViewTarget))
414 : {
415 0 : ScTabViewShell* pViewShell = ((ScTabViewTarget&)rTarget).GetViewShell();
416 0 : pViewShell->DeleteTable( pViewShell->GetViewData()->GetTabNo(), sal_True );
417 : }
418 0 : }
419 :
420 0 : sal_Bool ScUndoDeleteTab::CanRepeat(SfxRepeatTarget& rTarget) const
421 : {
422 0 : return (rTarget.ISA(ScTabViewTarget));
423 : }
424 :
425 1 : ScUndoRenameTab::ScUndoRenameTab( ScDocShell* pNewDocShell,
426 : SCTAB nT,
427 : const String& rOldName,
428 : const String& rNewName) :
429 : ScSimpleUndo( pNewDocShell ),
430 1 : nTab ( nT )
431 : {
432 1 : sOldName = rOldName;
433 1 : sNewName = rNewName;
434 1 : }
435 :
436 0 : ScUndoRenameTab::~ScUndoRenameTab()
437 : {
438 0 : }
439 :
440 0 : rtl::OUString ScUndoRenameTab::GetComment() const
441 : {
442 0 : return ScGlobal::GetRscString( STR_UNDO_RENAME_TAB );
443 : }
444 :
445 2 : void ScUndoRenameTab::DoChange( SCTAB nTabP, const String& rName ) const
446 : {
447 2 : ScDocument* pDoc = pDocShell->GetDocument();
448 2 : pDoc->RenameTab( nTabP, rName );
449 :
450 2 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); // Navigator
451 :
452 2 : pDocShell->PostPaintGridAll();
453 2 : pDocShell->PostPaintExtras();
454 2 : pDocShell->PostDataChanged();
455 :
456 : // The sheet name might be used in a formula ...
457 2 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
458 2 : if (pViewShell)
459 0 : pViewShell->UpdateInputHandler();
460 2 : }
461 :
462 1 : void ScUndoRenameTab::Undo()
463 : {
464 1 : DoChange(nTab, sOldName);
465 1 : }
466 :
467 1 : void ScUndoRenameTab::Redo()
468 : {
469 1 : DoChange(nTab, sNewName);
470 1 : }
471 :
472 0 : void ScUndoRenameTab::Repeat(SfxRepeatTarget& /* rTarget */)
473 : {
474 : // makes no sense
475 0 : }
476 :
477 0 : sal_Bool ScUndoRenameTab::CanRepeat(SfxRepeatTarget& /* rTarget */) const
478 : {
479 0 : return false;
480 : }
481 :
482 0 : ScUndoMoveTab::ScUndoMoveTab(
483 : ScDocShell* pNewDocShell, vector<SCTAB>* pOldTabs, vector<SCTAB>* pNewTabs,
484 : vector<OUString>* pOldNames, vector<OUString>* pNewNames) :
485 : ScSimpleUndo( pNewDocShell ),
486 : mpOldTabs(pOldTabs), mpNewTabs(pNewTabs),
487 0 : mpOldNames(pOldNames), mpNewNames(pNewNames)
488 : {
489 0 : if (mpOldNames && mpOldTabs->size() != mpOldNames->size())
490 : // The sizes differ. Something is wrong.
491 0 : mpOldNames.reset();
492 :
493 0 : if (mpNewNames && mpNewTabs->size() != mpNewNames->size())
494 : // The sizes differ. Something is wrong.
495 0 : mpNewNames.reset();
496 0 : }
497 :
498 0 : ScUndoMoveTab::~ScUndoMoveTab()
499 : {
500 0 : }
501 :
502 0 : rtl::OUString ScUndoMoveTab::GetComment() const
503 : {
504 0 : return ScGlobal::GetRscString( STR_UNDO_MOVE_TAB );
505 : }
506 :
507 0 : void ScUndoMoveTab::DoChange( sal_Bool bUndo ) const
508 : {
509 0 : ScDocument* pDoc = pDocShell->GetDocument();
510 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
511 :
512 0 : if (bUndo) // UnDo
513 : {
514 0 : size_t i = mpNewTabs->size();
515 : ScProgress* pProgress = new ScProgress(pDocShell , ScGlobal::GetRscString(STR_UNDO_MOVE_TAB),
516 0 : i * pDoc->GetCodeCount());
517 0 : for (; i > 0; --i)
518 : {
519 0 : SCTAB nDestTab = (*mpNewTabs)[i-1];
520 0 : SCTAB nOldTab = (*mpOldTabs)[i-1];
521 0 : if (nDestTab > MAXTAB) // appended ?
522 0 : nDestTab = pDoc->GetTableCount() - 1;
523 :
524 0 : pDoc->MoveTab( nDestTab, nOldTab, pProgress );
525 0 : pViewShell->GetViewData()->MoveTab( nDestTab, nOldTab );
526 0 : pViewShell->SetTabNo( nOldTab, true );
527 0 : if (mpOldNames)
528 : {
529 0 : const OUString& rOldName = (*mpOldNames)[i-1];
530 0 : pDoc->RenameTab(nOldTab, rOldName);
531 : }
532 : }
533 0 : delete pProgress;
534 : }
535 : else
536 : {
537 0 : size_t n = mpNewTabs->size();
538 : ScProgress* pProgress = new ScProgress(pDocShell , ScGlobal::GetRscString(STR_UNDO_MOVE_TAB),
539 0 : n * pDoc->GetCodeCount());
540 0 : for (size_t i = 0; i < n; ++i)
541 : {
542 0 : SCTAB nDestTab = (*mpNewTabs)[i];
543 0 : SCTAB nNewTab = nDestTab;
544 0 : SCTAB nOldTab = (*mpOldTabs)[i];
545 0 : if (nDestTab > MAXTAB) // appended ?
546 0 : nDestTab = pDoc->GetTableCount() - 1;
547 :
548 0 : pDoc->MoveTab( nOldTab, nNewTab, pProgress );
549 0 : pViewShell->GetViewData()->MoveTab( nOldTab, nNewTab );
550 0 : pViewShell->SetTabNo( nDestTab, true );
551 0 : if (mpNewNames)
552 : {
553 0 : const OUString& rNewName = (*mpNewNames)[i];
554 0 : pDoc->RenameTab(nNewTab, rNewName);
555 : }
556 : }
557 0 : delete pProgress;
558 : }
559 :
560 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); // Navigator
561 :
562 0 : pDocShell->PostPaintGridAll();
563 0 : pDocShell->PostPaintExtras();
564 0 : pDocShell->PostDataChanged();
565 0 : }
566 :
567 0 : void ScUndoMoveTab::Undo()
568 : {
569 0 : DoChange( sal_True );
570 0 : }
571 :
572 0 : void ScUndoMoveTab::Redo()
573 : {
574 0 : DoChange( false );
575 0 : }
576 :
577 0 : void ScUndoMoveTab::Repeat(SfxRepeatTarget& /* rTarget */)
578 : {
579 : // No Repeat ! ? !
580 0 : }
581 :
582 0 : sal_Bool ScUndoMoveTab::CanRepeat(SfxRepeatTarget& /* rTarget */) const
583 : {
584 0 : return false;
585 : }
586 :
587 0 : ScUndoCopyTab::ScUndoCopyTab(
588 : ScDocShell* pNewDocShell,
589 : vector<SCTAB>* pOldTabs, vector<SCTAB>* pNewTabs,
590 : vector<OUString>* pNewNames) :
591 : ScSimpleUndo( pNewDocShell ),
592 : mpOldTabs(pOldTabs),
593 : mpNewTabs(pNewTabs),
594 : mpNewNames(pNewNames),
595 0 : pDrawUndo( NULL )
596 : {
597 0 : pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
598 :
599 0 : if (mpNewNames && mpNewTabs->size() != mpNewNames->size())
600 : // The sizes differ. Something is wrong.
601 0 : mpNewNames.reset();
602 0 : }
603 :
604 0 : ScUndoCopyTab::~ScUndoCopyTab()
605 : {
606 0 : DeleteSdrUndoAction( pDrawUndo );
607 0 : }
608 :
609 0 : rtl::OUString ScUndoCopyTab::GetComment() const
610 : {
611 0 : return ScGlobal::GetRscString( STR_UNDO_COPY_TAB );
612 : }
613 :
614 0 : void ScUndoCopyTab::DoChange() const
615 : {
616 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
617 :
618 0 : if (pViewShell)
619 0 : pViewShell->SetTabNo((*mpOldTabs)[0],true);
620 :
621 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); // Navigator
622 :
623 0 : pDocShell->PostPaintGridAll();
624 0 : pDocShell->PostPaintExtras();
625 0 : pDocShell->PostDataChanged();
626 0 : }
627 :
628 0 : void ScUndoCopyTab::Undo()
629 : {
630 0 : ScDocument* pDoc = pDocShell->GetDocument();
631 :
632 0 : DoSdrUndoAction( pDrawUndo, pDoc ); // before the sheets are deleted
633 :
634 0 : vector<SCTAB>::const_reverse_iterator itr, itrEnd = mpNewTabs->rend();
635 0 : for (itr = mpNewTabs->rbegin(); itr != itrEnd; ++itr)
636 : {
637 0 : SCTAB nDestTab = *itr;
638 0 : if (nDestTab > MAXTAB) // append?
639 0 : nDestTab = pDoc->GetTableCount() - 1;
640 :
641 0 : bDrawIsInUndo = sal_True;
642 0 : pDoc->DeleteTab(nDestTab);
643 0 : bDrawIsInUndo = false;
644 : }
645 :
646 : // ScTablesHint broadcasts after all sheets have been deleted,
647 : // so sheets and draw pages are in sync!
648 :
649 0 : for (itr = mpNewTabs->rbegin(); itr != itrEnd; ++itr)
650 : {
651 0 : SCTAB nDestTab = *itr;
652 0 : if (nDestTab > MAXTAB) // append?
653 0 : nDestTab = pDoc->GetTableCount() - 1;
654 :
655 0 : pDocShell->Broadcast( ScTablesHint( SC_TAB_DELETED, nDestTab ) );
656 : }
657 :
658 0 : DoChange();
659 0 : }
660 :
661 0 : void ScUndoCopyTab::Redo()
662 : {
663 0 : ScDocument* pDoc = pDocShell->GetDocument();
664 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
665 :
666 0 : SCTAB nDestTab = 0;
667 0 : for (size_t i = 0, n = mpNewTabs->size(); i < n; ++i)
668 : {
669 0 : nDestTab = (*mpNewTabs)[i];
670 0 : SCTAB nNewTab = nDestTab;
671 0 : SCTAB nOldTab = (*mpOldTabs)[i];
672 0 : if (nDestTab > MAXTAB) // appended ?
673 0 : nDestTab = pDoc->GetTableCount() - 1;
674 :
675 0 : bDrawIsInUndo = sal_True;
676 0 : pDoc->CopyTab( nOldTab, nNewTab );
677 0 : bDrawIsInUndo = false;
678 :
679 0 : pViewShell->GetViewData()->MoveTab( nOldTab, nNewTab );
680 :
681 0 : SCTAB nAdjSource = nOldTab;
682 0 : if ( nNewTab <= nOldTab )
683 0 : ++nAdjSource; // new position of source table after CopyTab
684 :
685 0 : if ( pDoc->IsScenario(nAdjSource) )
686 : {
687 0 : pDoc->SetScenario(nNewTab, sal_True );
688 0 : rtl::OUString aComment;
689 0 : Color aColor;
690 : sal_uInt16 nScenFlags;
691 0 : pDoc->GetScenarioData(nAdjSource, aComment, aColor, nScenFlags );
692 0 : pDoc->SetScenarioData(nNewTab, aComment, aColor, nScenFlags );
693 0 : sal_Bool bActive = pDoc->IsActiveScenario(nAdjSource);
694 0 : pDoc->SetActiveScenario(nNewTab, bActive );
695 0 : sal_Bool bVisible=pDoc->IsVisible(nAdjSource);
696 0 : pDoc->SetVisible(nNewTab,bVisible );
697 : }
698 :
699 0 : if ( pDoc->IsTabProtected( nAdjSource ) )
700 0 : pDoc->CopyTabProtection(nAdjSource, nNewTab);
701 :
702 0 : if (mpNewNames)
703 : {
704 0 : const OUString& rName = (*mpNewNames)[i];
705 0 : pDoc->RenameTab(nNewTab, rName);
706 : }
707 : }
708 :
709 0 : RedoSdrUndoAction( pDrawUndo ); // after the sheets are inserted
710 :
711 0 : pViewShell->SetTabNo( nDestTab, sal_True ); // after draw-undo
712 :
713 0 : DoChange();
714 :
715 0 : }
716 :
717 0 : void ScUndoCopyTab::Repeat(SfxRepeatTarget& /* rTarget */)
718 : {
719 : // no Repeat ! ? !
720 0 : }
721 :
722 0 : sal_Bool ScUndoCopyTab::CanRepeat(SfxRepeatTarget& /* rTarget */) const
723 : {
724 0 : return false;
725 : }
726 :
727 :
728 1 : ScUndoTabColor::ScUndoTabColor(
729 : ScDocShell* pNewDocShell, SCTAB nT, const Color& aOTabBgColor, const Color& aNTabBgColor) :
730 1 : ScSimpleUndo( pNewDocShell )
731 : {
732 1 : ScUndoTabColorInfo aInfo(nT);
733 1 : aInfo.maOldTabBgColor = aOTabBgColor;
734 1 : aInfo.maNewTabBgColor = aNTabBgColor;
735 1 : aTabColorList.push_back(aInfo);
736 1 : }
737 :
738 0 : ScUndoTabColor::ScUndoTabColor(
739 : ScDocShell* pNewDocShell,
740 : const ScUndoTabColorInfo::List& rUndoTabColorList) :
741 : ScSimpleUndo(pNewDocShell),
742 0 : aTabColorList(rUndoTabColorList)
743 : {
744 0 : }
745 :
746 0 : ScUndoTabColor::~ScUndoTabColor()
747 : {
748 0 : }
749 :
750 0 : rtl::OUString ScUndoTabColor::GetComment() const
751 : {
752 0 : if (aTabColorList.size() > 1)
753 0 : return ScGlobal::GetRscString(STR_UNDO_SET_MULTI_TAB_BG_COLOR);
754 0 : return ScGlobal::GetRscString(STR_UNDO_SET_TAB_BG_COLOR);
755 : }
756 :
757 2 : void ScUndoTabColor::DoChange(bool bUndoType) const
758 : {
759 2 : ScDocument* pDoc = pDocShell->GetDocument();
760 2 : if (!pDoc)
761 2 : return;
762 :
763 2 : size_t nTabColorCount = aTabColorList.size();
764 4 : for (size_t i = 0; i < nTabColorCount; ++i)
765 : {
766 2 : const ScUndoTabColorInfo& rTabColor = aTabColorList[i];
767 : pDoc->SetTabBgColor(rTabColor.mnTabId,
768 2 : bUndoType ? rTabColor.maOldTabBgColor : rTabColor.maNewTabBgColor);
769 : }
770 :
771 2 : pDocShell->PostPaintExtras();
772 2 : ScDocShellModificator aModificator( *pDocShell );
773 2 : aModificator.SetDocumentModified();
774 : }
775 :
776 1 : void ScUndoTabColor::Undo()
777 : {
778 1 : DoChange(true);
779 1 : }
780 :
781 1 : void ScUndoTabColor::Redo()
782 : {
783 1 : DoChange(false);
784 1 : }
785 :
786 0 : void ScUndoTabColor::Repeat(SfxRepeatTarget& /* rTarget */)
787 : {
788 : // makes no sense
789 0 : }
790 :
791 0 : sal_Bool ScUndoTabColor::CanRepeat(SfxRepeatTarget& /* rTarget */) const
792 : {
793 0 : return false;
794 : }
795 :
796 0 : ScUndoMakeScenario::ScUndoMakeScenario( ScDocShell* pNewDocShell,
797 : SCTAB nSrc, SCTAB nDest,
798 : const String& rN, const String& rC,
799 : const Color& rCol, sal_uInt16 nF,
800 : const ScMarkData& rMark ) :
801 : ScSimpleUndo( pNewDocShell ),
802 0 : mpMarkData(new ScMarkData(rMark)),
803 : nSrcTab( nSrc ),
804 : nDestTab( nDest ),
805 : aName( rN ),
806 : aComment( rC ),
807 : aColor( rCol ),
808 : nFlags( nF ),
809 0 : pDrawUndo( NULL )
810 : {
811 0 : pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
812 0 : }
813 :
814 0 : ScUndoMakeScenario::~ScUndoMakeScenario()
815 : {
816 0 : DeleteSdrUndoAction( pDrawUndo );
817 0 : }
818 :
819 0 : rtl::OUString ScUndoMakeScenario::GetComment() const
820 : {
821 0 : return ScGlobal::GetRscString( STR_UNDO_MAKESCENARIO );
822 : }
823 :
824 0 : void ScUndoMakeScenario::Undo()
825 : {
826 0 : ScDocument* pDoc = pDocShell->GetDocument();
827 :
828 0 : pDocShell->SetInUndo( sal_True );
829 0 : bDrawIsInUndo = sal_True;
830 0 : pDoc->DeleteTab( nDestTab );
831 0 : bDrawIsInUndo = false;
832 0 : pDocShell->SetInUndo( false );
833 :
834 0 : DoSdrUndoAction( pDrawUndo, pDoc );
835 :
836 0 : pDocShell->PostPaint(0,0,nDestTab,MAXCOL,MAXROW,MAXTAB, PAINT_ALL);
837 0 : pDocShell->PostDataChanged();
838 :
839 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
840 0 : if (pViewShell)
841 0 : pViewShell->SetTabNo( nSrcTab, sal_True );
842 :
843 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
844 :
845 : // SetTabNo(...,sal_True) for all views to sync with drawing layer pages
846 0 : pDocShell->Broadcast( SfxSimpleHint( SC_HINT_FORCESETTAB ) );
847 0 : }
848 :
849 0 : void ScUndoMakeScenario::Redo()
850 : {
851 0 : SetViewMarkData(*mpMarkData);
852 :
853 0 : RedoSdrUndoAction( pDrawUndo ); // Draw Redo first
854 :
855 0 : pDocShell->SetInUndo( sal_True );
856 0 : bDrawIsInUndo = sal_True;
857 :
858 0 : pDocShell->MakeScenario( nSrcTab, aName, aComment, aColor, nFlags, *mpMarkData, false );
859 :
860 0 : bDrawIsInUndo = false;
861 0 : pDocShell->SetInUndo( false );
862 :
863 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
864 0 : if (pViewShell)
865 0 : pViewShell->SetTabNo( nDestTab, sal_True );
866 :
867 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
868 0 : }
869 :
870 0 : void ScUndoMakeScenario::Repeat(SfxRepeatTarget& rTarget)
871 : {
872 0 : if (rTarget.ISA(ScTabViewTarget))
873 : {
874 0 : ((ScTabViewTarget&)rTarget).GetViewShell()->MakeScenario( aName, aComment, aColor, nFlags );
875 : }
876 0 : }
877 :
878 0 : sal_Bool ScUndoMakeScenario::CanRepeat(SfxRepeatTarget& rTarget) const
879 : {
880 0 : return (rTarget.ISA(ScTabViewTarget));
881 : }
882 :
883 0 : ScUndoImportTab::ScUndoImportTab( ScDocShell* pShell,
884 : SCTAB nNewTab, SCTAB nNewCount ) :
885 : ScSimpleUndo( pShell ),
886 : nTab( nNewTab ),
887 : nCount( nNewCount ),
888 : pRedoDoc( NULL ),
889 0 : pDrawUndo( NULL )
890 : {
891 0 : pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
892 0 : }
893 :
894 0 : ScUndoImportTab::~ScUndoImportTab()
895 : {
896 0 : delete pRedoDoc;
897 0 : DeleteSdrUndoAction( pDrawUndo );
898 0 : }
899 :
900 0 : rtl::OUString ScUndoImportTab::GetComment() const
901 : {
902 0 : return ScGlobal::GetRscString( STR_UNDO_INSERT_TAB );
903 : }
904 :
905 0 : void ScUndoImportTab::DoChange() const
906 : {
907 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
908 0 : ScDocument* pDoc = pDocShell->GetDocument();
909 0 : SCTAB nTabCount = pDoc->GetTableCount();
910 0 : if (pViewShell)
911 : {
912 0 : if(nTab<nTabCount)
913 : {
914 0 : pViewShell->SetTabNo(nTab,sal_True);
915 : }
916 : else
917 : {
918 0 : pViewShell->SetTabNo(nTab-1,sal_True);
919 : }
920 : }
921 :
922 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); // Navigator
923 : pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB,
924 0 : PAINT_GRID | PAINT_TOP | PAINT_LEFT | PAINT_EXTRAS );
925 0 : }
926 :
927 0 : void ScUndoImportTab::Undo()
928 : {
929 : // Inserted range names, etc.
930 :
931 : SCTAB i;
932 0 : ScDocument* pDoc = pDocShell->GetDocument();
933 0 : sal_Bool bMakeRedo = !pRedoDoc;
934 0 : if (bMakeRedo)
935 : {
936 0 : pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
937 0 : pRedoDoc->InitUndo( pDoc, nTab,nTab+nCount-1, sal_True,sal_True );
938 :
939 0 : rtl::OUString aOldName;
940 0 : for (i=0; i<nCount; i++)
941 : {
942 0 : SCTAB nTabPos=nTab+i;
943 :
944 0 : pDoc->CopyToDocument(0,0,nTabPos, MAXCOL,MAXROW,nTabPos, IDF_ALL,false, pRedoDoc );
945 0 : pDoc->GetName( nTabPos, aOldName );
946 0 : pRedoDoc->RenameTab( nTabPos, aOldName, false );
947 0 : pRedoDoc->SetTabBgColor( nTabPos, pDoc->GetTabBgColor(nTabPos) );
948 :
949 0 : if ( pDoc->IsScenario(nTabPos) )
950 : {
951 0 : pRedoDoc->SetScenario(nTabPos, sal_True );
952 0 : rtl::OUString aComment;
953 0 : Color aColor;
954 : sal_uInt16 nScenFlags;
955 0 : pDoc->GetScenarioData(nTabPos, aComment, aColor, nScenFlags );
956 0 : pRedoDoc->SetScenarioData(nTabPos, aComment, aColor, nScenFlags );
957 0 : sal_Bool bActive = pDoc->IsActiveScenario(nTabPos);
958 0 : pRedoDoc->SetActiveScenario(nTabPos, bActive );
959 0 : sal_Bool bVisible=pDoc->IsVisible(nTabPos);
960 0 : pRedoDoc->SetVisible(nTabPos,bVisible );
961 : }
962 :
963 0 : if ( pDoc->IsTabProtected( nTabPos ) )
964 0 : pRedoDoc->SetTabProtection(nTabPos, pDoc->GetTabProtection(nTabPos));
965 0 : }
966 :
967 : }
968 :
969 0 : DoSdrUndoAction( pDrawUndo, pDoc ); // before the sheets are deleted
970 :
971 0 : bDrawIsInUndo = sal_True;
972 0 : for (i=0; i<nCount; i++)
973 0 : pDoc->DeleteTab( nTab );
974 0 : bDrawIsInUndo = false;
975 :
976 0 : DoChange();
977 0 : }
978 :
979 0 : void ScUndoImportTab::Redo()
980 : {
981 0 : if (!pRedoDoc)
982 : {
983 : OSL_FAIL("Where is my Redo Document?");
984 0 : return;
985 : }
986 :
987 0 : ScDocument* pDoc = pDocShell->GetDocument();
988 0 : rtl::OUString aName;
989 : SCTAB i;
990 0 : for (i=0; i<nCount; i++) // first insert all sheets (#63304#)
991 : {
992 0 : SCTAB nTabPos=nTab+i;
993 0 : pRedoDoc->GetName(nTabPos,aName);
994 0 : bDrawIsInUndo = sal_True;
995 0 : pDoc->InsertTab(nTabPos,aName);
996 0 : bDrawIsInUndo = false;
997 : }
998 0 : for (i=0; i<nCount; i++) // then copy into inserted sheets
999 : {
1000 0 : SCTAB nTabPos=nTab+i;
1001 0 : pRedoDoc->CopyToDocument(0,0,nTabPos, MAXCOL,MAXROW,nTabPos, IDF_ALL,false, pDoc );
1002 0 : pDoc->SetTabBgColor( nTabPos, pRedoDoc->GetTabBgColor(nTabPos) );
1003 :
1004 0 : if ( pRedoDoc->IsScenario(nTabPos) )
1005 : {
1006 0 : pDoc->SetScenario(nTabPos, sal_True );
1007 0 : rtl::OUString aComment;
1008 0 : Color aColor;
1009 : sal_uInt16 nScenFlags;
1010 0 : pRedoDoc->GetScenarioData(nTabPos, aComment, aColor, nScenFlags );
1011 0 : pDoc->SetScenarioData(nTabPos, aComment, aColor, nScenFlags );
1012 0 : sal_Bool bActive = pRedoDoc->IsActiveScenario(nTabPos);
1013 0 : pDoc->SetActiveScenario(nTabPos, bActive );
1014 0 : sal_Bool bVisible=pRedoDoc->IsVisible(nTabPos);
1015 0 : pDoc->SetVisible(nTabPos,bVisible );
1016 : }
1017 :
1018 0 : if ( pRedoDoc->IsTabProtected( nTabPos ) )
1019 0 : pDoc->SetTabProtection(nTabPos, pRedoDoc->GetTabProtection(nTabPos));
1020 : }
1021 :
1022 0 : RedoSdrUndoAction( pDrawUndo ); // after the sheets are inserted
1023 :
1024 0 : DoChange();
1025 : }
1026 :
1027 0 : void ScUndoImportTab::Repeat(SfxRepeatTarget& rTarget)
1028 : {
1029 0 : if (rTarget.ISA(ScTabViewTarget))
1030 0 : ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
1031 0 : Execute(FID_INS_TABLE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
1032 0 : }
1033 :
1034 0 : sal_Bool ScUndoImportTab::CanRepeat(SfxRepeatTarget& rTarget) const
1035 : {
1036 0 : return (rTarget.ISA(ScTabViewTarget));
1037 : }
1038 :
1039 0 : ScUndoRemoveLink::ScUndoRemoveLink( ScDocShell* pShell, const String& rDoc ) :
1040 : ScSimpleUndo( pShell ),
1041 : aDocName( rDoc ),
1042 0 : nCount( 0 )
1043 : {
1044 0 : ScDocument* pDoc = pDocShell->GetDocument();
1045 0 : SCTAB nTabCount = pDoc->GetTableCount();
1046 0 : pTabs = new SCTAB[nTabCount];
1047 0 : pModes = new sal_uInt8[nTabCount];
1048 0 : pTabNames = new String[nTabCount];
1049 :
1050 0 : for (SCTAB i=0; i<nTabCount; i++)
1051 : {
1052 0 : sal_uInt8 nMode = pDoc->GetLinkMode(i);
1053 0 : if (nMode)
1054 0 : if (pDoc->GetLinkDoc(i) == rtl::OUString(aDocName))
1055 : {
1056 0 : if (!nCount)
1057 : {
1058 0 : aFltName = pDoc->GetLinkFlt(i);
1059 0 : aOptions = pDoc->GetLinkOpt(i);
1060 0 : nRefreshDelay = pDoc->GetLinkRefreshDelay(i);
1061 : }
1062 : else
1063 : {
1064 : OSL_ENSURE(rtl::OUString(aFltName) == pDoc->GetLinkFlt(i) &&
1065 : rtl::OUString(aOptions) == pDoc->GetLinkOpt(i),
1066 : "different Filter for a Document?");
1067 : }
1068 0 : pTabs[nCount] = i;
1069 0 : pModes[nCount] = nMode;
1070 0 : pTabNames[nCount] = pDoc->GetLinkTab(i);
1071 0 : ++nCount;
1072 : }
1073 : }
1074 0 : }
1075 :
1076 0 : ScUndoRemoveLink::~ScUndoRemoveLink()
1077 : {
1078 0 : delete pTabs;
1079 0 : delete pModes;
1080 0 : delete[] pTabNames;
1081 0 : }
1082 :
1083 0 : rtl::OUString ScUndoRemoveLink::GetComment() const
1084 : {
1085 0 : return ScGlobal::GetRscString( STR_UNDO_REMOVELINK );
1086 : }
1087 :
1088 0 : void ScUndoRemoveLink::DoChange( sal_Bool bLink ) const
1089 : {
1090 0 : ScDocument* pDoc = pDocShell->GetDocument();
1091 0 : String aEmpty;
1092 0 : for (sal_uInt16 i=0; i<nCount; i++)
1093 0 : if (bLink) // establish link
1094 0 : pDoc->SetLink( pTabs[i], pModes[i], aDocName, aFltName, aOptions, pTabNames[i], nRefreshDelay );
1095 : else // remove link
1096 0 : pDoc->SetLink( pTabs[i], SC_LINK_NONE, aEmpty, aEmpty, aEmpty, aEmpty, 0 );
1097 0 : pDocShell->UpdateLinks();
1098 0 : }
1099 :
1100 0 : void ScUndoRemoveLink::Undo()
1101 : {
1102 0 : DoChange( sal_True );
1103 0 : }
1104 :
1105 0 : void ScUndoRemoveLink::Redo()
1106 : {
1107 0 : DoChange( false );
1108 0 : }
1109 :
1110 0 : void ScUndoRemoveLink::Repeat(SfxRepeatTarget& /* rTarget */)
1111 : {
1112 : // makes no sense
1113 0 : }
1114 :
1115 0 : sal_Bool ScUndoRemoveLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1116 : {
1117 0 : return false;
1118 : }
1119 :
1120 0 : ScUndoShowHideTab::ScUndoShowHideTab( ScDocShell* pShell, SCTAB nNewTab, sal_Bool bNewShow ) :
1121 : ScSimpleUndo( pShell ),
1122 : nTab( nNewTab ),
1123 0 : bShow( bNewShow )
1124 : {
1125 0 : }
1126 :
1127 0 : ScUndoShowHideTab::~ScUndoShowHideTab()
1128 : {
1129 0 : }
1130 :
1131 0 : void ScUndoShowHideTab::DoChange( sal_Bool bShowP ) const
1132 : {
1133 0 : ScDocument* pDoc = pDocShell->GetDocument();
1134 0 : pDoc->SetVisible( nTab, bShowP );
1135 :
1136 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1137 0 : if (pViewShell)
1138 0 : pViewShell->SetTabNo(nTab,sal_True);
1139 :
1140 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
1141 0 : pDocShell->SetDocumentModified();
1142 0 : }
1143 :
1144 0 : void ScUndoShowHideTab::Undo()
1145 : {
1146 0 : DoChange(!bShow);
1147 0 : }
1148 :
1149 0 : void ScUndoShowHideTab::Redo()
1150 : {
1151 0 : DoChange(bShow);
1152 0 : }
1153 :
1154 0 : void ScUndoShowHideTab::Repeat(SfxRepeatTarget& rTarget)
1155 : {
1156 0 : if (rTarget.ISA(ScTabViewTarget))
1157 0 : ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
1158 : Execute( bShow ? FID_TABLE_SHOW : FID_TABLE_HIDE,
1159 0 : SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
1160 0 : }
1161 :
1162 0 : sal_Bool ScUndoShowHideTab::CanRepeat(SfxRepeatTarget& rTarget) const
1163 : {
1164 0 : return (rTarget.ISA(ScTabViewTarget));
1165 : }
1166 :
1167 0 : rtl::OUString ScUndoShowHideTab::GetComment() const
1168 : {
1169 0 : sal_uInt16 nId = bShow ? STR_UNDO_SHOWTAB : STR_UNDO_HIDETAB;
1170 0 : return ScGlobal::GetRscString( nId );
1171 : }
1172 :
1173 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
1174 0 : ScUndoDocProtect::ScUndoDocProtect(ScDocShell* pShell, auto_ptr<ScDocProtection> pProtectSettings) :
1175 : ScSimpleUndo(pShell),
1176 0 : mpProtectSettings(pProtectSettings)
1177 : {
1178 0 : }
1179 : SAL_WNODEPRECATED_DECLARATIONS_POP
1180 :
1181 0 : ScUndoDocProtect::~ScUndoDocProtect()
1182 : {
1183 0 : }
1184 :
1185 0 : void ScUndoDocProtect::DoProtect(bool bProtect)
1186 : {
1187 0 : ScDocument* pDoc = pDocShell->GetDocument();
1188 :
1189 0 : if (bProtect)
1190 : {
1191 : // set protection.
1192 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
1193 0 : auto_ptr<ScDocProtection> pCopy(new ScDocProtection(*mpProtectSettings));
1194 : SAL_WNODEPRECATED_DECLARATIONS_POP
1195 0 : pCopy->setProtected(true);
1196 0 : pDoc->SetDocProtection(pCopy.get());
1197 : }
1198 : else
1199 : {
1200 : // remove protection.
1201 0 : pDoc->SetDocProtection(NULL);
1202 : }
1203 :
1204 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1205 0 : if (pViewShell)
1206 : {
1207 0 : pViewShell->UpdateLayerLocks();
1208 0 : pViewShell->UpdateInputHandler(sal_True); // so that input can be immediately entered again
1209 : }
1210 :
1211 0 : pDocShell->PostPaintGridAll();
1212 0 : }
1213 :
1214 0 : void ScUndoDocProtect::Undo()
1215 : {
1216 0 : BeginUndo();
1217 0 : DoProtect(!mpProtectSettings->isProtected());
1218 0 : EndUndo();
1219 0 : }
1220 :
1221 0 : void ScUndoDocProtect::Redo()
1222 : {
1223 0 : BeginRedo();
1224 0 : DoProtect(mpProtectSettings->isProtected());
1225 0 : EndRedo();
1226 0 : }
1227 :
1228 0 : void ScUndoDocProtect::Repeat(SfxRepeatTarget& /* rTarget */)
1229 : {
1230 : // makes no sense
1231 0 : }
1232 :
1233 0 : sal_Bool ScUndoDocProtect::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1234 : {
1235 0 : return false; // makes no sense
1236 : }
1237 :
1238 0 : rtl::OUString ScUndoDocProtect::GetComment() const
1239 : {
1240 0 : sal_uInt16 nId = mpProtectSettings->isProtected() ? STR_UNDO_PROTECT_DOC : STR_UNDO_UNPROTECT_DOC;
1241 0 : return ScGlobal::GetRscString( nId );
1242 : }
1243 :
1244 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
1245 0 : ScUndoTabProtect::ScUndoTabProtect(ScDocShell* pShell, SCTAB nTab, auto_ptr<ScTableProtection> pProtectSettings) :
1246 : ScSimpleUndo(pShell),
1247 : mnTab(nTab),
1248 0 : mpProtectSettings(pProtectSettings)
1249 : {
1250 0 : }
1251 : SAL_WNODEPRECATED_DECLARATIONS_POP
1252 :
1253 0 : ScUndoTabProtect::~ScUndoTabProtect()
1254 : {
1255 0 : }
1256 :
1257 0 : void ScUndoTabProtect::DoProtect(bool bProtect)
1258 : {
1259 0 : ScDocument* pDoc = pDocShell->GetDocument();
1260 :
1261 0 : if (bProtect)
1262 : {
1263 : // set protection.
1264 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
1265 0 : auto_ptr<ScTableProtection> pCopy(new ScTableProtection(*mpProtectSettings));
1266 : SAL_WNODEPRECATED_DECLARATIONS_POP
1267 0 : pCopy->setProtected(true);
1268 0 : pDoc->SetTabProtection(mnTab, pCopy.get());
1269 : }
1270 : else
1271 : {
1272 : // remove protection.
1273 0 : pDoc->SetTabProtection(mnTab, NULL);
1274 : }
1275 :
1276 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1277 0 : if (pViewShell)
1278 : {
1279 0 : pViewShell->UpdateLayerLocks();
1280 0 : pViewShell->UpdateInputHandler(sal_True); // so that input can be immediately entered again
1281 : }
1282 :
1283 0 : pDocShell->PostPaintGridAll();
1284 0 : }
1285 :
1286 0 : void ScUndoTabProtect::Undo()
1287 : {
1288 0 : BeginUndo();
1289 0 : DoProtect(!mpProtectSettings->isProtected());
1290 0 : EndUndo();
1291 0 : }
1292 :
1293 0 : void ScUndoTabProtect::Redo()
1294 : {
1295 0 : BeginRedo();
1296 0 : DoProtect(mpProtectSettings->isProtected());
1297 0 : EndRedo();
1298 0 : }
1299 :
1300 0 : void ScUndoTabProtect::Repeat(SfxRepeatTarget& /* rTarget */)
1301 : {
1302 : // makes no sense
1303 0 : }
1304 :
1305 0 : sal_Bool ScUndoTabProtect::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1306 : {
1307 0 : return false; // makes no sense
1308 : }
1309 :
1310 0 : rtl::OUString ScUndoTabProtect::GetComment() const
1311 : {
1312 0 : sal_uInt16 nId = mpProtectSettings->isProtected() ? STR_UNDO_PROTECT_TAB : STR_UNDO_UNPROTECT_TAB;
1313 0 : return ScGlobal::GetRscString( nId );
1314 : }
1315 :
1316 0 : ScUndoPrintRange::ScUndoPrintRange( ScDocShell* pShell, SCTAB nNewTab,
1317 : ScPrintRangeSaver* pOld, ScPrintRangeSaver* pNew ) :
1318 : ScSimpleUndo( pShell ),
1319 : nTab( nNewTab ),
1320 : pOldRanges( pOld ),
1321 0 : pNewRanges( pNew )
1322 : {
1323 0 : }
1324 :
1325 0 : ScUndoPrintRange::~ScUndoPrintRange()
1326 : {
1327 0 : delete pOldRanges;
1328 0 : delete pNewRanges;
1329 0 : }
1330 :
1331 0 : void ScUndoPrintRange::DoChange(sal_Bool bUndo)
1332 : {
1333 0 : ScDocument* pDoc = pDocShell->GetDocument();
1334 0 : if (bUndo)
1335 0 : pDoc->RestorePrintRanges( *pOldRanges );
1336 : else
1337 0 : pDoc->RestorePrintRanges( *pNewRanges );
1338 :
1339 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1340 0 : if (pViewShell)
1341 0 : pViewShell->SetTabNo( nTab );
1342 :
1343 0 : ScPrintFunc( pDocShell, pDocShell->GetPrinter(), nTab ).UpdatePages();
1344 :
1345 0 : pDocShell->PostPaint( ScRange(0,0,nTab,MAXCOL,MAXROW,nTab), PAINT_GRID );
1346 0 : }
1347 :
1348 0 : void ScUndoPrintRange::Undo()
1349 : {
1350 0 : BeginUndo();
1351 0 : DoChange( sal_True );
1352 0 : EndUndo();
1353 0 : }
1354 :
1355 0 : void ScUndoPrintRange::Redo()
1356 : {
1357 0 : BeginRedo();
1358 0 : DoChange( false );
1359 0 : EndRedo();
1360 0 : }
1361 :
1362 0 : void ScUndoPrintRange::Repeat(SfxRepeatTarget& /* rTarget */)
1363 : {
1364 : // makes no sense
1365 0 : }
1366 :
1367 0 : sal_Bool ScUndoPrintRange::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1368 : {
1369 0 : return false; // makes no sense
1370 : }
1371 :
1372 0 : rtl::OUString ScUndoPrintRange::GetComment() const
1373 : {
1374 0 : return ScGlobal::GetRscString( STR_UNDO_PRINTRANGES );
1375 : }
1376 :
1377 0 : ScUndoScenarioFlags::ScUndoScenarioFlags( ScDocShell* pNewDocShell, SCTAB nT,
1378 : const String& rON, const String& rNN, const String& rOC, const String& rNC,
1379 : const Color& rOCol, const Color& rNCol, sal_uInt16 nOF, sal_uInt16 nNF ) :
1380 : ScSimpleUndo( pNewDocShell ),
1381 : nTab ( nT ),
1382 : aOldName ( rON ),
1383 : aNewName ( rNN ),
1384 : aOldComment ( rOC ),
1385 : aNewComment ( rNC ),
1386 : aOldColor ( rOCol ),
1387 : aNewColor ( rNCol ),
1388 : nOldFlags ( nOF ),
1389 0 : nNewFlags ( nNF )
1390 : {
1391 0 : }
1392 :
1393 0 : ScUndoScenarioFlags::~ScUndoScenarioFlags()
1394 : {
1395 0 : }
1396 :
1397 0 : rtl::OUString ScUndoScenarioFlags::GetComment() const
1398 : {
1399 0 : return ScGlobal::GetRscString( STR_UNDO_EDITSCENARIO );
1400 : }
1401 :
1402 0 : void ScUndoScenarioFlags::Undo()
1403 : {
1404 0 : ScDocument* pDoc = pDocShell->GetDocument();
1405 :
1406 0 : pDoc->RenameTab( nTab, aOldName );
1407 0 : pDoc->SetScenarioData( nTab, aOldComment, aOldColor, nOldFlags );
1408 :
1409 0 : pDocShell->PostPaintGridAll();
1410 : // The sheet name might be used in a formula ...
1411 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1412 0 : if (pViewShell)
1413 0 : pViewShell->UpdateInputHandler();
1414 :
1415 0 : if ( aOldName != aNewName )
1416 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
1417 0 : }
1418 :
1419 0 : void ScUndoScenarioFlags::Redo()
1420 : {
1421 0 : ScDocument* pDoc = pDocShell->GetDocument();
1422 :
1423 0 : pDoc->RenameTab( nTab, aNewName );
1424 0 : pDoc->SetScenarioData( nTab, aNewComment, aNewColor, nNewFlags );
1425 :
1426 0 : pDocShell->PostPaintGridAll();
1427 : // The sheet name might be used in a formula ...
1428 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1429 0 : if (pViewShell)
1430 0 : pViewShell->UpdateInputHandler();
1431 :
1432 0 : if ( aOldName != aNewName )
1433 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
1434 0 : }
1435 :
1436 0 : void ScUndoScenarioFlags::Repeat(SfxRepeatTarget& /* rTarget */)
1437 : {
1438 : // Repeat makes no sense
1439 0 : }
1440 :
1441 0 : sal_Bool ScUndoScenarioFlags::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1442 : {
1443 0 : return false;
1444 : }
1445 :
1446 : // (move to different file?)
1447 0 : ScUndoRenameObject::ScUndoRenameObject( ScDocShell* pNewDocShell, const String& rPN,
1448 : const String& rON, const String& rNN ) :
1449 : ScSimpleUndo( pNewDocShell ),
1450 : aPersistName( rPN ),
1451 : aOldName ( rON ),
1452 0 : aNewName ( rNN )
1453 : {
1454 0 : }
1455 :
1456 0 : ScUndoRenameObject::~ScUndoRenameObject()
1457 : {
1458 0 : }
1459 :
1460 0 : rtl::OUString ScUndoRenameObject::GetComment() const
1461 : {
1462 : // string resource shared with title for dialog
1463 0 : return String( ScResId(SCSTR_RENAMEOBJECT) );
1464 : }
1465 :
1466 0 : SdrObject* ScUndoRenameObject::GetObject()
1467 : {
1468 0 : ScDocument* pDoc = pDocShell->GetDocument();
1469 0 : ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
1470 0 : if ( pDrawLayer )
1471 : {
1472 0 : sal_uInt16 nCount = pDrawLayer->GetPageCount();
1473 0 : for (sal_uInt16 nTab=0; nTab<nCount; nTab++)
1474 : {
1475 0 : SdrPage* pPage = pDrawLayer->GetPage(nTab);
1476 : OSL_ENSURE(pPage,"Page ?");
1477 :
1478 0 : SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
1479 0 : SdrObject* pObject = aIter.Next();
1480 0 : while (pObject)
1481 : {
1482 0 : if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
1483 0 : ((SdrOle2Obj*)pObject)->GetPersistName() == aPersistName )
1484 : {
1485 0 : return pObject;
1486 : }
1487 :
1488 0 : pObject = aIter.Next();
1489 : }
1490 0 : }
1491 : }
1492 : OSL_FAIL("Object not found");
1493 0 : return NULL;
1494 : }
1495 :
1496 0 : void ScUndoRenameObject::Undo()
1497 : {
1498 0 : BeginUndo();
1499 0 : SdrObject* pObj = GetObject();
1500 0 : if ( pObj )
1501 0 : pObj->SetName( aOldName );
1502 0 : EndUndo();
1503 0 : }
1504 :
1505 0 : void ScUndoRenameObject::Redo()
1506 : {
1507 0 : BeginRedo();
1508 0 : SdrObject* pObj = GetObject();
1509 0 : if ( pObj )
1510 0 : pObj->SetName( aNewName );
1511 0 : EndRedo();
1512 0 : }
1513 :
1514 0 : void ScUndoRenameObject::Repeat(SfxRepeatTarget& /* rTarget */)
1515 : {
1516 0 : }
1517 :
1518 0 : sal_Bool ScUndoRenameObject::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1519 : {
1520 0 : return false;
1521 : }
1522 :
1523 0 : ScUndoLayoutRTL::ScUndoLayoutRTL( ScDocShell* pShell, SCTAB nNewTab, sal_Bool bNewRTL ) :
1524 : ScSimpleUndo( pShell ),
1525 : nTab( nNewTab ),
1526 0 : bRTL( bNewRTL )
1527 : {
1528 0 : }
1529 :
1530 0 : ScUndoLayoutRTL::~ScUndoLayoutRTL()
1531 : {
1532 0 : }
1533 :
1534 0 : void ScUndoLayoutRTL::DoChange( sal_Bool bNew )
1535 : {
1536 0 : pDocShell->SetInUndo( sal_True );
1537 :
1538 0 : ScDocument* pDoc = pDocShell->GetDocument();
1539 0 : pDoc->SetLayoutRTL( nTab, bNew );
1540 :
1541 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1542 0 : if (pViewShell)
1543 0 : pViewShell->SetTabNo(nTab,sal_True);
1544 :
1545 0 : pDocShell->SetDocumentModified();
1546 :
1547 0 : pDocShell->SetInUndo( false );
1548 0 : }
1549 :
1550 0 : void ScUndoLayoutRTL::Undo()
1551 : {
1552 0 : DoChange(!bRTL);
1553 0 : }
1554 :
1555 0 : void ScUndoLayoutRTL::Redo()
1556 : {
1557 0 : DoChange(bRTL);
1558 0 : }
1559 :
1560 0 : void ScUndoLayoutRTL::Repeat(SfxRepeatTarget& rTarget)
1561 : {
1562 0 : if (rTarget.ISA(ScTabViewTarget))
1563 0 : ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData()->GetDispatcher().
1564 0 : Execute( FID_TAB_RTL, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
1565 0 : }
1566 :
1567 0 : sal_Bool ScUndoLayoutRTL::CanRepeat(SfxRepeatTarget& rTarget) const
1568 : {
1569 0 : return (rTarget.ISA(ScTabViewTarget));
1570 : }
1571 :
1572 0 : rtl::OUString ScUndoLayoutRTL::GetComment() const
1573 : {
1574 0 : return ScGlobal::GetRscString( STR_UNDO_TAB_RTL );
1575 15 : }
1576 :
1577 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|