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 // INCLUDE ------------------------------------------------------------------- 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #include "scitems.hxx" 34*cdf0e10cSrcweir #include <editeng/boxitem.hxx> 35*cdf0e10cSrcweir #include <svl/srchitem.hxx> 36*cdf0e10cSrcweir #include <sfx2/linkmgr.hxx> 37*cdf0e10cSrcweir #include <sfx2/bindings.hxx> 38*cdf0e10cSrcweir #include <vcl/virdev.hxx> 39*cdf0e10cSrcweir #include <sfx2/app.hxx> 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include "undoblk.hxx" 42*cdf0e10cSrcweir #include "sc.hrc" 43*cdf0e10cSrcweir #include "globstr.hrc" 44*cdf0e10cSrcweir #include "global.hxx" 45*cdf0e10cSrcweir #include "rangenam.hxx" 46*cdf0e10cSrcweir #include "arealink.hxx" 47*cdf0e10cSrcweir #include "patattr.hxx" 48*cdf0e10cSrcweir #include "target.hxx" 49*cdf0e10cSrcweir #include "document.hxx" 50*cdf0e10cSrcweir #include "docpool.hxx" 51*cdf0e10cSrcweir #include "table.hxx" 52*cdf0e10cSrcweir #include "docsh.hxx" 53*cdf0e10cSrcweir #include "tabvwsh.hxx" 54*cdf0e10cSrcweir #include "undoolk.hxx" 55*cdf0e10cSrcweir #include "undoutil.hxx" 56*cdf0e10cSrcweir #include "chgtrack.hxx" 57*cdf0e10cSrcweir #include "dociter.hxx" 58*cdf0e10cSrcweir #include "cell.hxx" 59*cdf0e10cSrcweir #include "paramisc.hxx" 60*cdf0e10cSrcweir #include "postit.hxx" 61*cdf0e10cSrcweir #include "docuno.hxx" 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir // STATIC DATA --------------------------------------------------------------- 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir TYPEINIT1(ScUndoDeleteContents, SfxUndoAction); 66*cdf0e10cSrcweir TYPEINIT1(ScUndoFillTable, SfxUndoAction); 67*cdf0e10cSrcweir TYPEINIT1(ScUndoSelectionAttr, SfxUndoAction); 68*cdf0e10cSrcweir TYPEINIT1(ScUndoAutoFill, SfxUndoAction); 69*cdf0e10cSrcweir TYPEINIT1(ScUndoMerge, SfxUndoAction); 70*cdf0e10cSrcweir TYPEINIT1(ScUndoAutoFormat, SfxUndoAction); 71*cdf0e10cSrcweir TYPEINIT1(ScUndoReplace, SfxUndoAction); 72*cdf0e10cSrcweir TYPEINIT1(ScUndoTabOp, SfxUndoAction); 73*cdf0e10cSrcweir TYPEINIT1(ScUndoConversion, SfxUndoAction); 74*cdf0e10cSrcweir TYPEINIT1(ScUndoRefConversion, SfxUndoAction); 75*cdf0e10cSrcweir TYPEINIT1(ScUndoRefreshLink, SfxUndoAction); 76*cdf0e10cSrcweir TYPEINIT1(ScUndoInsertAreaLink, SfxUndoAction); 77*cdf0e10cSrcweir TYPEINIT1(ScUndoRemoveAreaLink, SfxUndoAction); 78*cdf0e10cSrcweir TYPEINIT1(ScUndoUpdateAreaLink, SfxUndoAction); 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir // To Do: 82*cdf0e10cSrcweir /*A*/ // SetOptimalHeight auf Dokument, wenn keine View 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir //============================================================================ 86*cdf0e10cSrcweir // class ScUndoDeleteContents 87*cdf0e10cSrcweir // 88*cdf0e10cSrcweir // Inhalte loeschen 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir //---------------------------------------------------------------------------- 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir ScUndoDeleteContents::ScUndoDeleteContents( 93*cdf0e10cSrcweir ScDocShell* pNewDocShell, 94*cdf0e10cSrcweir const ScMarkData& rMark, const ScRange& rRange, 95*cdf0e10cSrcweir ScDocument* pNewUndoDoc, sal_Bool bNewMulti, 96*cdf0e10cSrcweir sal_uInt16 nNewFlags, sal_Bool bObjects ) 97*cdf0e10cSrcweir // 98*cdf0e10cSrcweir : ScSimpleUndo( pNewDocShell ), 99*cdf0e10cSrcweir // 100*cdf0e10cSrcweir aRange ( rRange ), 101*cdf0e10cSrcweir aMarkData ( rMark ), 102*cdf0e10cSrcweir pUndoDoc ( pNewUndoDoc ), 103*cdf0e10cSrcweir pDrawUndo ( NULL ), 104*cdf0e10cSrcweir nFlags ( nNewFlags ), 105*cdf0e10cSrcweir bMulti ( bNewMulti ) // ueberliquid 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir if (bObjects) 108*cdf0e10cSrcweir pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() ); 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir if ( !(aMarkData.IsMarked() || aMarkData.IsMultiMarked()) ) // keine Zelle markiert: 111*cdf0e10cSrcweir aMarkData.SetMarkArea( aRange ); // Zelle unter Cursor markieren 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir SetChangeTrack(); 114*cdf0e10cSrcweir } 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir //---------------------------------------------------------------------------- 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir __EXPORT ScUndoDeleteContents::~ScUndoDeleteContents() 120*cdf0e10cSrcweir { 121*cdf0e10cSrcweir delete pUndoDoc; 122*cdf0e10cSrcweir DeleteSdrUndoAction( pDrawUndo ); 123*cdf0e10cSrcweir } 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir //---------------------------------------------------------------------------- 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir String __EXPORT ScUndoDeleteContents::GetComment() const 129*cdf0e10cSrcweir { 130*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_DELETECONTENTS ); // "Loeschen" 131*cdf0e10cSrcweir } 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir void ScUndoDeleteContents::SetChangeTrack() 135*cdf0e10cSrcweir { 136*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack(); 137*cdf0e10cSrcweir if ( pChangeTrack && (nFlags & IDF_CONTENTS) ) 138*cdf0e10cSrcweir pChangeTrack->AppendContentRange( aRange, pUndoDoc, 139*cdf0e10cSrcweir nStartChangeAction, nEndChangeAction ); 140*cdf0e10cSrcweir else 141*cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0; 142*cdf0e10cSrcweir } 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir //---------------------------------------------------------------------------- 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir void ScUndoDeleteContents::DoChange( const sal_Bool bUndo ) 148*cdf0e10cSrcweir { 149*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir SetViewMarkData( aMarkData ); 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir sal_uInt16 nExtFlags = 0; 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir if (bUndo) // nur Undo 156*cdf0e10cSrcweir { 157*cdf0e10cSrcweir sal_uInt16 nUndoFlags = IDF_NONE; // entweder alle oder keine Inhalte kopieren 158*cdf0e10cSrcweir if (nFlags & IDF_CONTENTS) // (es sind nur die richtigen ins UndoDoc kopiert worden) 159*cdf0e10cSrcweir nUndoFlags |= IDF_CONTENTS; 160*cdf0e10cSrcweir if (nFlags & IDF_ATTRIB) 161*cdf0e10cSrcweir nUndoFlags |= IDF_ATTRIB; 162*cdf0e10cSrcweir if (nFlags & IDF_EDITATTR) // Edit-Engine-Attribute 163*cdf0e10cSrcweir nUndoFlags |= IDF_STRING; // -> Zellen werden geaendert 164*cdf0e10cSrcweir // do not create clones of note captions, they will be restored via drawing undo 165*cdf0e10cSrcweir nUndoFlags |= IDF_NOCAPTIONS; 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir ScRange aCopyRange = aRange; 168*cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 169*cdf0e10cSrcweir aCopyRange.aStart.SetTab(0); 170*cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1); 171*cdf0e10cSrcweir 172*cdf0e10cSrcweir pUndoDoc->CopyToDocument( aCopyRange, nUndoFlags, bMulti, pDoc, &aMarkData ); 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir DoSdrUndoAction( pDrawUndo, pDoc ); 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack(); 177*cdf0e10cSrcweir if ( pChangeTrack ) 178*cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction ); 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aRange ); // content after the change 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir else // nur Redo 183*cdf0e10cSrcweir { 184*cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aRange ); // content before the change 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir aMarkData.MarkToMulti(); 187*cdf0e10cSrcweir RedoSdrUndoAction( pDrawUndo ); 188*cdf0e10cSrcweir // do not delete objects and note captions, they have been removed via drawing undo 189*cdf0e10cSrcweir sal_uInt16 nRedoFlags = (nFlags & ~IDF_OBJECTS) | IDF_NOCAPTIONS; 190*cdf0e10cSrcweir pDoc->DeleteSelection( nRedoFlags, aMarkData ); 191*cdf0e10cSrcweir aMarkData.MarkToSimple(); 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir SetChangeTrack(); 194*cdf0e10cSrcweir } 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 197*cdf0e10cSrcweir if ( !( (pViewShell) && pViewShell->AdjustRowHeight( 198*cdf0e10cSrcweir aRange.aStart.Row(), aRange.aEnd.Row() ) ) ) 199*cdf0e10cSrcweir /*A*/ pDocShell->PostPaint( aRange, PAINT_GRID | PAINT_EXTRAS, nExtFlags ); 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir pDocShell->PostDataChanged(); 202*cdf0e10cSrcweir if (pViewShell) 203*cdf0e10cSrcweir pViewShell->CellContentChanged(); 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir ShowTable( aRange ); 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir //---------------------------------------------------------------------------- 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir void __EXPORT ScUndoDeleteContents::Undo() 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir BeginUndo(); 214*cdf0e10cSrcweir DoChange( sal_True ); 215*cdf0e10cSrcweir EndUndo(); 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir // #i97876# Spreadsheet data changes are not notified 218*cdf0e10cSrcweir ScModelObj* pModelObj = ScModelObj::getImplementation( pDocShell->GetModel() ); 219*cdf0e10cSrcweir if ( pModelObj && pModelObj->HasChangesListeners() ) 220*cdf0e10cSrcweir { 221*cdf0e10cSrcweir ScRangeList aChangeRanges; 222*cdf0e10cSrcweir aChangeRanges.Append( aRange ); 223*cdf0e10cSrcweir pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges ); 224*cdf0e10cSrcweir } 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir //---------------------------------------------------------------------------- 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir void __EXPORT ScUndoDeleteContents::Redo() 231*cdf0e10cSrcweir { 232*cdf0e10cSrcweir BeginRedo(); 233*cdf0e10cSrcweir DoChange( sal_False ); 234*cdf0e10cSrcweir EndRedo(); 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir // #i97876# Spreadsheet data changes are not notified 237*cdf0e10cSrcweir ScModelObj* pModelObj = ScModelObj::getImplementation( pDocShell->GetModel() ); 238*cdf0e10cSrcweir if ( pModelObj && pModelObj->HasChangesListeners() ) 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir ScRangeList aChangeRanges; 241*cdf0e10cSrcweir aChangeRanges.Append( aRange ); 242*cdf0e10cSrcweir pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges ); 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir } 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir //---------------------------------------------------------------------------- 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir void __EXPORT ScUndoDeleteContents::Repeat(SfxRepeatTarget& rTarget) 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget)) 252*cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->DeleteContents( nFlags, sal_True ); 253*cdf0e10cSrcweir } 254*cdf0e10cSrcweir 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir //---------------------------------------------------------------------------- 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoDeleteContents::CanRepeat(SfxRepeatTarget& rTarget) const 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget)); 261*cdf0e10cSrcweir } 262*cdf0e10cSrcweir 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir //============================================================================ 265*cdf0e10cSrcweir // class ScUndoFillTable 266*cdf0e10cSrcweir // 267*cdf0e10cSrcweir // Tabellen ausfuellen 268*cdf0e10cSrcweir // (Bearbeiten|Ausfuellen|...) 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir //---------------------------------------------------------------------------- 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir ScUndoFillTable::ScUndoFillTable( ScDocShell* pNewDocShell, 273*cdf0e10cSrcweir const ScMarkData& rMark, 274*cdf0e10cSrcweir SCCOL nStartX, SCROW nStartY, SCTAB nStartZ, 275*cdf0e10cSrcweir SCCOL nEndX, SCROW nEndY, SCTAB nEndZ, 276*cdf0e10cSrcweir ScDocument* pNewUndoDoc, sal_Bool bNewMulti, SCTAB nSrc, 277*cdf0e10cSrcweir sal_uInt16 nFlg, sal_uInt16 nFunc, sal_Bool bSkip, sal_Bool bLink ) 278*cdf0e10cSrcweir // 279*cdf0e10cSrcweir : ScSimpleUndo( pNewDocShell ), 280*cdf0e10cSrcweir // 281*cdf0e10cSrcweir aRange ( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ), 282*cdf0e10cSrcweir aMarkData ( rMark ), 283*cdf0e10cSrcweir pUndoDoc ( pNewUndoDoc ), 284*cdf0e10cSrcweir nFlags ( nFlg ), 285*cdf0e10cSrcweir nFunction ( nFunc ), 286*cdf0e10cSrcweir nSrcTab ( nSrc ), 287*cdf0e10cSrcweir bMulti ( bNewMulti ), 288*cdf0e10cSrcweir bSkipEmpty ( bSkip ), 289*cdf0e10cSrcweir bAsLink ( bLink ) 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir SetChangeTrack(); 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir //---------------------------------------------------------------------------- 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir __EXPORT ScUndoFillTable::~ScUndoFillTable() 298*cdf0e10cSrcweir { 299*cdf0e10cSrcweir delete pUndoDoc; 300*cdf0e10cSrcweir } 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir 303*cdf0e10cSrcweir //---------------------------------------------------------------------------- 304*cdf0e10cSrcweir 305*cdf0e10cSrcweir String __EXPORT ScUndoFillTable::GetComment() const 306*cdf0e10cSrcweir { 307*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_FILL_TAB ); 308*cdf0e10cSrcweir } 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir void ScUndoFillTable::SetChangeTrack() 312*cdf0e10cSrcweir { 313*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack(); 314*cdf0e10cSrcweir if ( pChangeTrack ) 315*cdf0e10cSrcweir { 316*cdf0e10cSrcweir SCTAB nTabCount = pDocShell->GetDocument()->GetTableCount(); 317*cdf0e10cSrcweir ScRange aWorkRange(aRange); 318*cdf0e10cSrcweir nStartChangeAction = 0; 319*cdf0e10cSrcweir sal_uLong nTmpAction; 320*cdf0e10cSrcweir for ( SCTAB i = 0; i < nTabCount; i++ ) 321*cdf0e10cSrcweir { 322*cdf0e10cSrcweir if (i != nSrcTab && aMarkData.GetTableSelect(i)) 323*cdf0e10cSrcweir { 324*cdf0e10cSrcweir aWorkRange.aStart.SetTab(i); 325*cdf0e10cSrcweir aWorkRange.aEnd.SetTab(i); 326*cdf0e10cSrcweir pChangeTrack->AppendContentRange( aWorkRange, pUndoDoc, 327*cdf0e10cSrcweir nTmpAction, nEndChangeAction ); 328*cdf0e10cSrcweir if ( !nStartChangeAction ) 329*cdf0e10cSrcweir nStartChangeAction = nTmpAction; 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir } 333*cdf0e10cSrcweir else 334*cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0; 335*cdf0e10cSrcweir } 336*cdf0e10cSrcweir 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir //---------------------------------------------------------------------------- 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir void ScUndoFillTable::DoChange( const sal_Bool bUndo ) 341*cdf0e10cSrcweir { 342*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir SetViewMarkData( aMarkData ); 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir if (bUndo) // nur Undo 347*cdf0e10cSrcweir { 348*cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 349*cdf0e10cSrcweir ScRange aWorkRange(aRange); 350*cdf0e10cSrcweir for ( SCTAB i = 0; i < nTabCount; i++ ) 351*cdf0e10cSrcweir if (i != nSrcTab && aMarkData.GetTableSelect(i)) 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir aWorkRange.aStart.SetTab(i); 354*cdf0e10cSrcweir aWorkRange.aEnd.SetTab(i); 355*cdf0e10cSrcweir if (bMulti) 356*cdf0e10cSrcweir pDoc->DeleteSelectionTab( i, IDF_ALL, aMarkData ); 357*cdf0e10cSrcweir else 358*cdf0e10cSrcweir pDoc->DeleteAreaTab( aWorkRange, IDF_ALL ); 359*cdf0e10cSrcweir pUndoDoc->CopyToDocument( aWorkRange, IDF_ALL, bMulti, pDoc, &aMarkData ); 360*cdf0e10cSrcweir } 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack(); 363*cdf0e10cSrcweir if ( pChangeTrack ) 364*cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction ); 365*cdf0e10cSrcweir } 366*cdf0e10cSrcweir else // nur Redo 367*cdf0e10cSrcweir { 368*cdf0e10cSrcweir aMarkData.MarkToMulti(); 369*cdf0e10cSrcweir pDoc->FillTabMarked( nSrcTab, aMarkData, nFlags, nFunction, bSkipEmpty, bAsLink ); 370*cdf0e10cSrcweir aMarkData.MarkToSimple(); 371*cdf0e10cSrcweir SetChangeTrack(); 372*cdf0e10cSrcweir } 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir pDocShell->PostPaint(0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_GRID|PAINT_EXTRAS); 375*cdf0e10cSrcweir pDocShell->PostDataChanged(); 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir // CellContentChanged kommt mit der Markierung 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 380*cdf0e10cSrcweir if (pViewShell) 381*cdf0e10cSrcweir { 382*cdf0e10cSrcweir SCTAB nTab = pViewShell->GetViewData()->GetTabNo(); 383*cdf0e10cSrcweir if ( !aMarkData.GetTableSelect(nTab) ) 384*cdf0e10cSrcweir pViewShell->SetTabNo( nSrcTab ); 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir pViewShell->DoneBlockMode(); // gibt sonst Probleme, weil Markierung auf falscher Tabelle 387*cdf0e10cSrcweir } 388*cdf0e10cSrcweir } 389*cdf0e10cSrcweir 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir //---------------------------------------------------------------------------- 392*cdf0e10cSrcweir 393*cdf0e10cSrcweir void __EXPORT ScUndoFillTable::Undo() 394*cdf0e10cSrcweir { 395*cdf0e10cSrcweir BeginUndo(); 396*cdf0e10cSrcweir DoChange( sal_True ); 397*cdf0e10cSrcweir EndUndo(); 398*cdf0e10cSrcweir } 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir //---------------------------------------------------------------------------- 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir void __EXPORT ScUndoFillTable::Redo() 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir BeginRedo(); 406*cdf0e10cSrcweir DoChange( sal_False ); 407*cdf0e10cSrcweir EndRedo(); 408*cdf0e10cSrcweir } 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir //---------------------------------------------------------------------------- 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir void __EXPORT ScUndoFillTable::Repeat(SfxRepeatTarget& rTarget) 414*cdf0e10cSrcweir { 415*cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget)) 416*cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->FillTab( nFlags, nFunction, bSkipEmpty, bAsLink ); 417*cdf0e10cSrcweir } 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir //---------------------------------------------------------------------------- 421*cdf0e10cSrcweir 422*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoFillTable::CanRepeat(SfxRepeatTarget& rTarget) const 423*cdf0e10cSrcweir { 424*cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget)); 425*cdf0e10cSrcweir } 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir //============================================================================ 429*cdf0e10cSrcweir // class ScUndoSelectionAttr 430*cdf0e10cSrcweir // 431*cdf0e10cSrcweir // Zellformat aendern 432*cdf0e10cSrcweir 433*cdf0e10cSrcweir //---------------------------------------------------------------------------- 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir ScUndoSelectionAttr::ScUndoSelectionAttr( ScDocShell* pNewDocShell, 436*cdf0e10cSrcweir const ScMarkData& rMark, 437*cdf0e10cSrcweir SCCOL nStartX, SCROW nStartY, SCTAB nStartZ, 438*cdf0e10cSrcweir SCCOL nEndX, SCROW nEndY, SCTAB nEndZ, 439*cdf0e10cSrcweir ScDocument* pNewUndoDoc, sal_Bool bNewMulti, 440*cdf0e10cSrcweir const ScPatternAttr* pNewApply, 441*cdf0e10cSrcweir const SvxBoxItem* pNewOuter, const SvxBoxInfoItem* pNewInner ) 442*cdf0e10cSrcweir // 443*cdf0e10cSrcweir : ScSimpleUndo( pNewDocShell ), 444*cdf0e10cSrcweir // 445*cdf0e10cSrcweir aMarkData ( rMark ), 446*cdf0e10cSrcweir aRange ( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ), 447*cdf0e10cSrcweir pUndoDoc ( pNewUndoDoc ), 448*cdf0e10cSrcweir bMulti ( bNewMulti ) 449*cdf0e10cSrcweir { 450*cdf0e10cSrcweir ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool(); 451*cdf0e10cSrcweir pApplyPattern = (ScPatternAttr*) &pPool->Put( *pNewApply ); 452*cdf0e10cSrcweir pLineOuter = pNewOuter ? (SvxBoxItem*) &pPool->Put( *pNewOuter ) : NULL; 453*cdf0e10cSrcweir pLineInner = pNewInner ? (SvxBoxInfoItem*) &pPool->Put( *pNewInner ) : NULL; 454*cdf0e10cSrcweir } 455*cdf0e10cSrcweir 456*cdf0e10cSrcweir 457*cdf0e10cSrcweir //---------------------------------------------------------------------------- 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir __EXPORT ScUndoSelectionAttr::~ScUndoSelectionAttr() 460*cdf0e10cSrcweir { 461*cdf0e10cSrcweir ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool(); 462*cdf0e10cSrcweir pPool->Remove(*pApplyPattern); 463*cdf0e10cSrcweir if (pLineOuter) 464*cdf0e10cSrcweir pPool->Remove(*pLineOuter); 465*cdf0e10cSrcweir if (pLineInner) 466*cdf0e10cSrcweir pPool->Remove(*pLineInner); 467*cdf0e10cSrcweir 468*cdf0e10cSrcweir delete pUndoDoc; 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir 471*cdf0e10cSrcweir 472*cdf0e10cSrcweir //---------------------------------------------------------------------------- 473*cdf0e10cSrcweir 474*cdf0e10cSrcweir String __EXPORT ScUndoSelectionAttr::GetComment() const 475*cdf0e10cSrcweir { 476*cdf0e10cSrcweir //"Attribute" "/Linien" 477*cdf0e10cSrcweir return ScGlobal::GetRscString( pLineOuter ? STR_UNDO_SELATTRLINES : STR_UNDO_SELATTR ); 478*cdf0e10cSrcweir } 479*cdf0e10cSrcweir 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir //---------------------------------------------------------------------------- 482*cdf0e10cSrcweir 483*cdf0e10cSrcweir void ScUndoSelectionAttr::DoChange( const sal_Bool bUndo ) 484*cdf0e10cSrcweir { 485*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 486*cdf0e10cSrcweir 487*cdf0e10cSrcweir SetViewMarkData( aMarkData ); 488*cdf0e10cSrcweir 489*cdf0e10cSrcweir ScRange aEffRange( aRange ); 490*cdf0e10cSrcweir if ( pDoc->HasAttrib( aEffRange, HASATTR_MERGED ) ) // zusammengefasste Zellen? 491*cdf0e10cSrcweir pDoc->ExtendMerge( aEffRange ); 492*cdf0e10cSrcweir 493*cdf0e10cSrcweir sal_uInt16 nExtFlags = 0; 494*cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aEffRange ); 495*cdf0e10cSrcweir 496*cdf0e10cSrcweir if (bUndo) // nur bei Undo 497*cdf0e10cSrcweir { 498*cdf0e10cSrcweir ScRange aCopyRange = aRange; 499*cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 500*cdf0e10cSrcweir aCopyRange.aStart.SetTab(0); 501*cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1); 502*cdf0e10cSrcweir pUndoDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, bMulti, pDoc, &aMarkData ); 503*cdf0e10cSrcweir } 504*cdf0e10cSrcweir else // nur bei Redo 505*cdf0e10cSrcweir { 506*cdf0e10cSrcweir aMarkData.MarkToMulti(); 507*cdf0e10cSrcweir pDoc->ApplySelectionPattern( *pApplyPattern, aMarkData ); 508*cdf0e10cSrcweir aMarkData.MarkToSimple(); 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir if (pLineOuter) 511*cdf0e10cSrcweir pDoc->ApplySelectionFrame( aMarkData, pLineOuter, pLineInner ); 512*cdf0e10cSrcweir } 513*cdf0e10cSrcweir 514*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 515*cdf0e10cSrcweir if ( !( (pViewShell) && pViewShell->AdjustBlockHeight() ) ) 516*cdf0e10cSrcweir /*A*/ pDocShell->PostPaint( aEffRange, PAINT_GRID | PAINT_EXTRAS, nExtFlags ); 517*cdf0e10cSrcweir 518*cdf0e10cSrcweir ShowTable( aRange ); 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir 522*cdf0e10cSrcweir //---------------------------------------------------------------------------- 523*cdf0e10cSrcweir 524*cdf0e10cSrcweir void __EXPORT ScUndoSelectionAttr::Undo() 525*cdf0e10cSrcweir { 526*cdf0e10cSrcweir BeginUndo(); 527*cdf0e10cSrcweir DoChange( sal_True ); 528*cdf0e10cSrcweir EndUndo(); 529*cdf0e10cSrcweir } 530*cdf0e10cSrcweir 531*cdf0e10cSrcweir 532*cdf0e10cSrcweir //---------------------------------------------------------------------------- 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir void __EXPORT ScUndoSelectionAttr::Redo() 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir BeginRedo(); 537*cdf0e10cSrcweir DoChange( sal_False ); 538*cdf0e10cSrcweir EndRedo(); 539*cdf0e10cSrcweir } 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir 542*cdf0e10cSrcweir //---------------------------------------------------------------------------- 543*cdf0e10cSrcweir 544*cdf0e10cSrcweir void __EXPORT ScUndoSelectionAttr::Repeat(SfxRepeatTarget& rTarget) 545*cdf0e10cSrcweir { 546*cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget)) 547*cdf0e10cSrcweir { 548*cdf0e10cSrcweir ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell(); 549*cdf0e10cSrcweir if (pLineOuter) 550*cdf0e10cSrcweir rViewShell.ApplyPatternLines( *pApplyPattern, pLineOuter, pLineInner, sal_True ); 551*cdf0e10cSrcweir else 552*cdf0e10cSrcweir rViewShell.ApplySelectionPattern( *pApplyPattern, sal_True ); 553*cdf0e10cSrcweir } 554*cdf0e10cSrcweir } 555*cdf0e10cSrcweir 556*cdf0e10cSrcweir 557*cdf0e10cSrcweir //---------------------------------------------------------------------------- 558*cdf0e10cSrcweir 559*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoSelectionAttr::CanRepeat(SfxRepeatTarget& rTarget) const 560*cdf0e10cSrcweir { 561*cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget)); 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir 564*cdf0e10cSrcweir 565*cdf0e10cSrcweir //============================================================================ 566*cdf0e10cSrcweir // class ScUndoAutoFill 567*cdf0e10cSrcweir // 568*cdf0e10cSrcweir // Auto-Fill (nur einfache Bloecke) 569*cdf0e10cSrcweir 570*cdf0e10cSrcweir //---------------------------------------------------------------------------- 571*cdf0e10cSrcweir 572*cdf0e10cSrcweir ScUndoAutoFill::ScUndoAutoFill( ScDocShell* pNewDocShell, 573*cdf0e10cSrcweir const ScRange& rRange, const ScRange& rSourceArea, 574*cdf0e10cSrcweir ScDocument* pNewUndoDoc, const ScMarkData& rMark, 575*cdf0e10cSrcweir FillDir eNewFillDir, FillCmd eNewFillCmd, FillDateCmd eNewFillDateCmd, 576*cdf0e10cSrcweir double fNewStartValue, double fNewStepValue, double fNewMaxValue, 577*cdf0e10cSrcweir sal_uInt16 nMaxShIndex ) 578*cdf0e10cSrcweir // 579*cdf0e10cSrcweir : ScBlockUndo( pNewDocShell, rRange, SC_UNDO_AUTOHEIGHT ), 580*cdf0e10cSrcweir // 581*cdf0e10cSrcweir aSource ( rSourceArea ), 582*cdf0e10cSrcweir aMarkData ( rMark ), 583*cdf0e10cSrcweir pUndoDoc ( pNewUndoDoc ), 584*cdf0e10cSrcweir eFillDir ( eNewFillDir ), 585*cdf0e10cSrcweir eFillCmd ( eNewFillCmd ), 586*cdf0e10cSrcweir eFillDateCmd ( eNewFillDateCmd ), 587*cdf0e10cSrcweir fStartValue ( fNewStartValue ), 588*cdf0e10cSrcweir fStepValue ( fNewStepValue ), 589*cdf0e10cSrcweir fMaxValue ( fNewMaxValue ), 590*cdf0e10cSrcweir nMaxSharedIndex ( nMaxShIndex) 591*cdf0e10cSrcweir { 592*cdf0e10cSrcweir SetChangeTrack(); 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir 595*cdf0e10cSrcweir 596*cdf0e10cSrcweir //---------------------------------------------------------------------------- 597*cdf0e10cSrcweir 598*cdf0e10cSrcweir __EXPORT ScUndoAutoFill::~ScUndoAutoFill() 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir pDocShell->GetDocument()->EraseNonUsedSharedNames(nMaxSharedIndex); 601*cdf0e10cSrcweir delete pUndoDoc; 602*cdf0e10cSrcweir } 603*cdf0e10cSrcweir 604*cdf0e10cSrcweir 605*cdf0e10cSrcweir //---------------------------------------------------------------------------- 606*cdf0e10cSrcweir 607*cdf0e10cSrcweir String __EXPORT ScUndoAutoFill::GetComment() const 608*cdf0e10cSrcweir { 609*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_AUTOFILL ); //"Ausfuellen" 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir 613*cdf0e10cSrcweir void ScUndoAutoFill::SetChangeTrack() 614*cdf0e10cSrcweir { 615*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack(); 616*cdf0e10cSrcweir if ( pChangeTrack ) 617*cdf0e10cSrcweir pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc, 618*cdf0e10cSrcweir nStartChangeAction, nEndChangeAction ); 619*cdf0e10cSrcweir else 620*cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0; 621*cdf0e10cSrcweir } 622*cdf0e10cSrcweir 623*cdf0e10cSrcweir 624*cdf0e10cSrcweir //---------------------------------------------------------------------------- 625*cdf0e10cSrcweir 626*cdf0e10cSrcweir void __EXPORT ScUndoAutoFill::Undo() 627*cdf0e10cSrcweir { 628*cdf0e10cSrcweir BeginUndo(); 629*cdf0e10cSrcweir 630*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 633*cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nTabCount; nTab++) 634*cdf0e10cSrcweir { 635*cdf0e10cSrcweir if (aMarkData.GetTableSelect(nTab)) 636*cdf0e10cSrcweir { 637*cdf0e10cSrcweir ScRange aWorkRange = aBlockRange; 638*cdf0e10cSrcweir aWorkRange.aStart.SetTab(nTab); 639*cdf0e10cSrcweir aWorkRange.aEnd.SetTab(nTab); 640*cdf0e10cSrcweir 641*cdf0e10cSrcweir sal_uInt16 nExtFlags = 0; 642*cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aWorkRange ); 643*cdf0e10cSrcweir pDoc->DeleteAreaTab( aWorkRange, IDF_AUTOFILL ); 644*cdf0e10cSrcweir pUndoDoc->CopyToDocument( aWorkRange, IDF_AUTOFILL, sal_False, pDoc ); 645*cdf0e10cSrcweir 646*cdf0e10cSrcweir pDoc->ExtendMerge( aWorkRange, sal_True ); 647*cdf0e10cSrcweir pDocShell->PostPaint( aWorkRange, PAINT_GRID, nExtFlags ); 648*cdf0e10cSrcweir } 649*cdf0e10cSrcweir } 650*cdf0e10cSrcweir pDocShell->PostDataChanged(); 651*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 652*cdf0e10cSrcweir if (pViewShell) 653*cdf0e10cSrcweir pViewShell->CellContentChanged(); 654*cdf0e10cSrcweir 655*cdf0e10cSrcweir // Shared-Names loeschen 656*cdf0e10cSrcweir // Falls Undo ins Dokument gespeichert 657*cdf0e10cSrcweir // => automatisches Loeschen am Ende 658*cdf0e10cSrcweir // umarbeiten!! 659*cdf0e10cSrcweir 660*cdf0e10cSrcweir String aName = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("___SC_")); 661*cdf0e10cSrcweir aName += String::CreateFromInt32(nMaxSharedIndex); 662*cdf0e10cSrcweir aName += '_'; 663*cdf0e10cSrcweir ScRangeName* pRangeName = pDoc->GetRangeName(); 664*cdf0e10cSrcweir sal_Bool bHasFound = sal_False; 665*cdf0e10cSrcweir for (sal_uInt16 i = 0; i < pRangeName->GetCount(); i++) 666*cdf0e10cSrcweir { 667*cdf0e10cSrcweir ScRangeData* pRangeData = (*pRangeName)[i]; 668*cdf0e10cSrcweir if (pRangeData) 669*cdf0e10cSrcweir { 670*cdf0e10cSrcweir String aRName; 671*cdf0e10cSrcweir pRangeData->GetName(aRName); 672*cdf0e10cSrcweir if (aRName.Search(aName) != STRING_NOTFOUND) 673*cdf0e10cSrcweir { 674*cdf0e10cSrcweir pRangeName->AtFree(i); 675*cdf0e10cSrcweir bHasFound = sal_True; 676*cdf0e10cSrcweir } 677*cdf0e10cSrcweir } 678*cdf0e10cSrcweir } 679*cdf0e10cSrcweir if (bHasFound) 680*cdf0e10cSrcweir pRangeName->SetSharedMaxIndex(pRangeName->GetSharedMaxIndex()-1); 681*cdf0e10cSrcweir 682*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack(); 683*cdf0e10cSrcweir if ( pChangeTrack ) 684*cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction ); 685*cdf0e10cSrcweir 686*cdf0e10cSrcweir EndUndo(); 687*cdf0e10cSrcweir } 688*cdf0e10cSrcweir 689*cdf0e10cSrcweir 690*cdf0e10cSrcweir //---------------------------------------------------------------------------- 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir void __EXPORT ScUndoAutoFill::Redo() 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir BeginRedo(); 695*cdf0e10cSrcweir 696*cdf0e10cSrcweir //! Tabellen selektieren 697*cdf0e10cSrcweir 698*cdf0e10cSrcweir SCCOLROW nCount = 0; 699*cdf0e10cSrcweir switch (eFillDir) 700*cdf0e10cSrcweir { 701*cdf0e10cSrcweir case FILL_TO_BOTTOM: 702*cdf0e10cSrcweir nCount = aBlockRange.aEnd.Row() - aSource.aEnd.Row(); 703*cdf0e10cSrcweir break; 704*cdf0e10cSrcweir case FILL_TO_RIGHT: 705*cdf0e10cSrcweir nCount = aBlockRange.aEnd.Col() - aSource.aEnd.Col(); 706*cdf0e10cSrcweir break; 707*cdf0e10cSrcweir case FILL_TO_TOP: 708*cdf0e10cSrcweir nCount = aSource.aStart.Row() - aBlockRange.aStart.Row(); 709*cdf0e10cSrcweir break; 710*cdf0e10cSrcweir case FILL_TO_LEFT: 711*cdf0e10cSrcweir nCount = aSource.aStart.Col() - aBlockRange.aStart.Col(); 712*cdf0e10cSrcweir break; 713*cdf0e10cSrcweir } 714*cdf0e10cSrcweir 715*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 716*cdf0e10cSrcweir if ( fStartValue != MAXDOUBLE ) 717*cdf0e10cSrcweir { 718*cdf0e10cSrcweir SCCOL nValX = (eFillDir == FILL_TO_LEFT) ? aSource.aEnd.Col() : aSource.aStart.Col(); 719*cdf0e10cSrcweir SCROW nValY = (eFillDir == FILL_TO_TOP ) ? aSource.aEnd.Row() : aSource.aStart.Row(); 720*cdf0e10cSrcweir SCTAB nTab = aSource.aStart.Tab(); 721*cdf0e10cSrcweir pDoc->SetValue( nValX, nValY, nTab, fStartValue ); 722*cdf0e10cSrcweir } 723*cdf0e10cSrcweir pDoc->Fill( aSource.aStart.Col(), aSource.aStart.Row(), 724*cdf0e10cSrcweir aSource.aEnd.Col(), aSource.aEnd.Row(), 725*cdf0e10cSrcweir aMarkData, nCount, 726*cdf0e10cSrcweir eFillDir, eFillCmd, eFillDateCmd, 727*cdf0e10cSrcweir fStepValue, fMaxValue ); 728*cdf0e10cSrcweir 729*cdf0e10cSrcweir SetChangeTrack(); 730*cdf0e10cSrcweir 731*cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID ); 732*cdf0e10cSrcweir pDocShell->PostDataChanged(); 733*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 734*cdf0e10cSrcweir if (pViewShell) 735*cdf0e10cSrcweir pViewShell->CellContentChanged(); 736*cdf0e10cSrcweir 737*cdf0e10cSrcweir EndRedo(); 738*cdf0e10cSrcweir } 739*cdf0e10cSrcweir 740*cdf0e10cSrcweir 741*cdf0e10cSrcweir //---------------------------------------------------------------------------- 742*cdf0e10cSrcweir 743*cdf0e10cSrcweir void __EXPORT ScUndoAutoFill::Repeat(SfxRepeatTarget& rTarget) 744*cdf0e10cSrcweir { 745*cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget)) 746*cdf0e10cSrcweir { 747*cdf0e10cSrcweir ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell(); 748*cdf0e10cSrcweir if (eFillCmd==FILL_SIMPLE) 749*cdf0e10cSrcweir rViewShell.FillSimple( eFillDir, sal_True ); 750*cdf0e10cSrcweir else 751*cdf0e10cSrcweir rViewShell.FillSeries( eFillDir, eFillCmd, eFillDateCmd, 752*cdf0e10cSrcweir fStartValue, fStepValue, fMaxValue, sal_True ); 753*cdf0e10cSrcweir } 754*cdf0e10cSrcweir } 755*cdf0e10cSrcweir 756*cdf0e10cSrcweir 757*cdf0e10cSrcweir //---------------------------------------------------------------------------- 758*cdf0e10cSrcweir 759*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoAutoFill::CanRepeat(SfxRepeatTarget& rTarget) const 760*cdf0e10cSrcweir { 761*cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget)); 762*cdf0e10cSrcweir } 763*cdf0e10cSrcweir 764*cdf0e10cSrcweir 765*cdf0e10cSrcweir //============================================================================ 766*cdf0e10cSrcweir // class ScUndoMerge 767*cdf0e10cSrcweir // 768*cdf0e10cSrcweir // Zellen zusammenfassen / Zusammenfassung aufheben 769*cdf0e10cSrcweir 770*cdf0e10cSrcweir //---------------------------------------------------------------------------- 771*cdf0e10cSrcweir 772*cdf0e10cSrcweir ScUndoMerge::ScUndoMerge( ScDocShell* pNewDocShell, 773*cdf0e10cSrcweir SCCOL nStartX, SCROW nStartY, SCTAB nStartZ, 774*cdf0e10cSrcweir SCCOL nEndX, SCROW nEndY, SCTAB nEndZ, 775*cdf0e10cSrcweir bool bMergeContents, ScDocument* pUndoDoc, SdrUndoAction* pDrawUndo ) 776*cdf0e10cSrcweir // 777*cdf0e10cSrcweir : ScSimpleUndo( pNewDocShell ), 778*cdf0e10cSrcweir // 779*cdf0e10cSrcweir maRange( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ), 780*cdf0e10cSrcweir mbMergeContents( bMergeContents ), 781*cdf0e10cSrcweir mpUndoDoc( pUndoDoc ), 782*cdf0e10cSrcweir mpDrawUndo( pDrawUndo ) 783*cdf0e10cSrcweir { 784*cdf0e10cSrcweir } 785*cdf0e10cSrcweir 786*cdf0e10cSrcweir 787*cdf0e10cSrcweir //---------------------------------------------------------------------------- 788*cdf0e10cSrcweir 789*cdf0e10cSrcweir ScUndoMerge::~ScUndoMerge() 790*cdf0e10cSrcweir { 791*cdf0e10cSrcweir delete mpUndoDoc; 792*cdf0e10cSrcweir DeleteSdrUndoAction( mpDrawUndo ); 793*cdf0e10cSrcweir } 794*cdf0e10cSrcweir 795*cdf0e10cSrcweir 796*cdf0e10cSrcweir //---------------------------------------------------------------------------- 797*cdf0e10cSrcweir 798*cdf0e10cSrcweir String ScUndoMerge::GetComment() const 799*cdf0e10cSrcweir { 800*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_MERGE ); 801*cdf0e10cSrcweir } 802*cdf0e10cSrcweir 803*cdf0e10cSrcweir 804*cdf0e10cSrcweir //---------------------------------------------------------------------------- 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir void ScUndoMerge::DoChange( bool bUndo ) const 807*cdf0e10cSrcweir { 808*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 809*cdf0e10cSrcweir 810*cdf0e10cSrcweir ScUndoUtil::MarkSimpleBlock( pDocShell, maRange ); 811*cdf0e10cSrcweir 812*cdf0e10cSrcweir if (bUndo) 813*cdf0e10cSrcweir // remove merge (contents are copied back below from undo document) 814*cdf0e10cSrcweir pDoc->RemoveMerge( maRange.aStart.Col(), maRange.aStart.Row(), maRange.aStart.Tab() ); 815*cdf0e10cSrcweir else 816*cdf0e10cSrcweir // repeat merge, but do not remove note captions (will be done by drawing redo below) 817*cdf0e10cSrcweir /*!*/ pDoc->DoMerge( maRange.aStart.Tab(), 818*cdf0e10cSrcweir maRange.aStart.Col(), maRange.aStart.Row(), 819*cdf0e10cSrcweir maRange.aEnd.Col(), maRange.aEnd.Row(), false ); 820*cdf0e10cSrcweir 821*cdf0e10cSrcweir // undo -> copy back deleted contents 822*cdf0e10cSrcweir if (bUndo && mpUndoDoc) 823*cdf0e10cSrcweir { 824*cdf0e10cSrcweir pDoc->DeleteAreaTab( maRange, IDF_CONTENTS|IDF_NOCAPTIONS ); 825*cdf0e10cSrcweir mpUndoDoc->CopyToDocument( maRange, IDF_ALL|IDF_NOCAPTIONS, sal_False, pDoc ); 826*cdf0e10cSrcweir } 827*cdf0e10cSrcweir 828*cdf0e10cSrcweir // redo -> merge contents again 829*cdf0e10cSrcweir else if (!bUndo && mbMergeContents) 830*cdf0e10cSrcweir { 831*cdf0e10cSrcweir /*!*/ pDoc->DoMergeContents( maRange.aStart.Tab(), 832*cdf0e10cSrcweir maRange.aStart.Col(), maRange.aStart.Row(), 833*cdf0e10cSrcweir maRange.aEnd.Col(), maRange.aEnd.Row() ); 834*cdf0e10cSrcweir } 835*cdf0e10cSrcweir 836*cdf0e10cSrcweir if (bUndo) 837*cdf0e10cSrcweir DoSdrUndoAction( mpDrawUndo, pDoc ); 838*cdf0e10cSrcweir else 839*cdf0e10cSrcweir RedoSdrUndoAction( mpDrawUndo ); 840*cdf0e10cSrcweir 841*cdf0e10cSrcweir sal_Bool bDidPaint = sal_False; 842*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 843*cdf0e10cSrcweir if ( pViewShell ) 844*cdf0e10cSrcweir { 845*cdf0e10cSrcweir pViewShell->SetTabNo( maRange.aStart.Tab() ); 846*cdf0e10cSrcweir bDidPaint = pViewShell->AdjustRowHeight( maRange.aStart.Row(), maRange.aEnd.Row() ); 847*cdf0e10cSrcweir } 848*cdf0e10cSrcweir 849*cdf0e10cSrcweir if (!bDidPaint) 850*cdf0e10cSrcweir ScUndoUtil::PaintMore( pDocShell, maRange ); 851*cdf0e10cSrcweir 852*cdf0e10cSrcweir ShowTable( maRange ); 853*cdf0e10cSrcweir } 854*cdf0e10cSrcweir 855*cdf0e10cSrcweir 856*cdf0e10cSrcweir //---------------------------------------------------------------------------- 857*cdf0e10cSrcweir 858*cdf0e10cSrcweir void ScUndoMerge::Undo() 859*cdf0e10cSrcweir { 860*cdf0e10cSrcweir BeginUndo(); 861*cdf0e10cSrcweir DoChange( true ); 862*cdf0e10cSrcweir EndUndo(); 863*cdf0e10cSrcweir } 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir 866*cdf0e10cSrcweir //---------------------------------------------------------------------------- 867*cdf0e10cSrcweir 868*cdf0e10cSrcweir void ScUndoMerge::Redo() 869*cdf0e10cSrcweir { 870*cdf0e10cSrcweir BeginRedo(); 871*cdf0e10cSrcweir DoChange( false ); 872*cdf0e10cSrcweir EndRedo(); 873*cdf0e10cSrcweir } 874*cdf0e10cSrcweir 875*cdf0e10cSrcweir 876*cdf0e10cSrcweir //---------------------------------------------------------------------------- 877*cdf0e10cSrcweir 878*cdf0e10cSrcweir void ScUndoMerge::Repeat(SfxRepeatTarget& rTarget) 879*cdf0e10cSrcweir { 880*cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget)) 881*cdf0e10cSrcweir { 882*cdf0e10cSrcweir ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell(); 883*cdf0e10cSrcweir sal_Bool bCont = sal_False; 884*cdf0e10cSrcweir rViewShell.MergeCells( sal_False, bCont, sal_True ); 885*cdf0e10cSrcweir } 886*cdf0e10cSrcweir } 887*cdf0e10cSrcweir 888*cdf0e10cSrcweir 889*cdf0e10cSrcweir //---------------------------------------------------------------------------- 890*cdf0e10cSrcweir 891*cdf0e10cSrcweir sal_Bool ScUndoMerge::CanRepeat(SfxRepeatTarget& rTarget) const 892*cdf0e10cSrcweir { 893*cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget)); 894*cdf0e10cSrcweir } 895*cdf0e10cSrcweir 896*cdf0e10cSrcweir 897*cdf0e10cSrcweir //============================================================================ 898*cdf0e10cSrcweir // class ScUndoAutoFormat 899*cdf0e10cSrcweir // 900*cdf0e10cSrcweir // Auto-Format (nur einfache Bloecke) 901*cdf0e10cSrcweir 902*cdf0e10cSrcweir //---------------------------------------------------------------------------- 903*cdf0e10cSrcweir 904*cdf0e10cSrcweir ScUndoAutoFormat::ScUndoAutoFormat( ScDocShell* pNewDocShell, 905*cdf0e10cSrcweir const ScRange& rRange, ScDocument* pNewUndoDoc, 906*cdf0e10cSrcweir const ScMarkData& rMark, sal_Bool bNewSize, sal_uInt16 nNewFormatNo ) 907*cdf0e10cSrcweir // 908*cdf0e10cSrcweir : ScBlockUndo( pNewDocShell, rRange, bNewSize ? SC_UNDO_MANUALHEIGHT : SC_UNDO_AUTOHEIGHT ), 909*cdf0e10cSrcweir // 910*cdf0e10cSrcweir pUndoDoc ( pNewUndoDoc ), 911*cdf0e10cSrcweir aMarkData ( rMark ), 912*cdf0e10cSrcweir bSize ( bNewSize ), 913*cdf0e10cSrcweir nFormatNo ( nNewFormatNo ) 914*cdf0e10cSrcweir { 915*cdf0e10cSrcweir } 916*cdf0e10cSrcweir 917*cdf0e10cSrcweir 918*cdf0e10cSrcweir //---------------------------------------------------------------------------- 919*cdf0e10cSrcweir 920*cdf0e10cSrcweir __EXPORT ScUndoAutoFormat::~ScUndoAutoFormat() 921*cdf0e10cSrcweir { 922*cdf0e10cSrcweir delete pUndoDoc; 923*cdf0e10cSrcweir } 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir 926*cdf0e10cSrcweir //---------------------------------------------------------------------------- 927*cdf0e10cSrcweir 928*cdf0e10cSrcweir String __EXPORT ScUndoAutoFormat::GetComment() const 929*cdf0e10cSrcweir { 930*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_AUTOFORMAT ); //"Auto-Format" 931*cdf0e10cSrcweir } 932*cdf0e10cSrcweir 933*cdf0e10cSrcweir 934*cdf0e10cSrcweir //---------------------------------------------------------------------------- 935*cdf0e10cSrcweir 936*cdf0e10cSrcweir void __EXPORT ScUndoAutoFormat::Undo() 937*cdf0e10cSrcweir { 938*cdf0e10cSrcweir BeginUndo(); 939*cdf0e10cSrcweir 940*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 941*cdf0e10cSrcweir 942*cdf0e10cSrcweir // Attribute 943*cdf0e10cSrcweir // pDoc->DeleteAreaTab( aBlockRange, IDF_ATTRIB ); 944*cdf0e10cSrcweir // pUndoDoc->CopyToDocument( aBlockRange, IDF_ATTRIB, sal_False, pDoc ); 945*cdf0e10cSrcweir 946*cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 947*cdf0e10cSrcweir pDoc->DeleteArea( aBlockRange.aStart.Col(), aBlockRange.aStart.Row(), 948*cdf0e10cSrcweir aBlockRange.aEnd.Col(), aBlockRange.aEnd.Row(), 949*cdf0e10cSrcweir aMarkData, IDF_ATTRIB ); 950*cdf0e10cSrcweir ScRange aCopyRange = aBlockRange; 951*cdf0e10cSrcweir aCopyRange.aStart.SetTab(0); 952*cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1); 953*cdf0e10cSrcweir pUndoDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_False, pDoc, &aMarkData ); 954*cdf0e10cSrcweir 955*cdf0e10cSrcweir // Zellhoehen und -breiten (IDF_NONE) 956*cdf0e10cSrcweir if (bSize) 957*cdf0e10cSrcweir { 958*cdf0e10cSrcweir SCCOL nStartX = aBlockRange.aStart.Col(); 959*cdf0e10cSrcweir SCROW nStartY = aBlockRange.aStart.Row(); 960*cdf0e10cSrcweir SCTAB nStartZ = aBlockRange.aStart.Tab(); 961*cdf0e10cSrcweir SCCOL nEndX = aBlockRange.aEnd.Col(); 962*cdf0e10cSrcweir SCROW nEndY = aBlockRange.aEnd.Row(); 963*cdf0e10cSrcweir SCTAB nEndZ = aBlockRange.aEnd.Tab(); 964*cdf0e10cSrcweir 965*cdf0e10cSrcweir pUndoDoc->CopyToDocument( nStartX, 0, 0, nEndX, MAXROW, nTabCount-1, 966*cdf0e10cSrcweir IDF_NONE, sal_False, pDoc, &aMarkData ); 967*cdf0e10cSrcweir pUndoDoc->CopyToDocument( 0, nStartY, 0, MAXCOL, nEndY, nTabCount-1, 968*cdf0e10cSrcweir IDF_NONE, sal_False, pDoc, &aMarkData ); 969*cdf0e10cSrcweir pDocShell->PostPaint( 0, 0, nStartZ, MAXCOL, MAXROW, nEndZ, 970*cdf0e10cSrcweir PAINT_GRID | PAINT_LEFT | PAINT_TOP, SC_PF_LINES ); 971*cdf0e10cSrcweir } 972*cdf0e10cSrcweir else 973*cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES ); 974*cdf0e10cSrcweir 975*cdf0e10cSrcweir EndUndo(); 976*cdf0e10cSrcweir } 977*cdf0e10cSrcweir 978*cdf0e10cSrcweir 979*cdf0e10cSrcweir //---------------------------------------------------------------------------- 980*cdf0e10cSrcweir 981*cdf0e10cSrcweir void __EXPORT ScUndoAutoFormat::Redo() 982*cdf0e10cSrcweir { 983*cdf0e10cSrcweir BeginRedo(); 984*cdf0e10cSrcweir 985*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 986*cdf0e10cSrcweir 987*cdf0e10cSrcweir SCCOL nStartX = aBlockRange.aStart.Col(); 988*cdf0e10cSrcweir SCROW nStartY = aBlockRange.aStart.Row(); 989*cdf0e10cSrcweir SCTAB nStartZ = aBlockRange.aStart.Tab(); 990*cdf0e10cSrcweir SCCOL nEndX = aBlockRange.aEnd.Col(); 991*cdf0e10cSrcweir SCROW nEndY = aBlockRange.aEnd.Row(); 992*cdf0e10cSrcweir SCTAB nEndZ = aBlockRange.aEnd.Tab(); 993*cdf0e10cSrcweir 994*cdf0e10cSrcweir pDoc->AutoFormat( nStartX, nStartY, nEndX, nEndY, nFormatNo, aMarkData ); 995*cdf0e10cSrcweir 996*cdf0e10cSrcweir if (bSize) 997*cdf0e10cSrcweir { 998*cdf0e10cSrcweir VirtualDevice aVirtDev; 999*cdf0e10cSrcweir Fraction aZoomX(1,1); 1000*cdf0e10cSrcweir Fraction aZoomY = aZoomX; 1001*cdf0e10cSrcweir double nPPTX,nPPTY; 1002*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 1003*cdf0e10cSrcweir if (pViewShell) 1004*cdf0e10cSrcweir { 1005*cdf0e10cSrcweir ScViewData* pData = pViewShell->GetViewData(); 1006*cdf0e10cSrcweir nPPTX = pData->GetPPTX(); 1007*cdf0e10cSrcweir nPPTY = pData->GetPPTY(); 1008*cdf0e10cSrcweir aZoomX = pData->GetZoomX(); 1009*cdf0e10cSrcweir aZoomY = pData->GetZoomY(); 1010*cdf0e10cSrcweir } 1011*cdf0e10cSrcweir else 1012*cdf0e10cSrcweir { 1013*cdf0e10cSrcweir // Zoom auf 100 lassen 1014*cdf0e10cSrcweir nPPTX = ScGlobal::nScreenPPTX; 1015*cdf0e10cSrcweir nPPTY = ScGlobal::nScreenPPTY; 1016*cdf0e10cSrcweir } 1017*cdf0e10cSrcweir 1018*cdf0e10cSrcweir sal_Bool bFormula = sal_False; //! merken 1019*cdf0e10cSrcweir 1020*cdf0e10cSrcweir for (SCTAB nTab=nStartZ; nTab<=nEndZ; nTab++) 1021*cdf0e10cSrcweir { 1022*cdf0e10cSrcweir ScMarkData aDestMark; 1023*cdf0e10cSrcweir aDestMark.SelectOneTable( nTab ); 1024*cdf0e10cSrcweir aDestMark.SetMarkArea( ScRange( nStartX, nStartY, nTab, nEndX, nEndY, nTab ) ); 1025*cdf0e10cSrcweir aDestMark.MarkToMulti(); 1026*cdf0e10cSrcweir 1027*cdf0e10cSrcweir // wie SC_SIZE_VISOPT 1028*cdf0e10cSrcweir SCROW nLastRow = -1; 1029*cdf0e10cSrcweir for (SCROW nRow=nStartY; nRow<=nEndY; nRow++) 1030*cdf0e10cSrcweir { 1031*cdf0e10cSrcweir sal_uInt8 nOld = pDoc->GetRowFlags(nRow,nTab); 1032*cdf0e10cSrcweir bool bHidden = pDoc->RowHidden(nRow, nTab, nLastRow); 1033*cdf0e10cSrcweir if ( !bHidden && ( nOld & CR_MANUALSIZE ) ) 1034*cdf0e10cSrcweir pDoc->SetRowFlags( nRow, nTab, nOld & ~CR_MANUALSIZE ); 1035*cdf0e10cSrcweir } 1036*cdf0e10cSrcweir pDoc->SetOptimalHeight( nStartY, nEndY, nTab, 0, &aVirtDev, 1037*cdf0e10cSrcweir nPPTX, nPPTY, aZoomX, aZoomY, sal_False ); 1038*cdf0e10cSrcweir 1039*cdf0e10cSrcweir SCCOL nLastCol = -1; 1040*cdf0e10cSrcweir for (SCCOL nCol=nStartX; nCol<=nEndX; nCol++) 1041*cdf0e10cSrcweir if (!pDoc->ColHidden(nCol, nTab, nLastCol)) 1042*cdf0e10cSrcweir { 1043*cdf0e10cSrcweir sal_uInt16 nThisSize = STD_EXTRA_WIDTH + pDoc->GetOptimalColWidth( nCol, nTab, 1044*cdf0e10cSrcweir &aVirtDev, nPPTX, nPPTY, aZoomX, aZoomY, bFormula, 1045*cdf0e10cSrcweir &aDestMark ); 1046*cdf0e10cSrcweir pDoc->SetColWidth( nCol, nTab, nThisSize ); 1047*cdf0e10cSrcweir pDoc->ShowCol( nCol, nTab, sal_True ); 1048*cdf0e10cSrcweir } 1049*cdf0e10cSrcweir } 1050*cdf0e10cSrcweir 1051*cdf0e10cSrcweir pDocShell->PostPaint( 0, 0, nStartZ, 1052*cdf0e10cSrcweir MAXCOL, MAXROW, nEndZ, 1053*cdf0e10cSrcweir PAINT_GRID | PAINT_LEFT | PAINT_TOP, SC_PF_LINES); 1054*cdf0e10cSrcweir } 1055*cdf0e10cSrcweir else 1056*cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES ); 1057*cdf0e10cSrcweir 1058*cdf0e10cSrcweir EndRedo(); 1059*cdf0e10cSrcweir } 1060*cdf0e10cSrcweir 1061*cdf0e10cSrcweir 1062*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1063*cdf0e10cSrcweir 1064*cdf0e10cSrcweir void __EXPORT ScUndoAutoFormat::Repeat(SfxRepeatTarget& rTarget) 1065*cdf0e10cSrcweir { 1066*cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget)) 1067*cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->AutoFormat( nFormatNo, sal_True ); 1068*cdf0e10cSrcweir } 1069*cdf0e10cSrcweir 1070*cdf0e10cSrcweir 1071*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1072*cdf0e10cSrcweir 1073*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoAutoFormat::CanRepeat(SfxRepeatTarget& rTarget) const 1074*cdf0e10cSrcweir { 1075*cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget)); 1076*cdf0e10cSrcweir } 1077*cdf0e10cSrcweir 1078*cdf0e10cSrcweir 1079*cdf0e10cSrcweir //============================================================================ 1080*cdf0e10cSrcweir // class ScUndoReplace 1081*cdf0e10cSrcweir // 1082*cdf0e10cSrcweir // Ersetzen 1083*cdf0e10cSrcweir 1084*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1085*cdf0e10cSrcweir 1086*cdf0e10cSrcweir ScUndoReplace::ScUndoReplace( ScDocShell* pNewDocShell, const ScMarkData& rMark, 1087*cdf0e10cSrcweir SCCOL nCurX, SCROW nCurY, SCTAB nCurZ, 1088*cdf0e10cSrcweir const String& rNewUndoStr, ScDocument* pNewUndoDoc, 1089*cdf0e10cSrcweir const SvxSearchItem* pItem ) 1090*cdf0e10cSrcweir // 1091*cdf0e10cSrcweir : ScSimpleUndo( pNewDocShell ), 1092*cdf0e10cSrcweir // 1093*cdf0e10cSrcweir aCursorPos ( nCurX, nCurY, nCurZ ), 1094*cdf0e10cSrcweir aMarkData ( rMark ), 1095*cdf0e10cSrcweir aUndoStr ( rNewUndoStr ), 1096*cdf0e10cSrcweir pUndoDoc ( pNewUndoDoc ) 1097*cdf0e10cSrcweir { 1098*cdf0e10cSrcweir pSearchItem = new SvxSearchItem( *pItem ); 1099*cdf0e10cSrcweir SetChangeTrack(); 1100*cdf0e10cSrcweir } 1101*cdf0e10cSrcweir 1102*cdf0e10cSrcweir 1103*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1104*cdf0e10cSrcweir 1105*cdf0e10cSrcweir __EXPORT ScUndoReplace::~ScUndoReplace() 1106*cdf0e10cSrcweir { 1107*cdf0e10cSrcweir delete pUndoDoc; 1108*cdf0e10cSrcweir delete pSearchItem; 1109*cdf0e10cSrcweir } 1110*cdf0e10cSrcweir 1111*cdf0e10cSrcweir 1112*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1113*cdf0e10cSrcweir 1114*cdf0e10cSrcweir void ScUndoReplace::SetChangeTrack() 1115*cdf0e10cSrcweir { 1116*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1117*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack(); 1118*cdf0e10cSrcweir if ( pChangeTrack ) 1119*cdf0e10cSrcweir { 1120*cdf0e10cSrcweir if ( pUndoDoc ) 1121*cdf0e10cSrcweir { //! im UndoDoc stehen nur die geaenderten Zellen, 1122*cdf0e10cSrcweir // deswegen per Iterator moeglich 1123*cdf0e10cSrcweir pChangeTrack->AppendContentsIfInRefDoc( pUndoDoc, 1124*cdf0e10cSrcweir nStartChangeAction, nEndChangeAction ); 1125*cdf0e10cSrcweir } 1126*cdf0e10cSrcweir else 1127*cdf0e10cSrcweir { 1128*cdf0e10cSrcweir nStartChangeAction = pChangeTrack->GetActionMax() + 1; 1129*cdf0e10cSrcweir ScChangeActionContent* pContent = new ScChangeActionContent( 1130*cdf0e10cSrcweir ScRange( aCursorPos) ); 1131*cdf0e10cSrcweir pContent->SetOldValue( aUndoStr, pDoc ); 1132*cdf0e10cSrcweir pContent->SetNewValue( pDoc->GetCell( aCursorPos ), pDoc ); 1133*cdf0e10cSrcweir pChangeTrack->Append( pContent ); 1134*cdf0e10cSrcweir nEndChangeAction = pChangeTrack->GetActionMax(); 1135*cdf0e10cSrcweir } 1136*cdf0e10cSrcweir } 1137*cdf0e10cSrcweir else 1138*cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0; 1139*cdf0e10cSrcweir } 1140*cdf0e10cSrcweir 1141*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1142*cdf0e10cSrcweir 1143*cdf0e10cSrcweir String __EXPORT ScUndoReplace::GetComment() const 1144*cdf0e10cSrcweir { 1145*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_REPLACE ); // "Ersetzen" 1146*cdf0e10cSrcweir } 1147*cdf0e10cSrcweir 1148*cdf0e10cSrcweir 1149*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1150*cdf0e10cSrcweir 1151*cdf0e10cSrcweir void __EXPORT ScUndoReplace::Undo() 1152*cdf0e10cSrcweir { 1153*cdf0e10cSrcweir BeginUndo(); 1154*cdf0e10cSrcweir 1155*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1156*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 1157*cdf0e10cSrcweir 1158*cdf0e10cSrcweir ShowTable( aCursorPos.Tab() ); 1159*cdf0e10cSrcweir 1160*cdf0e10cSrcweir if (pUndoDoc) // nur bei ReplaceAll !! 1161*cdf0e10cSrcweir { 1162*cdf0e10cSrcweir DBG_ASSERT(pSearchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL, 1163*cdf0e10cSrcweir "ScUndoReplace:: Falscher Modus"); 1164*cdf0e10cSrcweir 1165*cdf0e10cSrcweir SetViewMarkData( aMarkData ); 1166*cdf0e10cSrcweir 1167*cdf0e10cSrcweir //! markierte Tabellen 1168*cdf0e10cSrcweir //! Bereich merken ? 1169*cdf0e10cSrcweir 1170*cdf0e10cSrcweir // Undo-Dokument hat keine Zeilen-/Spalten-Infos, also mit bColRowFlags = FALSE 1171*cdf0e10cSrcweir // kopieren, um Outline-Gruppen nicht kaputtzumachen. 1172*cdf0e10cSrcweir 1173*cdf0e10cSrcweir sal_uInt16 nUndoFlags = (pSearchItem->GetPattern()) ? IDF_ATTRIB : IDF_CONTENTS; 1174*cdf0e10cSrcweir pUndoDoc->CopyToDocument( 0, 0, 0, 1175*cdf0e10cSrcweir MAXCOL, MAXROW, MAXTAB, 1176*cdf0e10cSrcweir nUndoFlags, sal_False, pDoc, NULL, sal_False ); // ohne Row-Flags 1177*cdf0e10cSrcweir pDocShell->PostPaintGridAll(); 1178*cdf0e10cSrcweir } 1179*cdf0e10cSrcweir else if (pSearchItem->GetPattern() && 1180*cdf0e10cSrcweir pSearchItem->GetCommand() == SVX_SEARCHCMD_REPLACE) 1181*cdf0e10cSrcweir { 1182*cdf0e10cSrcweir String aTempStr = pSearchItem->GetSearchString(); // vertauschen 1183*cdf0e10cSrcweir pSearchItem->SetSearchString(pSearchItem->GetReplaceString()); 1184*cdf0e10cSrcweir pSearchItem->SetReplaceString(aTempStr); 1185*cdf0e10cSrcweir pDoc->ReplaceStyle( *pSearchItem, 1186*cdf0e10cSrcweir aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), 1187*cdf0e10cSrcweir aMarkData, sal_True); 1188*cdf0e10cSrcweir pSearchItem->SetReplaceString(pSearchItem->GetSearchString()); 1189*cdf0e10cSrcweir pSearchItem->SetSearchString(aTempStr); 1190*cdf0e10cSrcweir if (pViewShell) 1191*cdf0e10cSrcweir pViewShell->MoveCursorAbs( aCursorPos.Col(), aCursorPos.Row(), 1192*cdf0e10cSrcweir SC_FOLLOW_JUMP, sal_False, sal_False ); 1193*cdf0e10cSrcweir pDocShell->PostPaintGridAll(); 1194*cdf0e10cSrcweir } 1195*cdf0e10cSrcweir else if (pSearchItem->GetCellType() == SVX_SEARCHIN_NOTE) 1196*cdf0e10cSrcweir { 1197*cdf0e10cSrcweir ScPostIt* pNote = pDoc->GetNote( aCursorPos ); 1198*cdf0e10cSrcweir DBG_ASSERT( pNote, "ScUndoReplace::Undo - cell does not contain a note" ); 1199*cdf0e10cSrcweir if (pNote) 1200*cdf0e10cSrcweir pNote->SetText( aCursorPos, aUndoStr ); 1201*cdf0e10cSrcweir if (pViewShell) 1202*cdf0e10cSrcweir pViewShell->MoveCursorAbs( aCursorPos.Col(), aCursorPos.Row(), 1203*cdf0e10cSrcweir SC_FOLLOW_JUMP, sal_False, sal_False ); 1204*cdf0e10cSrcweir } 1205*cdf0e10cSrcweir else 1206*cdf0e10cSrcweir { 1207*cdf0e10cSrcweir // #78889# aUndoStr may contain line breaks 1208*cdf0e10cSrcweir if ( aUndoStr.Search('\n') != STRING_NOTFOUND ) 1209*cdf0e10cSrcweir pDoc->PutCell( aCursorPos, new ScEditCell( aUndoStr, pDoc ) ); 1210*cdf0e10cSrcweir else 1211*cdf0e10cSrcweir pDoc->SetString( aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), aUndoStr ); 1212*cdf0e10cSrcweir if (pViewShell) 1213*cdf0e10cSrcweir pViewShell->MoveCursorAbs( aCursorPos.Col(), aCursorPos.Row(), 1214*cdf0e10cSrcweir SC_FOLLOW_JUMP, sal_False, sal_False ); 1215*cdf0e10cSrcweir pDocShell->PostPaintGridAll(); 1216*cdf0e10cSrcweir } 1217*cdf0e10cSrcweir 1218*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack(); 1219*cdf0e10cSrcweir if ( pChangeTrack ) 1220*cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction ); 1221*cdf0e10cSrcweir 1222*cdf0e10cSrcweir EndUndo(); 1223*cdf0e10cSrcweir } 1224*cdf0e10cSrcweir 1225*cdf0e10cSrcweir 1226*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1227*cdf0e10cSrcweir 1228*cdf0e10cSrcweir void __EXPORT ScUndoReplace::Redo() 1229*cdf0e10cSrcweir { 1230*cdf0e10cSrcweir BeginRedo(); 1231*cdf0e10cSrcweir 1232*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1233*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 1234*cdf0e10cSrcweir 1235*cdf0e10cSrcweir if (pViewShell) 1236*cdf0e10cSrcweir pViewShell->MoveCursorAbs( aCursorPos.Col(), aCursorPos.Row(), 1237*cdf0e10cSrcweir SC_FOLLOW_JUMP, sal_False, sal_False ); 1238*cdf0e10cSrcweir if (pUndoDoc) 1239*cdf0e10cSrcweir { 1240*cdf0e10cSrcweir if (pViewShell) 1241*cdf0e10cSrcweir { 1242*cdf0e10cSrcweir SetViewMarkData( aMarkData ); 1243*cdf0e10cSrcweir 1244*cdf0e10cSrcweir pViewShell->SearchAndReplace( pSearchItem, sal_False, sal_True ); 1245*cdf0e10cSrcweir } 1246*cdf0e10cSrcweir } 1247*cdf0e10cSrcweir else if (pSearchItem->GetPattern() && 1248*cdf0e10cSrcweir pSearchItem->GetCommand() == SVX_SEARCHCMD_REPLACE) 1249*cdf0e10cSrcweir { 1250*cdf0e10cSrcweir pDoc->ReplaceStyle( *pSearchItem, 1251*cdf0e10cSrcweir aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), 1252*cdf0e10cSrcweir aMarkData, sal_True); 1253*cdf0e10cSrcweir pDocShell->PostPaintGridAll(); 1254*cdf0e10cSrcweir } 1255*cdf0e10cSrcweir else 1256*cdf0e10cSrcweir if (pViewShell) 1257*cdf0e10cSrcweir pViewShell->SearchAndReplace( pSearchItem, sal_False, sal_True ); 1258*cdf0e10cSrcweir 1259*cdf0e10cSrcweir SetChangeTrack(); 1260*cdf0e10cSrcweir 1261*cdf0e10cSrcweir EndRedo(); 1262*cdf0e10cSrcweir } 1263*cdf0e10cSrcweir 1264*cdf0e10cSrcweir 1265*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1266*cdf0e10cSrcweir 1267*cdf0e10cSrcweir void __EXPORT ScUndoReplace::Repeat(SfxRepeatTarget& rTarget) 1268*cdf0e10cSrcweir { 1269*cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget)) 1270*cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->SearchAndReplace( pSearchItem, sal_True, sal_False ); 1271*cdf0e10cSrcweir } 1272*cdf0e10cSrcweir 1273*cdf0e10cSrcweir 1274*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1275*cdf0e10cSrcweir 1276*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoReplace::CanRepeat(SfxRepeatTarget& rTarget) const 1277*cdf0e10cSrcweir { 1278*cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget)); 1279*cdf0e10cSrcweir } 1280*cdf0e10cSrcweir 1281*cdf0e10cSrcweir 1282*cdf0e10cSrcweir //============================================================================ 1283*cdf0e10cSrcweir // class ScUndoTabOp 1284*cdf0e10cSrcweir // 1285*cdf0e10cSrcweir // Mehrfachoperation (nur einfache Bloecke) 1286*cdf0e10cSrcweir 1287*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1288*cdf0e10cSrcweir 1289*cdf0e10cSrcweir ScUndoTabOp::ScUndoTabOp( ScDocShell* pNewDocShell, 1290*cdf0e10cSrcweir SCCOL nStartX, SCROW nStartY, SCTAB nStartZ, 1291*cdf0e10cSrcweir SCCOL nEndX, SCROW nEndY, SCTAB nEndZ, ScDocument* pNewUndoDoc, 1292*cdf0e10cSrcweir const ScRefAddress& rFormulaCell, 1293*cdf0e10cSrcweir const ScRefAddress& rFormulaEnd, 1294*cdf0e10cSrcweir const ScRefAddress& rRowCell, 1295*cdf0e10cSrcweir const ScRefAddress& rColCell, 1296*cdf0e10cSrcweir sal_uInt8 nMd ) 1297*cdf0e10cSrcweir // 1298*cdf0e10cSrcweir : ScSimpleUndo( pNewDocShell ), 1299*cdf0e10cSrcweir // 1300*cdf0e10cSrcweir aRange ( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ), 1301*cdf0e10cSrcweir pUndoDoc ( pNewUndoDoc ), 1302*cdf0e10cSrcweir theFormulaCell ( rFormulaCell ), 1303*cdf0e10cSrcweir theFormulaEnd ( rFormulaEnd ), 1304*cdf0e10cSrcweir theRowCell ( rRowCell ), 1305*cdf0e10cSrcweir theColCell ( rColCell ), 1306*cdf0e10cSrcweir nMode ( nMd ) 1307*cdf0e10cSrcweir { 1308*cdf0e10cSrcweir } 1309*cdf0e10cSrcweir 1310*cdf0e10cSrcweir 1311*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1312*cdf0e10cSrcweir 1313*cdf0e10cSrcweir __EXPORT ScUndoTabOp::~ScUndoTabOp() 1314*cdf0e10cSrcweir { 1315*cdf0e10cSrcweir delete pUndoDoc; 1316*cdf0e10cSrcweir } 1317*cdf0e10cSrcweir 1318*cdf0e10cSrcweir 1319*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1320*cdf0e10cSrcweir 1321*cdf0e10cSrcweir String __EXPORT ScUndoTabOp::GetComment() const 1322*cdf0e10cSrcweir { 1323*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_TABOP ); // "Mehrfachoperation" 1324*cdf0e10cSrcweir } 1325*cdf0e10cSrcweir 1326*cdf0e10cSrcweir 1327*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1328*cdf0e10cSrcweir 1329*cdf0e10cSrcweir void __EXPORT ScUndoTabOp::Undo() 1330*cdf0e10cSrcweir { 1331*cdf0e10cSrcweir BeginUndo(); 1332*cdf0e10cSrcweir 1333*cdf0e10cSrcweir ScUndoUtil::MarkSimpleBlock( pDocShell, aRange ); 1334*cdf0e10cSrcweir 1335*cdf0e10cSrcweir sal_uInt16 nExtFlags = 0; 1336*cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aRange ); 1337*cdf0e10cSrcweir 1338*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1339*cdf0e10cSrcweir pDoc->DeleteAreaTab( aRange,IDF_ALL & ~IDF_NOTE ); 1340*cdf0e10cSrcweir pUndoDoc->CopyToDocument( aRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc ); 1341*cdf0e10cSrcweir pDocShell->PostPaint( aRange, PAINT_GRID, nExtFlags ); 1342*cdf0e10cSrcweir pDocShell->PostDataChanged(); 1343*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 1344*cdf0e10cSrcweir if (pViewShell) 1345*cdf0e10cSrcweir pViewShell->CellContentChanged(); 1346*cdf0e10cSrcweir 1347*cdf0e10cSrcweir EndUndo(); 1348*cdf0e10cSrcweir } 1349*cdf0e10cSrcweir 1350*cdf0e10cSrcweir 1351*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1352*cdf0e10cSrcweir 1353*cdf0e10cSrcweir void __EXPORT ScUndoTabOp::Redo() 1354*cdf0e10cSrcweir { 1355*cdf0e10cSrcweir BeginRedo(); 1356*cdf0e10cSrcweir 1357*cdf0e10cSrcweir ScUndoUtil::MarkSimpleBlock( pDocShell, aRange ); 1358*cdf0e10cSrcweir 1359*cdf0e10cSrcweir ScTabOpParam aParam( theFormulaCell, theFormulaEnd, 1360*cdf0e10cSrcweir theRowCell, theColCell, 1361*cdf0e10cSrcweir nMode ); 1362*cdf0e10cSrcweir 1363*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 1364*cdf0e10cSrcweir if (pViewShell) 1365*cdf0e10cSrcweir pViewShell->TabOp( aParam, sal_False); 1366*cdf0e10cSrcweir 1367*cdf0e10cSrcweir EndRedo(); 1368*cdf0e10cSrcweir } 1369*cdf0e10cSrcweir 1370*cdf0e10cSrcweir 1371*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1372*cdf0e10cSrcweir 1373*cdf0e10cSrcweir void __EXPORT ScUndoTabOp::Repeat(SfxRepeatTarget& /* rTarget */) 1374*cdf0e10cSrcweir { 1375*cdf0e10cSrcweir } 1376*cdf0e10cSrcweir 1377*cdf0e10cSrcweir 1378*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1379*cdf0e10cSrcweir 1380*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoTabOp::CanRepeat(SfxRepeatTarget& /* rTarget */) const 1381*cdf0e10cSrcweir { 1382*cdf0e10cSrcweir return sal_False; 1383*cdf0e10cSrcweir } 1384*cdf0e10cSrcweir 1385*cdf0e10cSrcweir 1386*cdf0e10cSrcweir //============================================================================ 1387*cdf0e10cSrcweir // class ScUndoConversion 1388*cdf0e10cSrcweir // 1389*cdf0e10cSrcweir // Spelling 1390*cdf0e10cSrcweir 1391*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1392*cdf0e10cSrcweir 1393*cdf0e10cSrcweir ScUndoConversion::ScUndoConversion( 1394*cdf0e10cSrcweir ScDocShell* pNewDocShell, const ScMarkData& rMark, 1395*cdf0e10cSrcweir SCCOL nCurX, SCROW nCurY, SCTAB nCurZ, ScDocument* pNewUndoDoc, 1396*cdf0e10cSrcweir SCCOL nNewX, SCROW nNewY, SCTAB nNewZ, ScDocument* pNewRedoDoc, 1397*cdf0e10cSrcweir const ScConversionParam& rConvParam ) : 1398*cdf0e10cSrcweir ScSimpleUndo( pNewDocShell ), 1399*cdf0e10cSrcweir aMarkData( rMark ), 1400*cdf0e10cSrcweir aCursorPos( nCurX, nCurY, nCurZ ), 1401*cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ), 1402*cdf0e10cSrcweir aNewCursorPos( nNewX, nNewY, nNewZ ), 1403*cdf0e10cSrcweir pRedoDoc( pNewRedoDoc ), 1404*cdf0e10cSrcweir maConvParam( rConvParam ) 1405*cdf0e10cSrcweir { 1406*cdf0e10cSrcweir SetChangeTrack(); 1407*cdf0e10cSrcweir } 1408*cdf0e10cSrcweir 1409*cdf0e10cSrcweir 1410*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1411*cdf0e10cSrcweir 1412*cdf0e10cSrcweir __EXPORT ScUndoConversion::~ScUndoConversion() 1413*cdf0e10cSrcweir { 1414*cdf0e10cSrcweir delete pUndoDoc; 1415*cdf0e10cSrcweir delete pRedoDoc; 1416*cdf0e10cSrcweir } 1417*cdf0e10cSrcweir 1418*cdf0e10cSrcweir 1419*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1420*cdf0e10cSrcweir 1421*cdf0e10cSrcweir void ScUndoConversion::SetChangeTrack() 1422*cdf0e10cSrcweir { 1423*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1424*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack(); 1425*cdf0e10cSrcweir if ( pChangeTrack ) 1426*cdf0e10cSrcweir { 1427*cdf0e10cSrcweir if ( pUndoDoc ) 1428*cdf0e10cSrcweir pChangeTrack->AppendContentsIfInRefDoc( pUndoDoc, 1429*cdf0e10cSrcweir nStartChangeAction, nEndChangeAction ); 1430*cdf0e10cSrcweir else 1431*cdf0e10cSrcweir { 1432*cdf0e10cSrcweir DBG_ERROR( "ScUndoConversion::SetChangeTrack: kein UndoDoc" ); 1433*cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0; 1434*cdf0e10cSrcweir } 1435*cdf0e10cSrcweir } 1436*cdf0e10cSrcweir else 1437*cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0; 1438*cdf0e10cSrcweir } 1439*cdf0e10cSrcweir 1440*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1441*cdf0e10cSrcweir 1442*cdf0e10cSrcweir String ScUndoConversion::GetComment() const 1443*cdf0e10cSrcweir { 1444*cdf0e10cSrcweir String aText; 1445*cdf0e10cSrcweir switch( maConvParam.GetType() ) 1446*cdf0e10cSrcweir { 1447*cdf0e10cSrcweir case SC_CONVERSION_SPELLCHECK: aText = ScGlobal::GetRscString( STR_UNDO_SPELLING ); break; 1448*cdf0e10cSrcweir case SC_CONVERSION_HANGULHANJA: aText = ScGlobal::GetRscString( STR_UNDO_HANGULHANJA ); break; 1449*cdf0e10cSrcweir case SC_CONVERSION_CHINESE_TRANSL: aText = ScGlobal::GetRscString( STR_UNDO_CHINESE_TRANSLATION ); break; 1450*cdf0e10cSrcweir default: DBG_ERRORFILE( "ScUndoConversion::GetComment - unknown conversion type" ); 1451*cdf0e10cSrcweir } 1452*cdf0e10cSrcweir return aText; 1453*cdf0e10cSrcweir } 1454*cdf0e10cSrcweir 1455*cdf0e10cSrcweir 1456*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1457*cdf0e10cSrcweir 1458*cdf0e10cSrcweir void ScUndoConversion::DoChange( ScDocument* pRefDoc, const ScAddress& rCursorPos ) 1459*cdf0e10cSrcweir { 1460*cdf0e10cSrcweir if (pRefDoc) 1461*cdf0e10cSrcweir { 1462*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1463*cdf0e10cSrcweir ShowTable( rCursorPos.Tab() ); 1464*cdf0e10cSrcweir 1465*cdf0e10cSrcweir SetViewMarkData( aMarkData ); 1466*cdf0e10cSrcweir 1467*cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 1468*cdf0e10cSrcweir // Undo/Redo-doc has only selected tables 1469*cdf0e10cSrcweir 1470*cdf0e10cSrcweir sal_Bool bMulti = aMarkData.IsMultiMarked(); 1471*cdf0e10cSrcweir pRefDoc->CopyToDocument( 0, 0, 0, 1472*cdf0e10cSrcweir MAXCOL, MAXROW, nTabCount-1, 1473*cdf0e10cSrcweir IDF_CONTENTS, bMulti, pDoc, &aMarkData ); 1474*cdf0e10cSrcweir pDocShell->PostPaintGridAll(); 1475*cdf0e10cSrcweir } 1476*cdf0e10cSrcweir else 1477*cdf0e10cSrcweir { 1478*cdf0e10cSrcweir DBG_ERROR("Kein Un-/RedoDoc bei Un-/RedoSpelling"); 1479*cdf0e10cSrcweir } 1480*cdf0e10cSrcweir } 1481*cdf0e10cSrcweir 1482*cdf0e10cSrcweir 1483*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1484*cdf0e10cSrcweir 1485*cdf0e10cSrcweir void ScUndoConversion::Undo() 1486*cdf0e10cSrcweir { 1487*cdf0e10cSrcweir BeginUndo(); 1488*cdf0e10cSrcweir DoChange( pUndoDoc, aCursorPos ); 1489*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack(); 1490*cdf0e10cSrcweir if ( pChangeTrack ) 1491*cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction ); 1492*cdf0e10cSrcweir EndUndo(); 1493*cdf0e10cSrcweir } 1494*cdf0e10cSrcweir 1495*cdf0e10cSrcweir 1496*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1497*cdf0e10cSrcweir 1498*cdf0e10cSrcweir void ScUndoConversion::Redo() 1499*cdf0e10cSrcweir { 1500*cdf0e10cSrcweir BeginRedo(); 1501*cdf0e10cSrcweir DoChange( pRedoDoc, aNewCursorPos ); 1502*cdf0e10cSrcweir SetChangeTrack(); 1503*cdf0e10cSrcweir EndRedo(); 1504*cdf0e10cSrcweir } 1505*cdf0e10cSrcweir 1506*cdf0e10cSrcweir 1507*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1508*cdf0e10cSrcweir 1509*cdf0e10cSrcweir void ScUndoConversion::Repeat( SfxRepeatTarget& rTarget ) 1510*cdf0e10cSrcweir { 1511*cdf0e10cSrcweir if( rTarget.ISA( ScTabViewTarget ) ) 1512*cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->DoSheetConversion( maConvParam, sal_True ); 1513*cdf0e10cSrcweir } 1514*cdf0e10cSrcweir 1515*cdf0e10cSrcweir 1516*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1517*cdf0e10cSrcweir 1518*cdf0e10cSrcweir sal_Bool ScUndoConversion::CanRepeat(SfxRepeatTarget& rTarget) const 1519*cdf0e10cSrcweir { 1520*cdf0e10cSrcweir return rTarget.ISA( ScTabViewTarget ); 1521*cdf0e10cSrcweir } 1522*cdf0e10cSrcweir 1523*cdf0e10cSrcweir 1524*cdf0e10cSrcweir //============================================================================ 1525*cdf0e10cSrcweir // class ScUndoRefConversion 1526*cdf0e10cSrcweir // 1527*cdf0e10cSrcweir // cell reference conversion 1528*cdf0e10cSrcweir 1529*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1530*cdf0e10cSrcweir 1531*cdf0e10cSrcweir ScUndoRefConversion::ScUndoRefConversion( ScDocShell* pNewDocShell, 1532*cdf0e10cSrcweir const ScRange& aMarkRange, const ScMarkData& rMark, 1533*cdf0e10cSrcweir ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc, sal_Bool bNewMulti, sal_uInt16 nNewFlag) : 1534*cdf0e10cSrcweir ScSimpleUndo( pNewDocShell ), 1535*cdf0e10cSrcweir aMarkData ( rMark ), 1536*cdf0e10cSrcweir pUndoDoc ( pNewUndoDoc ), 1537*cdf0e10cSrcweir pRedoDoc ( pNewRedoDoc ), 1538*cdf0e10cSrcweir aRange ( aMarkRange ), 1539*cdf0e10cSrcweir bMulti ( bNewMulti ), 1540*cdf0e10cSrcweir nFlags ( nNewFlag ) 1541*cdf0e10cSrcweir { 1542*cdf0e10cSrcweir SetChangeTrack(); 1543*cdf0e10cSrcweir } 1544*cdf0e10cSrcweir 1545*cdf0e10cSrcweir __EXPORT ScUndoRefConversion::~ScUndoRefConversion() 1546*cdf0e10cSrcweir { 1547*cdf0e10cSrcweir delete pUndoDoc; 1548*cdf0e10cSrcweir delete pRedoDoc; 1549*cdf0e10cSrcweir } 1550*cdf0e10cSrcweir 1551*cdf0e10cSrcweir String __EXPORT ScUndoRefConversion::GetComment() const 1552*cdf0e10cSrcweir { 1553*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_ENTERDATA ); // "Eingabe" 1554*cdf0e10cSrcweir } 1555*cdf0e10cSrcweir 1556*cdf0e10cSrcweir void ScUndoRefConversion::SetChangeTrack() 1557*cdf0e10cSrcweir { 1558*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack(); 1559*cdf0e10cSrcweir if ( pChangeTrack && (nFlags & IDF_FORMULA) ) 1560*cdf0e10cSrcweir pChangeTrack->AppendContentsIfInRefDoc( pUndoDoc, 1561*cdf0e10cSrcweir nStartChangeAction, nEndChangeAction ); 1562*cdf0e10cSrcweir else 1563*cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0; 1564*cdf0e10cSrcweir } 1565*cdf0e10cSrcweir 1566*cdf0e10cSrcweir void ScUndoRefConversion::DoChange( ScDocument* pRefDoc) 1567*cdf0e10cSrcweir { 1568*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1569*cdf0e10cSrcweir 1570*cdf0e10cSrcweir ShowTable(aRange); 1571*cdf0e10cSrcweir 1572*cdf0e10cSrcweir SetViewMarkData( aMarkData ); 1573*cdf0e10cSrcweir 1574*cdf0e10cSrcweir ScRange aCopyRange = aRange; 1575*cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 1576*cdf0e10cSrcweir aCopyRange.aStart.SetTab(0); 1577*cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1); 1578*cdf0e10cSrcweir pRefDoc->CopyToDocument( aCopyRange, nFlags, bMulti, pDoc, &aMarkData ); 1579*cdf0e10cSrcweir pDocShell->PostPaint( aRange, PAINT_GRID); 1580*cdf0e10cSrcweir pDocShell->PostDataChanged(); 1581*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 1582*cdf0e10cSrcweir if (pViewShell) 1583*cdf0e10cSrcweir pViewShell->CellContentChanged(); 1584*cdf0e10cSrcweir } 1585*cdf0e10cSrcweir void __EXPORT ScUndoRefConversion::Undo() 1586*cdf0e10cSrcweir { 1587*cdf0e10cSrcweir BeginUndo(); 1588*cdf0e10cSrcweir if (pUndoDoc) 1589*cdf0e10cSrcweir DoChange(pUndoDoc); 1590*cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack(); 1591*cdf0e10cSrcweir if ( pChangeTrack ) 1592*cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction ); 1593*cdf0e10cSrcweir EndUndo(); 1594*cdf0e10cSrcweir } 1595*cdf0e10cSrcweir 1596*cdf0e10cSrcweir void __EXPORT ScUndoRefConversion::Redo() 1597*cdf0e10cSrcweir { 1598*cdf0e10cSrcweir BeginRedo(); 1599*cdf0e10cSrcweir if (pRedoDoc) 1600*cdf0e10cSrcweir DoChange(pRedoDoc); 1601*cdf0e10cSrcweir SetChangeTrack(); 1602*cdf0e10cSrcweir EndRedo(); 1603*cdf0e10cSrcweir } 1604*cdf0e10cSrcweir 1605*cdf0e10cSrcweir void __EXPORT ScUndoRefConversion::Repeat(SfxRepeatTarget& rTarget) 1606*cdf0e10cSrcweir { 1607*cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget)) 1608*cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->DoRefConversion(); 1609*cdf0e10cSrcweir } 1610*cdf0e10cSrcweir 1611*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoRefConversion::CanRepeat(SfxRepeatTarget& rTarget) const 1612*cdf0e10cSrcweir { 1613*cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget)); 1614*cdf0e10cSrcweir } 1615*cdf0e10cSrcweir //============================================================================ 1616*cdf0e10cSrcweir // class ScUndoRefreshLink 1617*cdf0e10cSrcweir // 1618*cdf0e10cSrcweir // Link aktualisieren / aendern 1619*cdf0e10cSrcweir 1620*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1621*cdf0e10cSrcweir 1622*cdf0e10cSrcweir ScUndoRefreshLink::ScUndoRefreshLink( ScDocShell* pNewDocShell, 1623*cdf0e10cSrcweir ScDocument* pNewUndoDoc ) 1624*cdf0e10cSrcweir // 1625*cdf0e10cSrcweir : ScSimpleUndo( pNewDocShell ), 1626*cdf0e10cSrcweir // 1627*cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ), 1628*cdf0e10cSrcweir pRedoDoc( NULL ) 1629*cdf0e10cSrcweir { 1630*cdf0e10cSrcweir } 1631*cdf0e10cSrcweir 1632*cdf0e10cSrcweir 1633*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1634*cdf0e10cSrcweir 1635*cdf0e10cSrcweir __EXPORT ScUndoRefreshLink::~ScUndoRefreshLink() 1636*cdf0e10cSrcweir { 1637*cdf0e10cSrcweir delete pUndoDoc; 1638*cdf0e10cSrcweir delete pRedoDoc; 1639*cdf0e10cSrcweir } 1640*cdf0e10cSrcweir 1641*cdf0e10cSrcweir 1642*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1643*cdf0e10cSrcweir 1644*cdf0e10cSrcweir String __EXPORT ScUndoRefreshLink::GetComment() const 1645*cdf0e10cSrcweir { 1646*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_UPDATELINK ); 1647*cdf0e10cSrcweir } 1648*cdf0e10cSrcweir 1649*cdf0e10cSrcweir 1650*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1651*cdf0e10cSrcweir 1652*cdf0e10cSrcweir void __EXPORT ScUndoRefreshLink::Undo() 1653*cdf0e10cSrcweir { 1654*cdf0e10cSrcweir BeginUndo(); 1655*cdf0e10cSrcweir 1656*cdf0e10cSrcweir sal_Bool bMakeRedo = !pRedoDoc; 1657*cdf0e10cSrcweir if (bMakeRedo) 1658*cdf0e10cSrcweir pRedoDoc = new ScDocument( SCDOCMODE_UNDO ); 1659*cdf0e10cSrcweir 1660*cdf0e10cSrcweir sal_Bool bFirst = sal_True; 1661*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1662*cdf0e10cSrcweir SCTAB nCount = pDoc->GetTableCount(); 1663*cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nCount; nTab++) 1664*cdf0e10cSrcweir if (pUndoDoc->HasTable(nTab)) 1665*cdf0e10cSrcweir { 1666*cdf0e10cSrcweir ScRange aRange(0,0,nTab,MAXCOL,MAXROW,nTab); 1667*cdf0e10cSrcweir if (bMakeRedo) 1668*cdf0e10cSrcweir { 1669*cdf0e10cSrcweir if (bFirst) 1670*cdf0e10cSrcweir pRedoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True ); 1671*cdf0e10cSrcweir else 1672*cdf0e10cSrcweir pRedoDoc->AddUndoTab( nTab, nTab, sal_True, sal_True ); 1673*cdf0e10cSrcweir bFirst = sal_False; 1674*cdf0e10cSrcweir pDoc->CopyToDocument(aRange, IDF_ALL, sal_False, pRedoDoc); 1675*cdf0e10cSrcweir // pRedoDoc->TransferDrawPage( pDoc, nTab, nTab ); 1676*cdf0e10cSrcweir pRedoDoc->SetLink( nTab, 1677*cdf0e10cSrcweir pDoc->GetLinkMode(nTab), 1678*cdf0e10cSrcweir pDoc->GetLinkDoc(nTab), 1679*cdf0e10cSrcweir pDoc->GetLinkFlt(nTab), 1680*cdf0e10cSrcweir pDoc->GetLinkOpt(nTab), 1681*cdf0e10cSrcweir pDoc->GetLinkTab(nTab), 1682*cdf0e10cSrcweir pDoc->GetLinkRefreshDelay(nTab) ); 1683*cdf0e10cSrcweir } 1684*cdf0e10cSrcweir 1685*cdf0e10cSrcweir pDoc->DeleteAreaTab( aRange,IDF_ALL ); 1686*cdf0e10cSrcweir pUndoDoc->CopyToDocument( aRange, IDF_ALL, sal_False, pDoc ); 1687*cdf0e10cSrcweir // pDoc->TransferDrawPage( pUndoDoc, nTab, nTab ); 1688*cdf0e10cSrcweir pDoc->SetLink( nTab, pUndoDoc->GetLinkMode(nTab), pUndoDoc->GetLinkDoc(nTab), 1689*cdf0e10cSrcweir pUndoDoc->GetLinkFlt(nTab), pUndoDoc->GetLinkOpt(nTab), 1690*cdf0e10cSrcweir pUndoDoc->GetLinkTab(nTab), 1691*cdf0e10cSrcweir pUndoDoc->GetLinkRefreshDelay(nTab) ); 1692*cdf0e10cSrcweir } 1693*cdf0e10cSrcweir 1694*cdf0e10cSrcweir pDocShell->PostPaintGridAll(); 1695*cdf0e10cSrcweir 1696*cdf0e10cSrcweir EndUndo(); 1697*cdf0e10cSrcweir } 1698*cdf0e10cSrcweir 1699*cdf0e10cSrcweir 1700*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1701*cdf0e10cSrcweir 1702*cdf0e10cSrcweir void __EXPORT ScUndoRefreshLink::Redo() 1703*cdf0e10cSrcweir { 1704*cdf0e10cSrcweir DBG_ASSERT(pRedoDoc, "Kein RedoDoc bei ScUndoRefreshLink::Redo"); 1705*cdf0e10cSrcweir 1706*cdf0e10cSrcweir BeginUndo(); 1707*cdf0e10cSrcweir 1708*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1709*cdf0e10cSrcweir SCTAB nCount = pDoc->GetTableCount(); 1710*cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nCount; nTab++) 1711*cdf0e10cSrcweir if (pRedoDoc->HasTable(nTab)) 1712*cdf0e10cSrcweir { 1713*cdf0e10cSrcweir ScRange aRange(0,0,nTab,MAXCOL,MAXROW,nTab); 1714*cdf0e10cSrcweir 1715*cdf0e10cSrcweir pDoc->DeleteAreaTab( aRange, IDF_ALL ); 1716*cdf0e10cSrcweir pRedoDoc->CopyToDocument( aRange, IDF_ALL, sal_False, pDoc ); 1717*cdf0e10cSrcweir // pDoc->TransferDrawPage( pRedoDoc, nTab, nTab ); 1718*cdf0e10cSrcweir pDoc->SetLink( nTab, 1719*cdf0e10cSrcweir pRedoDoc->GetLinkMode(nTab), 1720*cdf0e10cSrcweir pRedoDoc->GetLinkDoc(nTab), 1721*cdf0e10cSrcweir pRedoDoc->GetLinkFlt(nTab), 1722*cdf0e10cSrcweir pRedoDoc->GetLinkOpt(nTab), 1723*cdf0e10cSrcweir pRedoDoc->GetLinkTab(nTab), 1724*cdf0e10cSrcweir pRedoDoc->GetLinkRefreshDelay(nTab) ); 1725*cdf0e10cSrcweir } 1726*cdf0e10cSrcweir 1727*cdf0e10cSrcweir pDocShell->PostPaintGridAll(); 1728*cdf0e10cSrcweir 1729*cdf0e10cSrcweir EndUndo(); 1730*cdf0e10cSrcweir } 1731*cdf0e10cSrcweir 1732*cdf0e10cSrcweir 1733*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1734*cdf0e10cSrcweir 1735*cdf0e10cSrcweir void __EXPORT ScUndoRefreshLink::Repeat(SfxRepeatTarget& /* rTarget */) 1736*cdf0e10cSrcweir { 1737*cdf0e10cSrcweir // gippsnich 1738*cdf0e10cSrcweir } 1739*cdf0e10cSrcweir 1740*cdf0e10cSrcweir 1741*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1742*cdf0e10cSrcweir 1743*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoRefreshLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const 1744*cdf0e10cSrcweir { 1745*cdf0e10cSrcweir return sal_False; 1746*cdf0e10cSrcweir } 1747*cdf0e10cSrcweir 1748*cdf0e10cSrcweir 1749*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1750*cdf0e10cSrcweir 1751*cdf0e10cSrcweir ScAreaLink* lcl_FindAreaLink( sfx2::LinkManager* pLinkManager, const String& rDoc, 1752*cdf0e10cSrcweir const String& rFlt, const String& rOpt, 1753*cdf0e10cSrcweir const String& rSrc, const ScRange& rDest ) 1754*cdf0e10cSrcweir { 1755*cdf0e10cSrcweir const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks(); 1756*cdf0e10cSrcweir sal_uInt16 nCount = pLinkManager->GetLinks().Count(); 1757*cdf0e10cSrcweir for (sal_uInt16 i=0; i<nCount; i++) 1758*cdf0e10cSrcweir { 1759*cdf0e10cSrcweir ::sfx2::SvBaseLink* pBase = *rLinks[i]; 1760*cdf0e10cSrcweir if (pBase->ISA(ScAreaLink)) 1761*cdf0e10cSrcweir if ( ((ScAreaLink*)pBase)->IsEqual( rDoc, rFlt, rOpt, rSrc, rDest ) ) 1762*cdf0e10cSrcweir return (ScAreaLink*)pBase; 1763*cdf0e10cSrcweir } 1764*cdf0e10cSrcweir 1765*cdf0e10cSrcweir DBG_ERROR("ScAreaLink nicht gefunden"); 1766*cdf0e10cSrcweir return NULL; 1767*cdf0e10cSrcweir } 1768*cdf0e10cSrcweir 1769*cdf0e10cSrcweir 1770*cdf0e10cSrcweir //============================================================================ 1771*cdf0e10cSrcweir // class ScUndoInsertAreaLink 1772*cdf0e10cSrcweir // 1773*cdf0e10cSrcweir // Bereichs-Verknuepfung einfuegen 1774*cdf0e10cSrcweir 1775*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1776*cdf0e10cSrcweir 1777*cdf0e10cSrcweir ScUndoInsertAreaLink::ScUndoInsertAreaLink( ScDocShell* pShell, 1778*cdf0e10cSrcweir const String& rDoc, 1779*cdf0e10cSrcweir const String& rFlt, const String& rOpt, 1780*cdf0e10cSrcweir const String& rArea, const ScRange& rDestRange, 1781*cdf0e10cSrcweir sal_uLong nRefresh ) 1782*cdf0e10cSrcweir // 1783*cdf0e10cSrcweir : ScSimpleUndo ( pShell ), 1784*cdf0e10cSrcweir // 1785*cdf0e10cSrcweir aDocName ( rDoc ), 1786*cdf0e10cSrcweir aFltName ( rFlt ), 1787*cdf0e10cSrcweir aOptions ( rOpt ), 1788*cdf0e10cSrcweir aAreaName ( rArea ), 1789*cdf0e10cSrcweir aRange ( rDestRange ), 1790*cdf0e10cSrcweir nRefreshDelay ( nRefresh ) 1791*cdf0e10cSrcweir { 1792*cdf0e10cSrcweir } 1793*cdf0e10cSrcweir 1794*cdf0e10cSrcweir 1795*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1796*cdf0e10cSrcweir 1797*cdf0e10cSrcweir __EXPORT ScUndoInsertAreaLink::~ScUndoInsertAreaLink() 1798*cdf0e10cSrcweir { 1799*cdf0e10cSrcweir } 1800*cdf0e10cSrcweir 1801*cdf0e10cSrcweir 1802*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1803*cdf0e10cSrcweir 1804*cdf0e10cSrcweir String __EXPORT ScUndoInsertAreaLink::GetComment() const 1805*cdf0e10cSrcweir { 1806*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_INSERTAREALINK ); 1807*cdf0e10cSrcweir } 1808*cdf0e10cSrcweir 1809*cdf0e10cSrcweir 1810*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1811*cdf0e10cSrcweir 1812*cdf0e10cSrcweir void __EXPORT ScUndoInsertAreaLink::Undo() 1813*cdf0e10cSrcweir { 1814*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1815*cdf0e10cSrcweir sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager(); 1816*cdf0e10cSrcweir 1817*cdf0e10cSrcweir ScAreaLink* pLink = lcl_FindAreaLink( pLinkManager, aDocName, aFltName, aOptions, 1818*cdf0e10cSrcweir aAreaName, aRange ); 1819*cdf0e10cSrcweir if (pLink) 1820*cdf0e10cSrcweir pLinkManager->Remove( pLink ); 1821*cdf0e10cSrcweir 1822*cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); // Navigator 1823*cdf0e10cSrcweir } 1824*cdf0e10cSrcweir 1825*cdf0e10cSrcweir 1826*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1827*cdf0e10cSrcweir 1828*cdf0e10cSrcweir void __EXPORT ScUndoInsertAreaLink::Redo() 1829*cdf0e10cSrcweir { 1830*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1831*cdf0e10cSrcweir sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager(); 1832*cdf0e10cSrcweir 1833*cdf0e10cSrcweir ScAreaLink* pLink = new ScAreaLink( pDocShell, aDocName, aFltName, aOptions, 1834*cdf0e10cSrcweir aAreaName, aRange.aStart, nRefreshDelay ); 1835*cdf0e10cSrcweir pLink->SetInCreate( sal_True ); 1836*cdf0e10cSrcweir pLink->SetDestArea( aRange ); 1837*cdf0e10cSrcweir pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, aDocName, &aFltName, &aAreaName ); 1838*cdf0e10cSrcweir pLink->Update(); 1839*cdf0e10cSrcweir pLink->SetInCreate( sal_False ); 1840*cdf0e10cSrcweir 1841*cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); // Navigator 1842*cdf0e10cSrcweir } 1843*cdf0e10cSrcweir 1844*cdf0e10cSrcweir 1845*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1846*cdf0e10cSrcweir 1847*cdf0e10cSrcweir void __EXPORT ScUndoInsertAreaLink::Repeat(SfxRepeatTarget& /* rTarget */) 1848*cdf0e10cSrcweir { 1849*cdf0e10cSrcweir //! .... 1850*cdf0e10cSrcweir } 1851*cdf0e10cSrcweir 1852*cdf0e10cSrcweir 1853*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1854*cdf0e10cSrcweir 1855*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoInsertAreaLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const 1856*cdf0e10cSrcweir { 1857*cdf0e10cSrcweir return sal_False; 1858*cdf0e10cSrcweir } 1859*cdf0e10cSrcweir 1860*cdf0e10cSrcweir 1861*cdf0e10cSrcweir //============================================================================ 1862*cdf0e10cSrcweir // class ScUndoRemoveAreaLink 1863*cdf0e10cSrcweir // 1864*cdf0e10cSrcweir // Bereichs-Verknuepfung loeschen 1865*cdf0e10cSrcweir 1866*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1867*cdf0e10cSrcweir 1868*cdf0e10cSrcweir ScUndoRemoveAreaLink::ScUndoRemoveAreaLink( ScDocShell* pShell, 1869*cdf0e10cSrcweir const String& rDoc, const String& rFlt, const String& rOpt, 1870*cdf0e10cSrcweir const String& rArea, const ScRange& rDestRange, 1871*cdf0e10cSrcweir sal_uLong nRefresh ) 1872*cdf0e10cSrcweir // 1873*cdf0e10cSrcweir : ScSimpleUndo ( pShell ), 1874*cdf0e10cSrcweir // 1875*cdf0e10cSrcweir aDocName ( rDoc ), 1876*cdf0e10cSrcweir aFltName ( rFlt ), 1877*cdf0e10cSrcweir aOptions ( rOpt ), 1878*cdf0e10cSrcweir aAreaName ( rArea ), 1879*cdf0e10cSrcweir aRange ( rDestRange ), 1880*cdf0e10cSrcweir nRefreshDelay ( nRefresh ) 1881*cdf0e10cSrcweir { 1882*cdf0e10cSrcweir } 1883*cdf0e10cSrcweir 1884*cdf0e10cSrcweir 1885*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1886*cdf0e10cSrcweir 1887*cdf0e10cSrcweir __EXPORT ScUndoRemoveAreaLink::~ScUndoRemoveAreaLink() 1888*cdf0e10cSrcweir { 1889*cdf0e10cSrcweir } 1890*cdf0e10cSrcweir 1891*cdf0e10cSrcweir 1892*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1893*cdf0e10cSrcweir 1894*cdf0e10cSrcweir String __EXPORT ScUndoRemoveAreaLink::GetComment() const 1895*cdf0e10cSrcweir { 1896*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_REMOVELINK ); //! eigener Text ?? 1897*cdf0e10cSrcweir } 1898*cdf0e10cSrcweir 1899*cdf0e10cSrcweir 1900*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1901*cdf0e10cSrcweir 1902*cdf0e10cSrcweir void __EXPORT ScUndoRemoveAreaLink::Undo() 1903*cdf0e10cSrcweir { 1904*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1905*cdf0e10cSrcweir sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager(); 1906*cdf0e10cSrcweir 1907*cdf0e10cSrcweir ScAreaLink* pLink = new ScAreaLink( pDocShell, aDocName, aFltName, aOptions, 1908*cdf0e10cSrcweir aAreaName, aRange.aStart, nRefreshDelay ); 1909*cdf0e10cSrcweir pLink->SetInCreate( sal_True ); 1910*cdf0e10cSrcweir pLink->SetDestArea( aRange ); 1911*cdf0e10cSrcweir pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, aDocName, &aFltName, &aAreaName ); 1912*cdf0e10cSrcweir pLink->Update(); 1913*cdf0e10cSrcweir pLink->SetInCreate( sal_False ); 1914*cdf0e10cSrcweir 1915*cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); // Navigator 1916*cdf0e10cSrcweir } 1917*cdf0e10cSrcweir 1918*cdf0e10cSrcweir 1919*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1920*cdf0e10cSrcweir 1921*cdf0e10cSrcweir void __EXPORT ScUndoRemoveAreaLink::Redo() 1922*cdf0e10cSrcweir { 1923*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 1924*cdf0e10cSrcweir sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager(); 1925*cdf0e10cSrcweir 1926*cdf0e10cSrcweir ScAreaLink* pLink = lcl_FindAreaLink( pLinkManager, aDocName, aFltName, aOptions, 1927*cdf0e10cSrcweir aAreaName, aRange ); 1928*cdf0e10cSrcweir if (pLink) 1929*cdf0e10cSrcweir pLinkManager->Remove( pLink ); 1930*cdf0e10cSrcweir 1931*cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); // Navigator 1932*cdf0e10cSrcweir } 1933*cdf0e10cSrcweir 1934*cdf0e10cSrcweir 1935*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1936*cdf0e10cSrcweir 1937*cdf0e10cSrcweir void __EXPORT ScUndoRemoveAreaLink::Repeat(SfxRepeatTarget& /* rTarget */) 1938*cdf0e10cSrcweir { 1939*cdf0e10cSrcweir // gippsnich 1940*cdf0e10cSrcweir } 1941*cdf0e10cSrcweir 1942*cdf0e10cSrcweir 1943*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1944*cdf0e10cSrcweir 1945*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoRemoveAreaLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const 1946*cdf0e10cSrcweir { 1947*cdf0e10cSrcweir return sal_False; 1948*cdf0e10cSrcweir } 1949*cdf0e10cSrcweir 1950*cdf0e10cSrcweir 1951*cdf0e10cSrcweir //============================================================================ 1952*cdf0e10cSrcweir // class ScUndoUpdateAreaLink 1953*cdf0e10cSrcweir // 1954*cdf0e10cSrcweir // Bereichs-Verknuepfung aktualisieren 1955*cdf0e10cSrcweir 1956*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1957*cdf0e10cSrcweir 1958*cdf0e10cSrcweir ScUndoUpdateAreaLink::ScUndoUpdateAreaLink( ScDocShell* pShell, 1959*cdf0e10cSrcweir const String& rOldD, const String& rOldF, const String& rOldO, 1960*cdf0e10cSrcweir const String& rOldA, const ScRange& rOldR, sal_uLong nOldRD, 1961*cdf0e10cSrcweir const String& rNewD, const String& rNewF, const String& rNewO, 1962*cdf0e10cSrcweir const String& rNewA, const ScRange& rNewR, sal_uLong nNewRD, 1963*cdf0e10cSrcweir ScDocument* pUndo, ScDocument* pRedo, sal_Bool bDoInsert ) 1964*cdf0e10cSrcweir // 1965*cdf0e10cSrcweir : ScSimpleUndo( pShell ), 1966*cdf0e10cSrcweir // 1967*cdf0e10cSrcweir aOldDoc ( rOldD ), 1968*cdf0e10cSrcweir aOldFlt ( rOldF ), 1969*cdf0e10cSrcweir aOldOpt ( rOldO ), 1970*cdf0e10cSrcweir aOldArea ( rOldA ), 1971*cdf0e10cSrcweir aOldRange ( rOldR ), 1972*cdf0e10cSrcweir aNewDoc ( rNewD ), 1973*cdf0e10cSrcweir aNewFlt ( rNewF ), 1974*cdf0e10cSrcweir aNewOpt ( rNewO ), 1975*cdf0e10cSrcweir aNewArea ( rNewA ), 1976*cdf0e10cSrcweir aNewRange ( rNewR ), 1977*cdf0e10cSrcweir pUndoDoc ( pUndo ), 1978*cdf0e10cSrcweir pRedoDoc ( pRedo ), 1979*cdf0e10cSrcweir nOldRefresh ( nOldRD ), 1980*cdf0e10cSrcweir nNewRefresh ( nNewRD ), 1981*cdf0e10cSrcweir bWithInsert ( bDoInsert ) 1982*cdf0e10cSrcweir { 1983*cdf0e10cSrcweir DBG_ASSERT( aOldRange.aStart == aNewRange.aStart, "AreaLink verschoben ?" ); 1984*cdf0e10cSrcweir } 1985*cdf0e10cSrcweir 1986*cdf0e10cSrcweir 1987*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1988*cdf0e10cSrcweir 1989*cdf0e10cSrcweir __EXPORT ScUndoUpdateAreaLink::~ScUndoUpdateAreaLink() 1990*cdf0e10cSrcweir { 1991*cdf0e10cSrcweir delete pUndoDoc; 1992*cdf0e10cSrcweir delete pRedoDoc; 1993*cdf0e10cSrcweir } 1994*cdf0e10cSrcweir 1995*cdf0e10cSrcweir 1996*cdf0e10cSrcweir //---------------------------------------------------------------------------- 1997*cdf0e10cSrcweir 1998*cdf0e10cSrcweir String __EXPORT ScUndoUpdateAreaLink::GetComment() const 1999*cdf0e10cSrcweir { 2000*cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_UPDATELINK ); //! eigener Text ?? 2001*cdf0e10cSrcweir } 2002*cdf0e10cSrcweir 2003*cdf0e10cSrcweir 2004*cdf0e10cSrcweir //---------------------------------------------------------------------------- 2005*cdf0e10cSrcweir 2006*cdf0e10cSrcweir void ScUndoUpdateAreaLink::DoChange( const sal_Bool bUndo ) const 2007*cdf0e10cSrcweir { 2008*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 2009*cdf0e10cSrcweir 2010*cdf0e10cSrcweir SCCOL nEndX = Max( aOldRange.aEnd.Col(), aNewRange.aEnd.Col() ); 2011*cdf0e10cSrcweir SCROW nEndY = Max( aOldRange.aEnd.Row(), aNewRange.aEnd.Row() ); 2012*cdf0e10cSrcweir SCTAB nEndZ = Max( aOldRange.aEnd.Tab(), aNewRange.aEnd.Tab() ); //? 2013*cdf0e10cSrcweir 2014*cdf0e10cSrcweir if ( bUndo ) 2015*cdf0e10cSrcweir { 2016*cdf0e10cSrcweir if ( bWithInsert ) 2017*cdf0e10cSrcweir { 2018*cdf0e10cSrcweir pDoc->FitBlock( aNewRange, aOldRange ); 2019*cdf0e10cSrcweir pDoc->DeleteAreaTab( aOldRange, IDF_ALL & ~IDF_NOTE ); 2020*cdf0e10cSrcweir pUndoDoc->UndoToDocument( aOldRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc ); 2021*cdf0e10cSrcweir } 2022*cdf0e10cSrcweir else 2023*cdf0e10cSrcweir { 2024*cdf0e10cSrcweir ScRange aCopyRange( aOldRange.aStart, ScAddress(nEndX,nEndY,nEndZ) ); 2025*cdf0e10cSrcweir pDoc->DeleteAreaTab( aCopyRange, IDF_ALL & ~IDF_NOTE ); 2026*cdf0e10cSrcweir pUndoDoc->CopyToDocument( aCopyRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc ); 2027*cdf0e10cSrcweir } 2028*cdf0e10cSrcweir } 2029*cdf0e10cSrcweir else 2030*cdf0e10cSrcweir { 2031*cdf0e10cSrcweir if ( bWithInsert ) 2032*cdf0e10cSrcweir { 2033*cdf0e10cSrcweir pDoc->FitBlock( aOldRange, aNewRange ); 2034*cdf0e10cSrcweir pDoc->DeleteAreaTab( aNewRange, IDF_ALL & ~IDF_NOTE ); 2035*cdf0e10cSrcweir pRedoDoc->CopyToDocument( aNewRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc ); 2036*cdf0e10cSrcweir } 2037*cdf0e10cSrcweir else 2038*cdf0e10cSrcweir { 2039*cdf0e10cSrcweir ScRange aCopyRange( aOldRange.aStart, ScAddress(nEndX,nEndY,nEndZ) ); 2040*cdf0e10cSrcweir pDoc->DeleteAreaTab( aCopyRange, IDF_ALL & ~IDF_NOTE ); 2041*cdf0e10cSrcweir pRedoDoc->CopyToDocument( aCopyRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc ); 2042*cdf0e10cSrcweir } 2043*cdf0e10cSrcweir } 2044*cdf0e10cSrcweir 2045*cdf0e10cSrcweir ScRange aWorkRange( aNewRange.aStart, ScAddress( nEndX, nEndY, nEndZ ) ); 2046*cdf0e10cSrcweir pDoc->ExtendMerge( aWorkRange, sal_True ); 2047*cdf0e10cSrcweir 2048*cdf0e10cSrcweir // Paint 2049*cdf0e10cSrcweir 2050*cdf0e10cSrcweir if ( aNewRange.aEnd.Col() != aOldRange.aEnd.Col() ) 2051*cdf0e10cSrcweir aWorkRange.aEnd.SetCol(MAXCOL); 2052*cdf0e10cSrcweir if ( aNewRange.aEnd.Row() != aOldRange.aEnd.Row() ) 2053*cdf0e10cSrcweir aWorkRange.aEnd.SetRow(MAXROW); 2054*cdf0e10cSrcweir 2055*cdf0e10cSrcweir if ( !pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), aWorkRange.aStart.Tab() ) ) 2056*cdf0e10cSrcweir pDocShell->PostPaint( aWorkRange, PAINT_GRID ); 2057*cdf0e10cSrcweir 2058*cdf0e10cSrcweir pDocShell->PostDataChanged(); 2059*cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 2060*cdf0e10cSrcweir if (pViewShell) 2061*cdf0e10cSrcweir pViewShell->CellContentChanged(); 2062*cdf0e10cSrcweir } 2063*cdf0e10cSrcweir 2064*cdf0e10cSrcweir 2065*cdf0e10cSrcweir //---------------------------------------------------------------------------- 2066*cdf0e10cSrcweir 2067*cdf0e10cSrcweir void __EXPORT ScUndoUpdateAreaLink::Undo() 2068*cdf0e10cSrcweir { 2069*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 2070*cdf0e10cSrcweir sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager(); 2071*cdf0e10cSrcweir ScAreaLink* pLink = lcl_FindAreaLink( pLinkManager, aNewDoc, aNewFlt, aNewOpt, 2072*cdf0e10cSrcweir aNewArea, aNewRange ); 2073*cdf0e10cSrcweir if (pLink) 2074*cdf0e10cSrcweir { 2075*cdf0e10cSrcweir pLink->SetSource( aOldDoc, aOldFlt, aOldOpt, aOldArea ); // alte Werte im Link 2076*cdf0e10cSrcweir pLink->SetDestArea( aOldRange ); 2077*cdf0e10cSrcweir pLink->SetRefreshDelay( nOldRefresh ); 2078*cdf0e10cSrcweir } 2079*cdf0e10cSrcweir 2080*cdf0e10cSrcweir DoChange(sal_True); 2081*cdf0e10cSrcweir } 2082*cdf0e10cSrcweir 2083*cdf0e10cSrcweir 2084*cdf0e10cSrcweir //---------------------------------------------------------------------------- 2085*cdf0e10cSrcweir 2086*cdf0e10cSrcweir void __EXPORT ScUndoUpdateAreaLink::Redo() 2087*cdf0e10cSrcweir { 2088*cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); 2089*cdf0e10cSrcweir sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager(); 2090*cdf0e10cSrcweir ScAreaLink* pLink = lcl_FindAreaLink( pLinkManager, aOldDoc, aOldFlt, aOldOpt, 2091*cdf0e10cSrcweir aOldArea, aOldRange ); 2092*cdf0e10cSrcweir if (pLink) 2093*cdf0e10cSrcweir { 2094*cdf0e10cSrcweir pLink->SetSource( aNewDoc, aNewFlt, aNewOpt, aNewArea ); // neue Werte im Link 2095*cdf0e10cSrcweir pLink->SetDestArea( aNewRange ); 2096*cdf0e10cSrcweir pLink->SetRefreshDelay( nNewRefresh ); 2097*cdf0e10cSrcweir } 2098*cdf0e10cSrcweir 2099*cdf0e10cSrcweir DoChange(sal_False); 2100*cdf0e10cSrcweir } 2101*cdf0e10cSrcweir 2102*cdf0e10cSrcweir 2103*cdf0e10cSrcweir //---------------------------------------------------------------------------- 2104*cdf0e10cSrcweir 2105*cdf0e10cSrcweir void __EXPORT ScUndoUpdateAreaLink::Repeat(SfxRepeatTarget& /* rTarget */) 2106*cdf0e10cSrcweir { 2107*cdf0e10cSrcweir // gippsnich 2108*cdf0e10cSrcweir } 2109*cdf0e10cSrcweir 2110*cdf0e10cSrcweir 2111*cdf0e10cSrcweir //---------------------------------------------------------------------------- 2112*cdf0e10cSrcweir 2113*cdf0e10cSrcweir sal_Bool __EXPORT ScUndoUpdateAreaLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const 2114*cdf0e10cSrcweir { 2115*cdf0e10cSrcweir return sal_False; 2116*cdf0e10cSrcweir } 2117*cdf0e10cSrcweir 2118*cdf0e10cSrcweir 2119*cdf0e10cSrcweir 2120*cdf0e10cSrcweir 2121