1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sc.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir // INCLUDE --------------------------------------------------------------- 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir #include <vcl/virdev.hxx> 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir #include "undobase.hxx" 38*cdf0e10cSrcweir #include "refundo.hxx" 39*cdf0e10cSrcweir #include "docsh.hxx" 40*cdf0e10cSrcweir #include "tabvwsh.hxx" 41*cdf0e10cSrcweir #include "undoolk.hxx" 42*cdf0e10cSrcweir #include "undodraw.hxx" 43*cdf0e10cSrcweir #include "dbcolect.hxx" 44*cdf0e10cSrcweir #include "attrib.hxx" 45*cdf0e10cSrcweir #include "queryparam.hxx" 46*cdf0e10cSrcweir #include "globstr.hrc" 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir // STATIC DATA ----------------------------------------------------------- 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir TYPEINIT1(ScSimpleUndo, SfxUndoAction); 51*cdf0e10cSrcweir TYPEINIT1(ScBlockUndo, ScSimpleUndo); 52*cdf0e10cSrcweir TYPEINIT1(ScMoveUndo, ScSimpleUndo); 53*cdf0e10cSrcweir TYPEINIT1(ScDBFuncUndo, ScSimpleUndo); 54*cdf0e10cSrcweir TYPEINIT1(ScUndoWrapper, SfxUndoAction); 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir // ----------------------------------------------------------------------- 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir ScSimpleUndo::ScSimpleUndo( ScDocShell* pDocSh ) : 59*cdf0e10cSrcweir pDocShell( pDocSh ), 60*cdf0e10cSrcweir pDetectiveUndo( NULL ) 61*cdf0e10cSrcweir { 62*cdf0e10cSrcweir } 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir __EXPORT ScSimpleUndo::~ScSimpleUndo() 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir delete pDetectiveUndo; 67*cdf0e10cSrcweir } 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir bool ScSimpleUndo::SetViewMarkData( const ScMarkData& rMarkData ) 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir if ( IsPaintLocked() ) 72*cdf0e10cSrcweir return false; 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 75*cdf0e10cSrcweir if ( !pViewShell ) 76*cdf0e10cSrcweir return false; 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir pViewShell->SetMarkData( rMarkData ); 79*cdf0e10cSrcweir return true; 80*cdf0e10cSrcweir } 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir sal_Bool __EXPORT ScSimpleUndo::Merge( SfxUndoAction *pNextAction ) 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir // Zu jeder Undo-Action kann eine SdrUndoGroup fuer das Aktualisieren 85*cdf0e10cSrcweir // der Detektiv-Pfeile gehoeren. 86*cdf0e10cSrcweir // DetectiveRefresh kommt immer hinterher, die SdrUndoGroup ist in 87*cdf0e10cSrcweir // eine ScUndoDraw Action verpackt. 88*cdf0e10cSrcweir // Nur beim automatischen Aktualisieren wird AddUndoAction mit 89*cdf0e10cSrcweir // bTryMerg=sal_True gerufen. 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir if ( !pDetectiveUndo && pNextAction->ISA(ScUndoDraw) ) 92*cdf0e10cSrcweir { 93*cdf0e10cSrcweir // SdrUndoAction aus der ScUndoDraw Action uebernehmen, 94*cdf0e10cSrcweir // ScUndoDraw wird dann vom UndoManager geloescht 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir ScUndoDraw* pCalcUndo = (ScUndoDraw*)pNextAction; 97*cdf0e10cSrcweir pDetectiveUndo = pCalcUndo->GetDrawUndo(); 98*cdf0e10cSrcweir pCalcUndo->ForgetDrawUndo(); 99*cdf0e10cSrcweir return sal_True; 100*cdf0e10cSrcweir } 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir return sal_False; 103*cdf0e10cSrcweir } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir void ScSimpleUndo::BeginUndo() 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir pDocShell->SetInUndo( sal_True ); 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 110*cdf0e10cSrcweir if (pViewShell) 111*cdf0e10cSrcweir pViewShell->HideAllCursors(); // z.B. wegen zusammengefassten Zellen 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir // detective updates happened last, must be undone first 114*cdf0e10cSrcweir if (pDetectiveUndo) 115*cdf0e10cSrcweir pDetectiveUndo->Undo(); 116*cdf0e10cSrcweir } 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir void ScSimpleUndo::EndUndo() 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir pDocShell->SetDocumentModified(); 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 123*cdf0e10cSrcweir if (pViewShell) 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir pViewShell->UpdateAutoFillMark(); 126*cdf0e10cSrcweir pViewShell->UpdateInputHandler(); 127*cdf0e10cSrcweir pViewShell->ShowAllCursors(); 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir pDocShell->SetInUndo( sal_False ); 131*cdf0e10cSrcweir } 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir void ScSimpleUndo::BeginRedo() 134*cdf0e10cSrcweir { 135*cdf0e10cSrcweir pDocShell->SetInUndo( sal_True ); //! eigenes Flag fuer Redo? 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 138*cdf0e10cSrcweir if (pViewShell) 139*cdf0e10cSrcweir pViewShell->HideAllCursors(); // z.B. wegen zusammengefassten Zellen 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir void ScSimpleUndo::EndRedo() 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir if (pDetectiveUndo) 145*cdf0e10cSrcweir pDetectiveUndo->Redo(); 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir pDocShell->SetDocumentModified(); 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 150*cdf0e10cSrcweir if (pViewShell) 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir pViewShell->UpdateAutoFillMark(); 153*cdf0e10cSrcweir pViewShell->UpdateInputHandler(); 154*cdf0e10cSrcweir pViewShell->ShowAllCursors(); 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir pDocShell->SetInUndo( sal_False ); 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir void ScSimpleUndo::ShowTable( SCTAB nTab ) // static 161*cdf0e10cSrcweir { 162*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 163*cdf0e10cSrcweir if (pViewShell) 164*cdf0e10cSrcweir pViewShell->SetTabNo( nTab ); 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir void ScSimpleUndo::ShowTable( const ScRange& rRange ) // static 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 170*cdf0e10cSrcweir if (pViewShell) 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir SCTAB nStart = rRange.aStart.Tab(); 173*cdf0e10cSrcweir SCTAB nEnd = rRange.aEnd.Tab(); 174*cdf0e10cSrcweir SCTAB nTab = pViewShell->GetViewData()->GetTabNo(); 175*cdf0e10cSrcweir if ( nTab < nStart || nTab > nEnd ) // wenn nicht im Bereich: 176*cdf0e10cSrcweir pViewShell->SetTabNo( nStart ); // auf erste des Bereiches 177*cdf0e10cSrcweir } 178*cdf0e10cSrcweir } 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir 181*cdf0e10cSrcweir // ----------------------------------------------------------------------- 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir ScBlockUndo::ScBlockUndo( ScDocShell* pDocSh, const ScRange& rRange, 184*cdf0e10cSrcweir ScBlockUndoMode eBlockMode ) : 185*cdf0e10cSrcweir ScSimpleUndo( pDocSh ), 186*cdf0e10cSrcweir aBlockRange( rRange ), 187*cdf0e10cSrcweir eMode( eBlockMode ) 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() ); 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir __EXPORT ScBlockUndo::~ScBlockUndo() 193*cdf0e10cSrcweir { 194*cdf0e10cSrcweir DeleteSdrUndoAction( pDrawUndo ); 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir void ScBlockUndo::BeginUndo() 198*cdf0e10cSrcweir { 199*cdf0e10cSrcweir ScSimpleUndo::BeginUndo(); 200*cdf0e10cSrcweir EnableDrawAdjust( pDocShell->GetDocument(), sal_False ); 201*cdf0e10cSrcweir } 202*cdf0e10cSrcweir 203*cdf0e10cSrcweir void ScBlockUndo::EndUndo() 204*cdf0e10cSrcweir { 205*cdf0e10cSrcweir if (eMode == SC_UNDO_AUTOHEIGHT) 206*cdf0e10cSrcweir AdjustHeight(); 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir EnableDrawAdjust( pDocShell->GetDocument(), sal_True ); 209*cdf0e10cSrcweir DoSdrUndoAction( pDrawUndo, pDocShell->GetDocument() ); 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir ShowBlock(); 212*cdf0e10cSrcweir ScSimpleUndo::EndUndo(); 213*cdf0e10cSrcweir } 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir /* 216*cdf0e10cSrcweir void ScBlockUndo::BeginRedo() 217*cdf0e10cSrcweir { 218*cdf0e10cSrcweir ScSimpleUndo::BeginRedo(); 219*cdf0e10cSrcweir } 220*cdf0e10cSrcweir */ 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir void ScBlockUndo::EndRedo() 223*cdf0e10cSrcweir { 224*cdf0e10cSrcweir if (eMode == SC_UNDO_AUTOHEIGHT) 225*cdf0e10cSrcweir AdjustHeight(); 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir ShowBlock(); 228*cdf0e10cSrcweir ScSimpleUndo::EndRedo(); 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir sal_Bool ScBlockUndo::AdjustHeight() 232*cdf0e10cSrcweir { 233*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir VirtualDevice aVirtDev; 236*cdf0e10cSrcweir Fraction aZoomX( 1, 1 ); 237*cdf0e10cSrcweir Fraction aZoomY = aZoomX; 238*cdf0e10cSrcweir double nPPTX, nPPTY; 239*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 240*cdf0e10cSrcweir if (pViewShell) 241*cdf0e10cSrcweir { 242*cdf0e10cSrcweir ScViewData* pData = pViewShell->GetViewData(); 243*cdf0e10cSrcweir nPPTX = pData->GetPPTX(); 244*cdf0e10cSrcweir nPPTY = pData->GetPPTY(); 245*cdf0e10cSrcweir aZoomX = pData->GetZoomX(); 246*cdf0e10cSrcweir aZoomY = pData->GetZoomY(); 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir else 249*cdf0e10cSrcweir { 250*cdf0e10cSrcweir // Zoom auf 100 lassen 251*cdf0e10cSrcweir nPPTX = ScGlobal::nScreenPPTX; 252*cdf0e10cSrcweir nPPTY = ScGlobal::nScreenPPTY; 253*cdf0e10cSrcweir } 254*cdf0e10cSrcweir 255*cdf0e10cSrcweir sal_Bool bRet = pDoc->SetOptimalHeight( aBlockRange.aStart.Row(), aBlockRange.aEnd.Row(), 256*cdf0e10cSrcweir /*!*/ aBlockRange.aStart.Tab(), 0, &aVirtDev, 257*cdf0e10cSrcweir nPPTX, nPPTY, aZoomX, aZoomY, sal_False ); 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir if (bRet) 260*cdf0e10cSrcweir pDocShell->PostPaint( 0, aBlockRange.aStart.Row(), aBlockRange.aStart.Tab(), 261*cdf0e10cSrcweir MAXCOL, MAXROW, aBlockRange.aEnd.Tab(), 262*cdf0e10cSrcweir PAINT_GRID | PAINT_LEFT ); 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir return bRet; 265*cdf0e10cSrcweir } 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir void ScBlockUndo::ShowBlock() 268*cdf0e10cSrcweir { 269*cdf0e10cSrcweir if ( IsPaintLocked() ) 270*cdf0e10cSrcweir return; 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 273*cdf0e10cSrcweir if (pViewShell) 274*cdf0e10cSrcweir { 275*cdf0e10cSrcweir ShowTable( aBlockRange ); // bei mehreren Tabs im Range ist jede davon gut 276*cdf0e10cSrcweir pViewShell->MoveCursorAbs( aBlockRange.aStart.Col(), aBlockRange.aStart.Row(), 277*cdf0e10cSrcweir SC_FOLLOW_JUMP, sal_False, sal_False ); 278*cdf0e10cSrcweir SCTAB nTab = pViewShell->GetViewData()->GetTabNo(); 279*cdf0e10cSrcweir ScRange aRange = aBlockRange; 280*cdf0e10cSrcweir aRange.aStart.SetTab( nTab ); 281*cdf0e10cSrcweir aRange.aEnd.SetTab( nTab ); 282*cdf0e10cSrcweir pViewShell->MarkRange( aRange ); 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir // nicht per SetMarkArea an MarkData, wegen evtl. fehlendem Paint 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir } 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir // ----------------------------------------------------------------------- 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir ScMoveUndo::ScMoveUndo( ScDocShell* pDocSh, ScDocument* pRefDoc, ScRefUndoData* pRefData, 292*cdf0e10cSrcweir ScMoveUndoMode eRefMode ) : 293*cdf0e10cSrcweir ScSimpleUndo( pDocSh ), 294*cdf0e10cSrcweir pRefUndoDoc( pRefDoc ), 295*cdf0e10cSrcweir pRefUndoData( pRefData ), 296*cdf0e10cSrcweir eMode( eRefMode ) 297*cdf0e10cSrcweir { 298*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 299*cdf0e10cSrcweir if (pRefUndoData) 300*cdf0e10cSrcweir pRefUndoData->DeleteUnchanged(pDoc); 301*cdf0e10cSrcweir pDrawUndo = GetSdrUndoAction( pDoc ); 302*cdf0e10cSrcweir } 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir __EXPORT ScMoveUndo::~ScMoveUndo() 305*cdf0e10cSrcweir { 306*cdf0e10cSrcweir delete pRefUndoData; 307*cdf0e10cSrcweir delete pRefUndoDoc; 308*cdf0e10cSrcweir DeleteSdrUndoAction( pDrawUndo ); 309*cdf0e10cSrcweir } 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir void ScMoveUndo::UndoRef() 312*cdf0e10cSrcweir { 313*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 314*cdf0e10cSrcweir ScRange aRange(0,0,0, MAXCOL,MAXROW,pRefUndoDoc->GetTableCount()-1); 315*cdf0e10cSrcweir pRefUndoDoc->CopyToDocument( aRange, IDF_FORMULA, sal_False, pDoc, NULL, sal_False ); 316*cdf0e10cSrcweir if (pRefUndoData) 317*cdf0e10cSrcweir pRefUndoData->DoUndo( pDoc, (eMode == SC_UNDO_REFFIRST) ); 318*cdf0e10cSrcweir // #65055# HACK: ScDragDropUndo ist der einzige mit REFFIRST. 319*cdf0e10cSrcweir // Falls nicht, resultiert daraus evtl. ein zu haeufiges Anpassen 320*cdf0e10cSrcweir // der ChartRefs, nicht schoen, aber auch nicht schlecht.. 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir void ScMoveUndo::BeginUndo() 324*cdf0e10cSrcweir { 325*cdf0e10cSrcweir ScSimpleUndo::BeginUndo(); 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir EnableDrawAdjust( pDocShell->GetDocument(), sal_False ); 328*cdf0e10cSrcweir 329*cdf0e10cSrcweir if (pRefUndoDoc && eMode == SC_UNDO_REFFIRST) 330*cdf0e10cSrcweir UndoRef(); 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir void ScMoveUndo::EndUndo() 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir //@17.12.97 Reihenfolge der Fkt.s geaendert 336*cdf0e10cSrcweir DoSdrUndoAction( pDrawUndo, pDocShell->GetDocument() ); // #125875# must also be called when pointer is null 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir if (pRefUndoDoc && eMode == SC_UNDO_REFLAST) 339*cdf0e10cSrcweir UndoRef(); 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir EnableDrawAdjust( pDocShell->GetDocument(), sal_True ); 342*cdf0e10cSrcweir 343*cdf0e10cSrcweir ScSimpleUndo::EndUndo(); 344*cdf0e10cSrcweir } 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir /* 347*cdf0e10cSrcweir void ScMoveUndo::BeginRedo() 348*cdf0e10cSrcweir { 349*cdf0e10cSrcweir ScSimpleUndo::BeginRedo(); 350*cdf0e10cSrcweir } 351*cdf0e10cSrcweir */ 352*cdf0e10cSrcweir 353*cdf0e10cSrcweir /* 354*cdf0e10cSrcweir void ScMoveUndo::EndRedo() 355*cdf0e10cSrcweir { 356*cdf0e10cSrcweir ScSimpleUndo::EndRedo(); 357*cdf0e10cSrcweir } 358*cdf0e10cSrcweir */ 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir // ----------------------------------------------------------------------- 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir ScDBFuncUndo::ScDBFuncUndo( ScDocShell* pDocSh, const ScRange& rOriginal, SdrUndoAction* pDrawUndo ) : 363*cdf0e10cSrcweir ScSimpleUndo( pDocSh ), 364*cdf0e10cSrcweir aOriginalRange( rOriginal ), 365*cdf0e10cSrcweir mpDrawUndo( pDrawUndo ) 366*cdf0e10cSrcweir { 367*cdf0e10cSrcweir pAutoDBRange = pDocSh->GetOldAutoDBRange(); 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir ScDBFuncUndo::~ScDBFuncUndo() 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir DeleteSdrUndoAction( mpDrawUndo ); 373*cdf0e10cSrcweir delete pAutoDBRange; 374*cdf0e10cSrcweir } 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir void ScDBFuncUndo::SetDrawUndoAction( SdrUndoAction* pDrawUndo ) 377*cdf0e10cSrcweir { 378*cdf0e10cSrcweir DeleteSdrUndoAction( mpDrawUndo ); 379*cdf0e10cSrcweir mpDrawUndo = pDrawUndo; 380*cdf0e10cSrcweir } 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir void ScDBFuncUndo::BeginUndo() 383*cdf0e10cSrcweir { 384*cdf0e10cSrcweir ScSimpleUndo::BeginUndo(); 385*cdf0e10cSrcweir DoSdrUndoAction( mpDrawUndo, pDocShell->GetDocument() ); 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir 388*cdf0e10cSrcweir void ScDBFuncUndo::EndUndo() 389*cdf0e10cSrcweir { 390*cdf0e10cSrcweir ScSimpleUndo::EndUndo(); 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir if ( pAutoDBRange ) 393*cdf0e10cSrcweir { 394*cdf0e10cSrcweir sal_uInt16 nNoNameIndex; 395*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 396*cdf0e10cSrcweir ScDBCollection* pColl = pDoc->GetDBCollection(); 397*cdf0e10cSrcweir if ( pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nNoNameIndex ) ) 398*cdf0e10cSrcweir { 399*cdf0e10cSrcweir ScDBData* pNoNameData = (*pColl)[nNoNameIndex]; 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir SCCOL nRangeX1; 402*cdf0e10cSrcweir SCROW nRangeY1; 403*cdf0e10cSrcweir SCCOL nRangeX2; 404*cdf0e10cSrcweir SCROW nRangeY2; 405*cdf0e10cSrcweir SCTAB nRangeTab; 406*cdf0e10cSrcweir pNoNameData->GetArea( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 ); 407*cdf0e10cSrcweir pDocShell->DBAreaDeleted( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 ); 408*cdf0e10cSrcweir 409*cdf0e10cSrcweir *pNoNameData = *pAutoDBRange; 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir if ( pAutoDBRange->HasAutoFilter() ) 412*cdf0e10cSrcweir { 413*cdf0e10cSrcweir // restore AutoFilter buttons 414*cdf0e10cSrcweir pAutoDBRange->GetArea( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 ); 415*cdf0e10cSrcweir pDoc->ApplyFlagsTab( nRangeX1, nRangeY1, nRangeX2, nRangeY1, nRangeTab, SC_MF_AUTO ); 416*cdf0e10cSrcweir pDocShell->PostPaint( nRangeX1, nRangeY1, nRangeTab, nRangeX2, nRangeY1, nRangeTab, PAINT_GRID ); 417*cdf0e10cSrcweir } 418*cdf0e10cSrcweir } 419*cdf0e10cSrcweir } 420*cdf0e10cSrcweir } 421*cdf0e10cSrcweir 422*cdf0e10cSrcweir void ScDBFuncUndo::BeginRedo() 423*cdf0e10cSrcweir { 424*cdf0e10cSrcweir RedoSdrUndoAction( mpDrawUndo ); 425*cdf0e10cSrcweir if ( pAutoDBRange ) 426*cdf0e10cSrcweir { 427*cdf0e10cSrcweir // move the database range to this function's position again (see ScDocShell::GetDBData) 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir sal_uInt16 nNoNameIndex; 430*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 431*cdf0e10cSrcweir ScDBCollection* pColl = pDoc->GetDBCollection(); 432*cdf0e10cSrcweir if ( pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nNoNameIndex ) ) 433*cdf0e10cSrcweir { 434*cdf0e10cSrcweir ScDBData* pNoNameData = (*pColl)[nNoNameIndex]; 435*cdf0e10cSrcweir 436*cdf0e10cSrcweir SCCOL nRangeX1; 437*cdf0e10cSrcweir SCROW nRangeY1; 438*cdf0e10cSrcweir SCCOL nRangeX2; 439*cdf0e10cSrcweir SCROW nRangeY2; 440*cdf0e10cSrcweir SCTAB nRangeTab; 441*cdf0e10cSrcweir pNoNameData->GetArea( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 ); 442*cdf0e10cSrcweir pDocShell->DBAreaDeleted( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 ); 443*cdf0e10cSrcweir 444*cdf0e10cSrcweir pNoNameData->SetSortParam( ScSortParam() ); 445*cdf0e10cSrcweir pNoNameData->SetQueryParam( ScQueryParam() ); 446*cdf0e10cSrcweir pNoNameData->SetSubTotalParam( ScSubTotalParam() ); 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir pNoNameData->SetArea( aOriginalRange.aStart.Tab(), 449*cdf0e10cSrcweir aOriginalRange.aStart.Col(), aOriginalRange.aStart.Row(), 450*cdf0e10cSrcweir aOriginalRange.aEnd.Col(), aOriginalRange.aEnd.Row() ); 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir pNoNameData->SetByRow( sal_True ); 453*cdf0e10cSrcweir pNoNameData->SetAutoFilter( sal_False ); 454*cdf0e10cSrcweir // header is always set with the operation in redo 455*cdf0e10cSrcweir } 456*cdf0e10cSrcweir } 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir ScSimpleUndo::BeginRedo(); 459*cdf0e10cSrcweir } 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir void ScDBFuncUndo::EndRedo() 462*cdf0e10cSrcweir { 463*cdf0e10cSrcweir ScSimpleUndo::EndRedo(); 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir 466*cdf0e10cSrcweir // ----------------------------------------------------------------------- 467*cdf0e10cSrcweir 468*cdf0e10cSrcweir ScUndoWrapper::ScUndoWrapper( SfxUndoAction* pUndo ) : 469*cdf0e10cSrcweir pWrappedUndo( pUndo ) 470*cdf0e10cSrcweir { 471*cdf0e10cSrcweir } 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir ScUndoWrapper::~ScUndoWrapper() 474*cdf0e10cSrcweir { 475*cdf0e10cSrcweir delete pWrappedUndo; 476*cdf0e10cSrcweir } 477*cdf0e10cSrcweir 478*cdf0e10cSrcweir void ScUndoWrapper::ForgetWrappedUndo() 479*cdf0e10cSrcweir { 480*cdf0e10cSrcweir pWrappedUndo = NULL; // don't delete in dtor - pointer must be stored outside 481*cdf0e10cSrcweir } 482*cdf0e10cSrcweir 483*cdf0e10cSrcweir String ScUndoWrapper::GetComment() const 484*cdf0e10cSrcweir { 485*cdf0e10cSrcweir if (pWrappedUndo) 486*cdf0e10cSrcweir return pWrappedUndo->GetComment(); 487*cdf0e10cSrcweir else 488*cdf0e10cSrcweir return String(); 489*cdf0e10cSrcweir } 490*cdf0e10cSrcweir 491*cdf0e10cSrcweir String ScUndoWrapper::GetRepeatComment(SfxRepeatTarget& rTarget) const 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir if (pWrappedUndo) 494*cdf0e10cSrcweir return pWrappedUndo->GetRepeatComment(rTarget); 495*cdf0e10cSrcweir else 496*cdf0e10cSrcweir return String(); 497*cdf0e10cSrcweir } 498*cdf0e10cSrcweir 499*cdf0e10cSrcweir sal_uInt16 ScUndoWrapper::GetId() const 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir if (pWrappedUndo) 502*cdf0e10cSrcweir return pWrappedUndo->GetId(); 503*cdf0e10cSrcweir else 504*cdf0e10cSrcweir return 0; 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir 507*cdf0e10cSrcweir sal_Bool ScUndoWrapper::IsLinked() 508*cdf0e10cSrcweir { 509*cdf0e10cSrcweir if (pWrappedUndo) 510*cdf0e10cSrcweir return pWrappedUndo->IsLinked(); 511*cdf0e10cSrcweir else 512*cdf0e10cSrcweir return sal_False; 513*cdf0e10cSrcweir } 514*cdf0e10cSrcweir 515*cdf0e10cSrcweir void ScUndoWrapper::SetLinked( sal_Bool bIsLinked ) 516*cdf0e10cSrcweir { 517*cdf0e10cSrcweir if (pWrappedUndo) 518*cdf0e10cSrcweir pWrappedUndo->SetLinked(bIsLinked); 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir sal_Bool ScUndoWrapper::Merge( SfxUndoAction* pNextAction ) 522*cdf0e10cSrcweir { 523*cdf0e10cSrcweir if (pWrappedUndo) 524*cdf0e10cSrcweir return pWrappedUndo->Merge(pNextAction); 525*cdf0e10cSrcweir else 526*cdf0e10cSrcweir return sal_False; 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir void ScUndoWrapper::Undo() 530*cdf0e10cSrcweir { 531*cdf0e10cSrcweir if (pWrappedUndo) 532*cdf0e10cSrcweir pWrappedUndo->Undo(); 533*cdf0e10cSrcweir } 534*cdf0e10cSrcweir 535*cdf0e10cSrcweir void ScUndoWrapper::Redo() 536*cdf0e10cSrcweir { 537*cdf0e10cSrcweir if (pWrappedUndo) 538*cdf0e10cSrcweir pWrappedUndo->Redo(); 539*cdf0e10cSrcweir } 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir void ScUndoWrapper::Repeat(SfxRepeatTarget& rTarget) 542*cdf0e10cSrcweir { 543*cdf0e10cSrcweir if (pWrappedUndo) 544*cdf0e10cSrcweir pWrappedUndo->Repeat(rTarget); 545*cdf0e10cSrcweir } 546*cdf0e10cSrcweir 547*cdf0e10cSrcweir sal_Bool ScUndoWrapper::CanRepeat(SfxRepeatTarget& rTarget) const 548*cdf0e10cSrcweir { 549*cdf0e10cSrcweir if (pWrappedUndo) 550*cdf0e10cSrcweir return pWrappedUndo->CanRepeat(rTarget); 551*cdf0e10cSrcweir else 552*cdf0e10cSrcweir return sal_False; 553*cdf0e10cSrcweir } 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir 556