1b3f79822SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file 5b3f79822SAndrew Rist * distributed with this work for additional information 6b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the 8b3f79822SAndrew Rist * "License"); you may not use this file except in compliance 9b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing, 14b3f79822SAndrew Rist * software distributed under the License is distributed on an 15b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16b3f79822SAndrew Rist * KIND, either express or implied. See the License for the 17b3f79822SAndrew Rist * specific language governing permissions and limitations 18b3f79822SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20b3f79822SAndrew Rist *************************************************************/ 21b3f79822SAndrew Rist 22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 23cdf0e10cSrcweir #include "precompiled_sc.hxx" 24cdf0e10cSrcweir 25cdf0e10cSrcweir // INCLUDE --------------------------------------------------------------- 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "scitems.hxx" 28cdf0e10cSrcweir #include <editeng/eeitem.hxx> 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include <sfx2/app.hxx> 31cdf0e10cSrcweir #include <editeng/editobj.hxx> 32cdf0e10cSrcweir #include <sfx2/linkmgr.hxx> 33cdf0e10cSrcweir #include <svx/svdundo.hxx> 34cdf0e10cSrcweir #include <sfx2/bindings.hxx> 35cdf0e10cSrcweir #include <sfx2/printer.hxx> 36cdf0e10cSrcweir #include <vcl/msgbox.hxx> 37cdf0e10cSrcweir #include <vcl/sound.hxx> 38cdf0e10cSrcweir #include <vcl/virdev.hxx> 39cdf0e10cSrcweir #include <vcl/waitobj.hxx> 40cdf0e10cSrcweir #include <svl/zforlist.hxx> 41cdf0e10cSrcweir #include <svl/PasswordHelper.hxx> 42cdf0e10cSrcweir 43cdf0e10cSrcweir #include <basic/sbstar.hxx> 44cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp> 45cdf0e10cSrcweir #include <com/sun/star/script/ModuleType.hpp> 46cdf0e10cSrcweir #include <com/sun/star/script/XLibraryContainer.hpp> 47cdf0e10cSrcweir #include <com/sun/star/script/vba/XVBAModuleInfo.hpp> 48cdf0e10cSrcweir 49cdf0e10cSrcweir #include <list> 50cdf0e10cSrcweir 51cdf0e10cSrcweir #include "docfunc.hxx" 52cdf0e10cSrcweir 53cdf0e10cSrcweir #include "sc.hrc" 54cdf0e10cSrcweir 55cdf0e10cSrcweir #include "arealink.hxx" 56cdf0e10cSrcweir #include "attrib.hxx" 57cdf0e10cSrcweir #include "dociter.hxx" 58cdf0e10cSrcweir #include "autoform.hxx" 59cdf0e10cSrcweir #include "cell.hxx" 60cdf0e10cSrcweir #include "detdata.hxx" 61cdf0e10cSrcweir #include "detfunc.hxx" 62cdf0e10cSrcweir #include "docpool.hxx" 63cdf0e10cSrcweir #include "docsh.hxx" 64cdf0e10cSrcweir #include "drwlayer.hxx" 65cdf0e10cSrcweir #include "editutil.hxx" 66cdf0e10cSrcweir #include "globstr.hrc" 67cdf0e10cSrcweir //CHINA001 #include "namecrea.hxx" // NAME_TOP etc. 68cdf0e10cSrcweir #include "olinetab.hxx" 69cdf0e10cSrcweir #include "patattr.hxx" 70cdf0e10cSrcweir #include "rangenam.hxx" 71cdf0e10cSrcweir #include "rangeutl.hxx" 72cdf0e10cSrcweir #include "refundo.hxx" 73cdf0e10cSrcweir #include "scresid.hxx" 74cdf0e10cSrcweir #include "stlpool.hxx" 75cdf0e10cSrcweir #include "stlsheet.hxx" 76cdf0e10cSrcweir #include "tablink.hxx" 77cdf0e10cSrcweir #include "tabvwsh.hxx" 78cdf0e10cSrcweir #include "uiitems.hxx" 79cdf0e10cSrcweir #include "undoblk.hxx" 80cdf0e10cSrcweir #include "undocell.hxx" 81cdf0e10cSrcweir #include "undodraw.hxx" 82cdf0e10cSrcweir #include "undotab.hxx" 83cdf0e10cSrcweir #include "waitoff.hxx" 84cdf0e10cSrcweir #include "sizedev.hxx" 85cdf0e10cSrcweir #include "scmod.hxx" 86cdf0e10cSrcweir #include "inputhdl.hxx" 87cdf0e10cSrcweir #include "inputwin.hxx" 88cdf0e10cSrcweir #include "editable.hxx" 89cdf0e10cSrcweir #include "compiler.hxx" 90cdf0e10cSrcweir #include "scui_def.hxx" //CHINA001 91cdf0e10cSrcweir #include "tabprotection.hxx" 92cdf0e10cSrcweir #include "clipparam.hxx" 93cdf0e10cSrcweir #include "externalrefmgr.hxx" 94cdf0e10cSrcweir 95cdf0e10cSrcweir #include <memory> 96cdf0e10cSrcweir #include <basic/basmgr.hxx> 97cdf0e10cSrcweir #include <boost/scoped_ptr.hpp> 98cdf0e10cSrcweir 99cdf0e10cSrcweir using namespace com::sun::star; 100cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 101cdf0e10cSrcweir 102cdf0e10cSrcweir // STATIC DATA ----------------------------------------------------------- 103cdf0e10cSrcweir 104cdf0e10cSrcweir //======================================================================== 105cdf0e10cSrcweir 106cdf0e10cSrcweir IMPL_LINK( ScDocFunc, NotifyDrawUndo, SdrUndoAction*, pUndoAction ) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir // #i101118# if drawing layer collects the undo actions, add it there 109cdf0e10cSrcweir ScDrawLayer* pDrawLayer = rDocShell.GetDocument()->GetDrawLayer(); 110577c0052SWang Lei if( pDrawLayer && pDrawLayer->IsUndoAllowed() && pDrawLayer->IsRecording() ) 111cdf0e10cSrcweir pDrawLayer->AddCalcUndo( pUndoAction ); 112cdf0e10cSrcweir else 113cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( new ScUndoDraw( pUndoAction, &rDocShell ) ); 114cdf0e10cSrcweir rDocShell.SetDrawModified(); 115cdf0e10cSrcweir 116cdf0e10cSrcweir // the affected sheet isn't known, so all stream positions are invalidated 117cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 118cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 119cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nTabCount; nTab++) 120cdf0e10cSrcweir if (pDoc->IsStreamValid(nTab)) 121cdf0e10cSrcweir pDoc->SetStreamValid(nTab, sal_False); 122cdf0e10cSrcweir 123cdf0e10cSrcweir return 0; 124cdf0e10cSrcweir } 125cdf0e10cSrcweir 126cdf0e10cSrcweir //------------------------------------------------------------------------ 127cdf0e10cSrcweir 128cdf0e10cSrcweir // Zeile ueber dem Range painten (fuer Linien nach AdjustRowHeight) 129cdf0e10cSrcweir 130cdf0e10cSrcweir void lcl_PaintAbove( ScDocShell& rDocShell, const ScRange& rRange ) 131cdf0e10cSrcweir { 132cdf0e10cSrcweir SCROW nRow = rRange.aStart.Row(); 133cdf0e10cSrcweir if ( nRow > 0 ) 134cdf0e10cSrcweir { 135cdf0e10cSrcweir SCTAB nTab = rRange.aStart.Tab(); //! alle? 136cdf0e10cSrcweir --nRow; 137cdf0e10cSrcweir rDocShell.PostPaint( ScRange(0,nRow,nTab, MAXCOL,nRow,nTab), PAINT_GRID ); 138cdf0e10cSrcweir } 139cdf0e10cSrcweir } 140cdf0e10cSrcweir 141cdf0e10cSrcweir //------------------------------------------------------------------------ 142cdf0e10cSrcweir 143cdf0e10cSrcweir sal_Bool ScDocFunc::AdjustRowHeight( const ScRange& rRange, sal_Bool bPaint ) 144cdf0e10cSrcweir { 145cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 146cdf0e10cSrcweir if ( pDoc->IsImportingXML() ) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir // for XML import, all row heights are updated together after importing 149cdf0e10cSrcweir return sal_False; 150cdf0e10cSrcweir } 151cdf0e10cSrcweir if ( !pDoc->IsAdjustHeightEnabled() ) 152cdf0e10cSrcweir { 153cdf0e10cSrcweir return sal_False; 154cdf0e10cSrcweir } 155cdf0e10cSrcweir 156cdf0e10cSrcweir SCTAB nTab = rRange.aStart.Tab(); 157cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 158cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 159cdf0e10cSrcweir 160cdf0e10cSrcweir ScSizeDeviceProvider aProv( &rDocShell ); 161cdf0e10cSrcweir Fraction aOne(1,1); 162cdf0e10cSrcweir 163cdf0e10cSrcweir sal_Bool bChanged = pDoc->SetOptimalHeight( nStartRow, nEndRow, nTab, 0, aProv.GetDevice(), 164cdf0e10cSrcweir aProv.GetPPTX(), aProv.GetPPTY(), aOne, aOne, sal_False ); 165cdf0e10cSrcweir 166cdf0e10cSrcweir if ( bPaint && bChanged ) 167cdf0e10cSrcweir rDocShell.PostPaint( 0, nStartRow, nTab, MAXCOL, MAXROW, nTab, 168cdf0e10cSrcweir PAINT_GRID | PAINT_LEFT ); 169cdf0e10cSrcweir 170cdf0e10cSrcweir return bChanged; 171cdf0e10cSrcweir } 172cdf0e10cSrcweir 173cdf0e10cSrcweir 174cdf0e10cSrcweir //------------------------------------------------------------------------ 175cdf0e10cSrcweir 176cdf0e10cSrcweir sal_Bool ScDocFunc::DetectiveAddPred(const ScAddress& rPos) 177cdf0e10cSrcweir { 178cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 179cdf0e10cSrcweir 180cdf0e10cSrcweir rDocShell.MakeDrawLayer(); 181cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 182cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 183cdf0e10cSrcweir ScDrawLayer* pModel = pDoc->GetDrawLayer(); 184cdf0e10cSrcweir SCCOL nCol = rPos.Col(); 185cdf0e10cSrcweir SCROW nRow = rPos.Row(); 186cdf0e10cSrcweir SCTAB nTab = rPos.Tab(); 187cdf0e10cSrcweir 188cdf0e10cSrcweir if (bUndo) 189a840a559SArmin Le Grand pModel->BeginCalcUndo(false); 190cdf0e10cSrcweir sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).ShowPred( nCol, nRow ); 191cdf0e10cSrcweir SdrUndoGroup* pUndo = NULL; 192cdf0e10cSrcweir if (bUndo) 193cdf0e10cSrcweir pUndo = pModel->GetCalcUndo(); 194cdf0e10cSrcweir if (bDone) 195cdf0e10cSrcweir { 196cdf0e10cSrcweir ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_ADDPRED ); 197cdf0e10cSrcweir pDoc->AddDetectiveOperation( aOperation ); 198cdf0e10cSrcweir if (bUndo) 199cdf0e10cSrcweir { 200cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 201cdf0e10cSrcweir new ScUndoDetective( &rDocShell, pUndo, &aOperation ) ); 202cdf0e10cSrcweir } 203cdf0e10cSrcweir aModificator.SetDocumentModified(); 204cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 205cdf0e10cSrcweir if (pBindings) 206cdf0e10cSrcweir pBindings->Invalidate( SID_DETECTIVE_REFRESH ); 207cdf0e10cSrcweir } 208cdf0e10cSrcweir else 209cdf0e10cSrcweir delete pUndo; 210cdf0e10cSrcweir 211cdf0e10cSrcweir return bDone; 212cdf0e10cSrcweir } 213cdf0e10cSrcweir 214cdf0e10cSrcweir sal_Bool ScDocFunc::DetectiveDelPred(const ScAddress& rPos) 215cdf0e10cSrcweir { 216cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 217cdf0e10cSrcweir 218cdf0e10cSrcweir sal_Bool bUndo(pDoc->IsUndoEnabled()); 219cdf0e10cSrcweir ScDrawLayer* pModel = pDoc->GetDrawLayer(); 220cdf0e10cSrcweir if (!pModel) 221cdf0e10cSrcweir return sal_False; 222cdf0e10cSrcweir 223cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 224cdf0e10cSrcweir 225cdf0e10cSrcweir SCCOL nCol = rPos.Col(); 226cdf0e10cSrcweir SCROW nRow = rPos.Row(); 227cdf0e10cSrcweir SCTAB nTab = rPos.Tab(); 228cdf0e10cSrcweir 229cdf0e10cSrcweir if (bUndo) 230a840a559SArmin Le Grand pModel->BeginCalcUndo(false); 231cdf0e10cSrcweir sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).DeletePred( nCol, nRow ); 232cdf0e10cSrcweir SdrUndoGroup* pUndo = NULL; 233cdf0e10cSrcweir if (bUndo) 234cdf0e10cSrcweir pUndo = pModel->GetCalcUndo(); 235cdf0e10cSrcweir if (bDone) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_DELPRED ); 238cdf0e10cSrcweir pDoc->AddDetectiveOperation( aOperation ); 239cdf0e10cSrcweir if (bUndo) 240cdf0e10cSrcweir { 241cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 242cdf0e10cSrcweir new ScUndoDetective( &rDocShell, pUndo, &aOperation ) ); 243cdf0e10cSrcweir } 244cdf0e10cSrcweir aModificator.SetDocumentModified(); 245cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 246cdf0e10cSrcweir if (pBindings) 247cdf0e10cSrcweir pBindings->Invalidate( SID_DETECTIVE_REFRESH ); 248cdf0e10cSrcweir } 249cdf0e10cSrcweir else 250cdf0e10cSrcweir delete pUndo; 251cdf0e10cSrcweir 252cdf0e10cSrcweir return bDone; 253cdf0e10cSrcweir } 254cdf0e10cSrcweir 255cdf0e10cSrcweir sal_Bool ScDocFunc::DetectiveAddSucc(const ScAddress& rPos) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 258cdf0e10cSrcweir 259cdf0e10cSrcweir rDocShell.MakeDrawLayer(); 260cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 261cdf0e10cSrcweir 262cdf0e10cSrcweir sal_Bool bUndo(pDoc->IsUndoEnabled()); 263cdf0e10cSrcweir ScDrawLayer* pModel = pDoc->GetDrawLayer(); 264cdf0e10cSrcweir SCCOL nCol = rPos.Col(); 265cdf0e10cSrcweir SCROW nRow = rPos.Row(); 266cdf0e10cSrcweir SCTAB nTab = rPos.Tab(); 267cdf0e10cSrcweir 268cdf0e10cSrcweir if (bUndo) 269a840a559SArmin Le Grand pModel->BeginCalcUndo(false); 270cdf0e10cSrcweir sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).ShowSucc( nCol, nRow ); 271cdf0e10cSrcweir SdrUndoGroup* pUndo = NULL; 272cdf0e10cSrcweir if (bUndo) 273cdf0e10cSrcweir pUndo = pModel->GetCalcUndo(); 274cdf0e10cSrcweir if (bDone) 275cdf0e10cSrcweir { 276cdf0e10cSrcweir ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_ADDSUCC ); 277cdf0e10cSrcweir pDoc->AddDetectiveOperation( aOperation ); 278cdf0e10cSrcweir if (bUndo) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 281cdf0e10cSrcweir new ScUndoDetective( &rDocShell, pUndo, &aOperation ) ); 282cdf0e10cSrcweir } 283cdf0e10cSrcweir aModificator.SetDocumentModified(); 284cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 285cdf0e10cSrcweir if (pBindings) 286cdf0e10cSrcweir pBindings->Invalidate( SID_DETECTIVE_REFRESH ); 287cdf0e10cSrcweir } 288cdf0e10cSrcweir else 289cdf0e10cSrcweir delete pUndo; 290cdf0e10cSrcweir 291cdf0e10cSrcweir return bDone; 292cdf0e10cSrcweir } 293cdf0e10cSrcweir 294cdf0e10cSrcweir sal_Bool ScDocFunc::DetectiveDelSucc(const ScAddress& rPos) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 297cdf0e10cSrcweir 298cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 299cdf0e10cSrcweir ScDrawLayer* pModel = pDoc->GetDrawLayer(); 300cdf0e10cSrcweir if (!pModel) 301cdf0e10cSrcweir return sal_False; 302cdf0e10cSrcweir 303cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 304cdf0e10cSrcweir 305cdf0e10cSrcweir SCCOL nCol = rPos.Col(); 306cdf0e10cSrcweir SCROW nRow = rPos.Row(); 307cdf0e10cSrcweir SCTAB nTab = rPos.Tab(); 308cdf0e10cSrcweir 309cdf0e10cSrcweir if (bUndo) 310a840a559SArmin Le Grand pModel->BeginCalcUndo(false); 311cdf0e10cSrcweir sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).DeleteSucc( nCol, nRow ); 312cdf0e10cSrcweir SdrUndoGroup* pUndo = NULL; 313cdf0e10cSrcweir if (bUndo) 314cdf0e10cSrcweir pUndo = pModel->GetCalcUndo(); 315cdf0e10cSrcweir if (bDone) 316cdf0e10cSrcweir { 317cdf0e10cSrcweir ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_DELSUCC ); 318cdf0e10cSrcweir pDoc->AddDetectiveOperation( aOperation ); 319cdf0e10cSrcweir if (bUndo) 320cdf0e10cSrcweir { 321cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 322cdf0e10cSrcweir new ScUndoDetective( &rDocShell, pUndo, &aOperation ) ); 323cdf0e10cSrcweir } 324cdf0e10cSrcweir aModificator.SetDocumentModified(); 325cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 326cdf0e10cSrcweir if (pBindings) 327cdf0e10cSrcweir pBindings->Invalidate( SID_DETECTIVE_REFRESH ); 328cdf0e10cSrcweir } 329cdf0e10cSrcweir else 330cdf0e10cSrcweir delete pUndo; 331cdf0e10cSrcweir 332cdf0e10cSrcweir return bDone; 333cdf0e10cSrcweir } 334cdf0e10cSrcweir 335cdf0e10cSrcweir sal_Bool ScDocFunc::DetectiveAddError(const ScAddress& rPos) 336cdf0e10cSrcweir { 337cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 338cdf0e10cSrcweir 339cdf0e10cSrcweir rDocShell.MakeDrawLayer(); 340cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 341cdf0e10cSrcweir 342cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 343cdf0e10cSrcweir ScDrawLayer* pModel = pDoc->GetDrawLayer(); 344cdf0e10cSrcweir SCCOL nCol = rPos.Col(); 345cdf0e10cSrcweir SCROW nRow = rPos.Row(); 346cdf0e10cSrcweir SCTAB nTab = rPos.Tab(); 347cdf0e10cSrcweir 348cdf0e10cSrcweir if (bUndo) 349a840a559SArmin Le Grand pModel->BeginCalcUndo(false); 350cdf0e10cSrcweir sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).ShowError( nCol, nRow ); 351cdf0e10cSrcweir SdrUndoGroup* pUndo = NULL; 352cdf0e10cSrcweir if (bUndo) 353cdf0e10cSrcweir pUndo = pModel->GetCalcUndo(); 354cdf0e10cSrcweir if (bDone) 355cdf0e10cSrcweir { 356cdf0e10cSrcweir ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_ADDERROR ); 357cdf0e10cSrcweir pDoc->AddDetectiveOperation( aOperation ); 358cdf0e10cSrcweir if (bUndo) 359cdf0e10cSrcweir { 360cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 361cdf0e10cSrcweir new ScUndoDetective( &rDocShell, pUndo, &aOperation ) ); 362cdf0e10cSrcweir } 363cdf0e10cSrcweir aModificator.SetDocumentModified(); 364cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 365cdf0e10cSrcweir if (pBindings) 366cdf0e10cSrcweir pBindings->Invalidate( SID_DETECTIVE_REFRESH ); 367cdf0e10cSrcweir } 368cdf0e10cSrcweir else 369cdf0e10cSrcweir delete pUndo; 370cdf0e10cSrcweir 371cdf0e10cSrcweir return bDone; 372cdf0e10cSrcweir } 373cdf0e10cSrcweir 374cdf0e10cSrcweir sal_Bool ScDocFunc::DetectiveMarkInvalid(SCTAB nTab) 375cdf0e10cSrcweir { 376cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 377cdf0e10cSrcweir 378cdf0e10cSrcweir rDocShell.MakeDrawLayer(); 379cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 380cdf0e10cSrcweir 381cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 382cdf0e10cSrcweir ScDrawLayer* pModel = pDoc->GetDrawLayer(); 383cdf0e10cSrcweir 384cdf0e10cSrcweir Window* pWaitWin = rDocShell.GetActiveDialogParent(); 385cdf0e10cSrcweir if (pWaitWin) 386cdf0e10cSrcweir pWaitWin->EnterWait(); 387cdf0e10cSrcweir if (bUndo) 388a840a559SArmin Le Grand pModel->BeginCalcUndo(false); 389cdf0e10cSrcweir sal_Bool bOverflow; 390cdf0e10cSrcweir sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).MarkInvalid( bOverflow ); 391cdf0e10cSrcweir SdrUndoGroup* pUndo = NULL; 392cdf0e10cSrcweir if (bUndo) 393cdf0e10cSrcweir pUndo = pModel->GetCalcUndo(); 394cdf0e10cSrcweir if (pWaitWin) 395cdf0e10cSrcweir pWaitWin->LeaveWait(); 396cdf0e10cSrcweir if (bDone) 397cdf0e10cSrcweir { 398cdf0e10cSrcweir if (pUndo && bUndo) 399cdf0e10cSrcweir { 400cdf0e10cSrcweir pUndo->SetComment( ScGlobal::GetRscString( STR_UNDO_DETINVALID ) ); 401cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( pUndo ); 402cdf0e10cSrcweir } 403cdf0e10cSrcweir aModificator.SetDocumentModified(); 404cdf0e10cSrcweir if ( bOverflow ) 405cdf0e10cSrcweir { 406cdf0e10cSrcweir InfoBox( NULL, 407cdf0e10cSrcweir ScGlobal::GetRscString( STR_DETINVALID_OVERFLOW ) ).Execute(); 408cdf0e10cSrcweir } 409cdf0e10cSrcweir } 410cdf0e10cSrcweir else 411cdf0e10cSrcweir delete pUndo; 412cdf0e10cSrcweir 413cdf0e10cSrcweir return bDone; 414cdf0e10cSrcweir } 415cdf0e10cSrcweir 416cdf0e10cSrcweir sal_Bool ScDocFunc::DetectiveDelAll(SCTAB nTab) 417cdf0e10cSrcweir { 418cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 419cdf0e10cSrcweir 420cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 421cdf0e10cSrcweir ScDrawLayer* pModel = pDoc->GetDrawLayer(); 422cdf0e10cSrcweir if (!pModel) 423cdf0e10cSrcweir return sal_False; 424cdf0e10cSrcweir 425cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 426cdf0e10cSrcweir 427cdf0e10cSrcweir if (bUndo) 428a840a559SArmin Le Grand pModel->BeginCalcUndo(false); 429cdf0e10cSrcweir sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).DeleteAll( SC_DET_DETECTIVE ); 430cdf0e10cSrcweir SdrUndoGroup* pUndo = NULL; 431cdf0e10cSrcweir if (bUndo) 432cdf0e10cSrcweir pUndo = pModel->GetCalcUndo(); 433cdf0e10cSrcweir if (bDone) 434cdf0e10cSrcweir { 435cdf0e10cSrcweir ScDetOpList* pOldList = pDoc->GetDetOpList(); 436cdf0e10cSrcweir ScDetOpList* pUndoList = NULL; 437cdf0e10cSrcweir if (bUndo) 438cdf0e10cSrcweir pUndoList = pOldList ? new ScDetOpList(*pOldList) : NULL; 439cdf0e10cSrcweir 440cdf0e10cSrcweir pDoc->ClearDetectiveOperations(); 441cdf0e10cSrcweir 442cdf0e10cSrcweir if (bUndo) 443cdf0e10cSrcweir { 444cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 445cdf0e10cSrcweir new ScUndoDetective( &rDocShell, pUndo, NULL, pUndoList ) ); 446cdf0e10cSrcweir } 447cdf0e10cSrcweir aModificator.SetDocumentModified(); 448cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 449cdf0e10cSrcweir if (pBindings) 450cdf0e10cSrcweir pBindings->Invalidate( SID_DETECTIVE_REFRESH ); 451cdf0e10cSrcweir } 452cdf0e10cSrcweir else 453cdf0e10cSrcweir delete pUndo; 454cdf0e10cSrcweir 455cdf0e10cSrcweir return bDone; 456cdf0e10cSrcweir } 457cdf0e10cSrcweir 458cdf0e10cSrcweir sal_Bool ScDocFunc::DetectiveRefresh( sal_Bool bAutomatic ) 459cdf0e10cSrcweir { 460cdf0e10cSrcweir sal_Bool bDone = sal_False; 461cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 462cdf0e10cSrcweir 463cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 464cdf0e10cSrcweir ScDetOpList* pList = pDoc->GetDetOpList(); 465cdf0e10cSrcweir if ( pList && pList->Count() ) 466cdf0e10cSrcweir { 467cdf0e10cSrcweir rDocShell.MakeDrawLayer(); 468cdf0e10cSrcweir ScDrawLayer* pModel = pDoc->GetDrawLayer(); 469cdf0e10cSrcweir if (bUndo) 470a840a559SArmin Le Grand pModel->BeginCalcUndo(false); 471cdf0e10cSrcweir 472cdf0e10cSrcweir // Loeschen auf allen Tabellen 473cdf0e10cSrcweir 474cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 475cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nTabCount; nTab++) 476cdf0e10cSrcweir ScDetectiveFunc( pDoc,nTab ).DeleteAll( SC_DET_ARROWS ); // don't remove circles 477cdf0e10cSrcweir 478cdf0e10cSrcweir // Wiederholen 479cdf0e10cSrcweir 480cdf0e10cSrcweir sal_uInt16 nCount = pList->Count(); 481cdf0e10cSrcweir for (sal_uInt16 i=0; i<nCount; i++) 482cdf0e10cSrcweir { 483cdf0e10cSrcweir ScDetOpData* pData = (*pList)[i]; 484cdf0e10cSrcweir if (pData) 485cdf0e10cSrcweir { 486cdf0e10cSrcweir ScAddress aPos = pData->GetPos(); 487cdf0e10cSrcweir ScDetectiveFunc aFunc( pDoc, aPos.Tab() ); 488cdf0e10cSrcweir SCCOL nCol = aPos.Col(); 489cdf0e10cSrcweir SCROW nRow = aPos.Row(); 490cdf0e10cSrcweir switch (pData->GetOperation()) 491cdf0e10cSrcweir { 492cdf0e10cSrcweir case SCDETOP_ADDSUCC: 493cdf0e10cSrcweir aFunc.ShowSucc( nCol, nRow ); 494cdf0e10cSrcweir break; 495cdf0e10cSrcweir case SCDETOP_DELSUCC: 496cdf0e10cSrcweir aFunc.DeleteSucc( nCol, nRow ); 497cdf0e10cSrcweir break; 498cdf0e10cSrcweir case SCDETOP_ADDPRED: 499cdf0e10cSrcweir aFunc.ShowPred( nCol, nRow ); 500cdf0e10cSrcweir break; 501cdf0e10cSrcweir case SCDETOP_DELPRED: 502cdf0e10cSrcweir aFunc.DeletePred( nCol, nRow ); 503cdf0e10cSrcweir break; 504cdf0e10cSrcweir case SCDETOP_ADDERROR: 505cdf0e10cSrcweir aFunc.ShowError( nCol, nRow ); 506cdf0e10cSrcweir break; 507cdf0e10cSrcweir default: 508cdf0e10cSrcweir DBG_ERROR("falsche Op bei DetectiveRefresh"); 509cdf0e10cSrcweir } 510cdf0e10cSrcweir } 511cdf0e10cSrcweir } 512cdf0e10cSrcweir 513cdf0e10cSrcweir if (bUndo) 514cdf0e10cSrcweir { 515cdf0e10cSrcweir SdrUndoGroup* pUndo = pModel->GetCalcUndo(); 516cdf0e10cSrcweir if (pUndo) 517cdf0e10cSrcweir { 518cdf0e10cSrcweir pUndo->SetComment( ScGlobal::GetRscString( STR_UNDO_DETREFRESH ) ); 519cdf0e10cSrcweir // wenn automatisch, an letzte Aktion anhaengen 520cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 521cdf0e10cSrcweir new ScUndoDraw( pUndo, &rDocShell ), 522cdf0e10cSrcweir bAutomatic ); 523cdf0e10cSrcweir } 524cdf0e10cSrcweir } 525cdf0e10cSrcweir rDocShell.SetDrawModified(); 526cdf0e10cSrcweir bDone = sal_True; 527cdf0e10cSrcweir } 528cdf0e10cSrcweir return bDone; 529cdf0e10cSrcweir } 530cdf0e10cSrcweir 531cdf0e10cSrcweir //------------------------------------------------------------------------ 532cdf0e10cSrcweir 533cdf0e10cSrcweir sal_Bool ScDocFunc::DeleteContents( const ScMarkData& rMark, sal_uInt16 nFlags, 534cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bApi ) 535cdf0e10cSrcweir { 536cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 537cdf0e10cSrcweir 538cdf0e10cSrcweir if ( !rMark.IsMarked() && !rMark.IsMultiMarked() ) 539cdf0e10cSrcweir { 540cdf0e10cSrcweir DBG_ERROR("ScDocFunc::DeleteContents ohne Markierung"); 541cdf0e10cSrcweir return sal_False; 542cdf0e10cSrcweir } 543cdf0e10cSrcweir 544cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 545cdf0e10cSrcweir 546cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 547cdf0e10cSrcweir bRecord = sal_False; 548cdf0e10cSrcweir 549cdf0e10cSrcweir ScEditableTester aTester( pDoc, rMark ); 550cdf0e10cSrcweir if (!aTester.IsEditable()) 551cdf0e10cSrcweir { 552cdf0e10cSrcweir if (!bApi) 553cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 554cdf0e10cSrcweir return sal_False; 555cdf0e10cSrcweir } 556cdf0e10cSrcweir 557cdf0e10cSrcweir ScRange aMarkRange; 558cdf0e10cSrcweir sal_Bool bSimple = sal_False; 559cdf0e10cSrcweir 560cdf0e10cSrcweir ScMarkData aMultiMark = rMark; 561cdf0e10cSrcweir aMultiMark.SetMarking(sal_False); // fuer MarkToMulti 562cdf0e10cSrcweir 563cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 564cdf0e10cSrcweir sal_Bool bMulti = !bSimple && aMultiMark.IsMultiMarked(); 565cdf0e10cSrcweir if (!bSimple) 566cdf0e10cSrcweir { 567cdf0e10cSrcweir aMultiMark.MarkToMulti(); 568cdf0e10cSrcweir aMultiMark.GetMultiMarkArea( aMarkRange ); 569cdf0e10cSrcweir } 570cdf0e10cSrcweir ScRange aExtendedRange(aMarkRange); 571cdf0e10cSrcweir if (!bSimple) 572cdf0e10cSrcweir { 573cdf0e10cSrcweir if ( pDoc->ExtendMerge( aExtendedRange, sal_True ) ) 574cdf0e10cSrcweir bMulti = sal_False; 575cdf0e10cSrcweir } 576cdf0e10cSrcweir 577cdf0e10cSrcweir // keine Objekte auf geschuetzten Tabellen 578cdf0e10cSrcweir sal_Bool bObjects = sal_False; 579cdf0e10cSrcweir if ( nFlags & IDF_OBJECTS ) 580cdf0e10cSrcweir { 581cdf0e10cSrcweir bObjects = sal_True; 582cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 583cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nTabCount; nTab++) 584cdf0e10cSrcweir if (aMultiMark.GetTableSelect(nTab) && pDoc->IsTabProtected(nTab)) 585cdf0e10cSrcweir bObjects = sal_False; 586cdf0e10cSrcweir } 587cdf0e10cSrcweir 588cdf0e10cSrcweir sal_uInt16 nExtFlags = 0; // extra flags are needed only if attributes are deleted 589cdf0e10cSrcweir if ( nFlags & IDF_ATTRIB ) 590cdf0e10cSrcweir rDocShell.UpdatePaintExt( nExtFlags, aMarkRange ); 591cdf0e10cSrcweir 592cdf0e10cSrcweir // Reihenfolge: 593cdf0e10cSrcweir // 1) BeginDrawUndo 594cdf0e10cSrcweir // 2) Objekte loeschen (DrawUndo wird gefuellt) 595cdf0e10cSrcweir // 3) Inhalte fuer Undo kopieren und Undo-Aktion anlegen 596cdf0e10cSrcweir // 4) Inhalte loeschen 597cdf0e10cSrcweir 598cdf0e10cSrcweir bool bDrawUndo = bObjects || (nFlags & IDF_NOTE); 599cdf0e10cSrcweir if (bRecord && bDrawUndo) 600cdf0e10cSrcweir pDoc->BeginDrawUndo(); 601cdf0e10cSrcweir 602cdf0e10cSrcweir if (bObjects) 603cdf0e10cSrcweir { 604cdf0e10cSrcweir if (bMulti) 605cdf0e10cSrcweir pDoc->DeleteObjectsInSelection( aMultiMark ); 606cdf0e10cSrcweir else 607cdf0e10cSrcweir pDoc->DeleteObjectsInArea( aMarkRange.aStart.Col(), aMarkRange.aStart.Row(), 608cdf0e10cSrcweir aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(), 609cdf0e10cSrcweir aMultiMark ); 610cdf0e10cSrcweir } 611cdf0e10cSrcweir 612cdf0e10cSrcweir if ( bRecord ) 613cdf0e10cSrcweir { 614cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 615cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, aMarkRange.aStart.Tab(), aMarkRange.aEnd.Tab() ); 616cdf0e10cSrcweir 617cdf0e10cSrcweir // bei "Format/Standard" alle Attribute kopieren, weil CopyToDocument 618cdf0e10cSrcweir // nur mit IDF_HARDATTR zu langsam ist: 619cdf0e10cSrcweir sal_uInt16 nUndoDocFlags = nFlags; 620cdf0e10cSrcweir if (nFlags & IDF_ATTRIB) 621cdf0e10cSrcweir nUndoDocFlags |= IDF_ATTRIB; 622cdf0e10cSrcweir if (nFlags & IDF_EDITATTR) // Edit-Engine-Attribute 623cdf0e10cSrcweir nUndoDocFlags |= IDF_STRING; // -> Zellen werden geaendert 624cdf0e10cSrcweir if (nFlags & IDF_NOTE) 625cdf0e10cSrcweir nUndoDocFlags |= IDF_CONTENTS; // #68795# copy all cells with their notes 626cdf0e10cSrcweir // note captions are handled in drawing undo 627cdf0e10cSrcweir nUndoDocFlags |= IDF_NOCAPTIONS; 628cdf0e10cSrcweir pDoc->CopyToDocument( aExtendedRange, nUndoDocFlags, bMulti, pUndoDoc, &aMultiMark ); 629cdf0e10cSrcweir } 630cdf0e10cSrcweir 631cdf0e10cSrcweir //! HideAllCursors(); // falls Zusammenfassung aufgehoben wird 632cdf0e10cSrcweir if (bSimple) 633cdf0e10cSrcweir pDoc->DeleteArea( aMarkRange.aStart.Col(), aMarkRange.aStart.Row(), 634cdf0e10cSrcweir aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(), 635cdf0e10cSrcweir aMultiMark, nFlags ); 636cdf0e10cSrcweir else 637cdf0e10cSrcweir { 638cdf0e10cSrcweir pDoc->DeleteSelection( nFlags, aMultiMark ); 639cdf0e10cSrcweir // aMultiMark.MarkToSimple(); 640cdf0e10cSrcweir } 641cdf0e10cSrcweir 642cdf0e10cSrcweir // add undo action after drawing undo is complete (objects and note captions) 643cdf0e10cSrcweir if( bRecord ) 644cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 645cdf0e10cSrcweir new ScUndoDeleteContents( &rDocShell, aMultiMark, aExtendedRange, 646cdf0e10cSrcweir pUndoDoc, bMulti, nFlags, bDrawUndo ) ); 647cdf0e10cSrcweir 648cdf0e10cSrcweir if (!AdjustRowHeight( aExtendedRange )) 649cdf0e10cSrcweir rDocShell.PostPaint( aExtendedRange, PAINT_GRID, nExtFlags ); 650cdf0e10cSrcweir else if (nExtFlags & SC_PF_LINES) 651cdf0e10cSrcweir lcl_PaintAbove( rDocShell, aExtendedRange ); // fuer Linien ueber dem Bereich 652cdf0e10cSrcweir 653cdf0e10cSrcweir // rDocShell.UpdateOle(GetViewData()); //! an der View? 654cdf0e10cSrcweir aModificator.SetDocumentModified(); 655cdf0e10cSrcweir //! CellContentChanged(); 656cdf0e10cSrcweir //! ShowAllCursors(); 657cdf0e10cSrcweir 658cdf0e10cSrcweir #if 0 659cdf0e10cSrcweir //! muss an der View bleiben !!!! 660cdf0e10cSrcweir if ( nFlags & IDF_ATTRIB ) 661cdf0e10cSrcweir { 662cdf0e10cSrcweir if ( nFlags & IDF_CONTENTS ) 663cdf0e10cSrcweir ForgetFormatArea(); 664cdf0e10cSrcweir else 665cdf0e10cSrcweir StartFormatArea(); // Attribute loeschen ist auch Attributierung 666cdf0e10cSrcweir } 667cdf0e10cSrcweir #endif 668cdf0e10cSrcweir 669cdf0e10cSrcweir return sal_True; 670cdf0e10cSrcweir } 671cdf0e10cSrcweir 672cdf0e10cSrcweir //------------------------------------------------------------------------ 673cdf0e10cSrcweir 674cdf0e10cSrcweir sal_Bool ScDocFunc::TransliterateText( const ScMarkData& rMark, sal_Int32 nType, 675cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bApi ) 676cdf0e10cSrcweir { 677cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 678cdf0e10cSrcweir 679cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 680cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 681cdf0e10cSrcweir bRecord = sal_False; 682cdf0e10cSrcweir 683cdf0e10cSrcweir ScEditableTester aTester( pDoc, rMark ); 684cdf0e10cSrcweir if (!aTester.IsEditable()) 685cdf0e10cSrcweir { 686cdf0e10cSrcweir if (!bApi) 687cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 688cdf0e10cSrcweir return sal_False; 689cdf0e10cSrcweir } 690cdf0e10cSrcweir 691cdf0e10cSrcweir ScRange aMarkRange; 692cdf0e10cSrcweir ScMarkData aMultiMark = rMark; 693cdf0e10cSrcweir aMultiMark.SetMarking(sal_False); // for MarkToMulti 694cdf0e10cSrcweir aMultiMark.MarkToMulti(); 695cdf0e10cSrcweir aMultiMark.GetMultiMarkArea( aMarkRange ); 696cdf0e10cSrcweir 697cdf0e10cSrcweir if (bRecord) 698cdf0e10cSrcweir { 699cdf0e10cSrcweir SCTAB nStartTab = aMarkRange.aStart.Tab(); 700cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 701cdf0e10cSrcweir 702cdf0e10cSrcweir ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 703cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab ); 704cdf0e10cSrcweir for (SCTAB i=0; i<nTabCount; i++) 705cdf0e10cSrcweir if (i != nStartTab && rMark.GetTableSelect(i)) 706cdf0e10cSrcweir pUndoDoc->AddUndoTab( i, i ); 707cdf0e10cSrcweir 708cdf0e10cSrcweir ScRange aCopyRange = aMarkRange; 709cdf0e10cSrcweir aCopyRange.aStart.SetTab(0); 710cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1); 711cdf0e10cSrcweir pDoc->CopyToDocument( aCopyRange, IDF_CONTENTS, sal_True, pUndoDoc, &aMultiMark ); 712cdf0e10cSrcweir 713cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 714cdf0e10cSrcweir new ScUndoTransliterate( &rDocShell, aMultiMark, pUndoDoc, nType ) ); 715cdf0e10cSrcweir } 716cdf0e10cSrcweir 717cdf0e10cSrcweir pDoc->TransliterateText( aMultiMark, nType ); 718cdf0e10cSrcweir 719cdf0e10cSrcweir if (!AdjustRowHeight( aMarkRange )) 720cdf0e10cSrcweir rDocShell.PostPaint( aMarkRange, PAINT_GRID ); 721cdf0e10cSrcweir 722cdf0e10cSrcweir aModificator.SetDocumentModified(); 723cdf0e10cSrcweir 724cdf0e10cSrcweir return sal_True; 725cdf0e10cSrcweir } 726cdf0e10cSrcweir 727cdf0e10cSrcweir //------------------------------------------------------------------------ 728cdf0e10cSrcweir 729cdf0e10cSrcweir sal_Bool ScDocFunc::SetNormalString( const ScAddress& rPos, const String& rText, sal_Bool bApi ) 730cdf0e10cSrcweir { 731cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 732cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 733cdf0e10cSrcweir 734cdf0e10cSrcweir sal_Bool bUndo(pDoc->IsUndoEnabled()); 735cdf0e10cSrcweir ScEditableTester aTester( pDoc, rPos.Tab(), rPos.Col(),rPos.Row(), rPos.Col(),rPos.Row() ); 736cdf0e10cSrcweir if (!aTester.IsEditable()) 737cdf0e10cSrcweir { 738cdf0e10cSrcweir if (!bApi) 739cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 740cdf0e10cSrcweir return sal_False; 741cdf0e10cSrcweir } 742cdf0e10cSrcweir 743cdf0e10cSrcweir SCTAB* pTabs = NULL; 744cdf0e10cSrcweir ScBaseCell** ppOldCells = NULL; 745cdf0e10cSrcweir sal_Bool* pHasFormat = NULL; 746cdf0e10cSrcweir sal_uLong* pOldFormats = NULL; 747cdf0e10cSrcweir ScBaseCell* pDocCell = pDoc->GetCell( rPos ); 748cdf0e10cSrcweir sal_Bool bEditDeleted = (pDocCell && pDocCell->GetCellType() == CELLTYPE_EDIT); 749cdf0e10cSrcweir if (bUndo) 750cdf0e10cSrcweir { 751cdf0e10cSrcweir pTabs = new SCTAB[1]; 752cdf0e10cSrcweir pTabs[0] = rPos.Tab(); 753cdf0e10cSrcweir ppOldCells = new ScBaseCell*[1]; 754cdf0e10cSrcweir ppOldCells[0] = pDocCell ? pDocCell->CloneWithoutNote( *pDoc ) : 0; 755cdf0e10cSrcweir 756cdf0e10cSrcweir pHasFormat = new sal_Bool[1]; 757cdf0e10cSrcweir pOldFormats = new sal_uLong[1]; 758cdf0e10cSrcweir const SfxPoolItem* pItem; 759cdf0e10cSrcweir const ScPatternAttr* pPattern = pDoc->GetPattern( rPos.Col(),rPos.Row(),rPos.Tab() ); 760cdf0e10cSrcweir if ( SFX_ITEM_SET == pPattern->GetItemSet().GetItemState( 761cdf0e10cSrcweir ATTR_VALUE_FORMAT,sal_False,&pItem) ) 762cdf0e10cSrcweir { 763cdf0e10cSrcweir pHasFormat[0] = sal_True; 764cdf0e10cSrcweir pOldFormats[0] = ((const SfxUInt32Item*)pItem)->GetValue(); 765cdf0e10cSrcweir } 766cdf0e10cSrcweir else 767cdf0e10cSrcweir pHasFormat[0] = sal_False; 768cdf0e10cSrcweir } 769cdf0e10cSrcweir 770cdf0e10cSrcweir pDoc->SetString( rPos.Col(), rPos.Row(), rPos.Tab(), rText ); 771cdf0e10cSrcweir 772cdf0e10cSrcweir if (bUndo) 773cdf0e10cSrcweir { 774cdf0e10cSrcweir // wegen ChangeTracking darf UndoAction erst nach SetString angelegt werden 775cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction(new ScUndoEnterData( &rDocShell, rPos.Col(),rPos.Row(),rPos.Tab(), 1,pTabs, 776cdf0e10cSrcweir ppOldCells, pHasFormat, pOldFormats, rText, NULL ) ); 777cdf0e10cSrcweir } 778cdf0e10cSrcweir 779cdf0e10cSrcweir if ( bEditDeleted || pDoc->HasAttrib( ScRange(rPos), HASATTR_NEEDHEIGHT ) ) 780cdf0e10cSrcweir AdjustRowHeight( ScRange(rPos) ); 781cdf0e10cSrcweir 782cdf0e10cSrcweir rDocShell.PostPaintCell( rPos ); 783cdf0e10cSrcweir aModificator.SetDocumentModified(); 784cdf0e10cSrcweir 785cdf0e10cSrcweir // #107160# notify input handler here the same way as in PutCell 786cdf0e10cSrcweir if (bApi) 787cdf0e10cSrcweir NotifyInputHandler( rPos ); 788cdf0e10cSrcweir 789cdf0e10cSrcweir return sal_True; 790cdf0e10cSrcweir } 791cdf0e10cSrcweir 792cdf0e10cSrcweir sal_Bool ScDocFunc::PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi ) 793cdf0e10cSrcweir { 794cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 795cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 796cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 797cdf0e10cSrcweir sal_Bool bXMLLoading(pDoc->IsImportingXML()); 798cdf0e10cSrcweir 79986e1cf34SPedro Giffuni // #i925#; it is not necessary to test whether the cell is editable on loading a XML document 800cdf0e10cSrcweir if (!bXMLLoading) 801cdf0e10cSrcweir { 802cdf0e10cSrcweir ScEditableTester aTester( pDoc, rPos.Tab(), rPos.Col(),rPos.Row(), rPos.Col(),rPos.Row() ); 803cdf0e10cSrcweir if (!aTester.IsEditable()) 804cdf0e10cSrcweir { 805cdf0e10cSrcweir if (!bApi) 806cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 807cdf0e10cSrcweir pNewCell->Delete(); 808cdf0e10cSrcweir return sal_False; 809cdf0e10cSrcweir } 810cdf0e10cSrcweir } 811cdf0e10cSrcweir 812cdf0e10cSrcweir sal_Bool bEditCell = ( pNewCell->GetCellType() == CELLTYPE_EDIT ); 813cdf0e10cSrcweir ScBaseCell* pDocCell = pDoc->GetCell( rPos ); 814cdf0e10cSrcweir sal_Bool bEditDeleted = (pDocCell && pDocCell->GetCellType() == CELLTYPE_EDIT); 815cdf0e10cSrcweir sal_Bool bHeight = ( bEditDeleted || bEditCell || 816cdf0e10cSrcweir pDoc->HasAttrib( ScRange(rPos), HASATTR_NEEDHEIGHT ) ); 817cdf0e10cSrcweir 818cdf0e10cSrcweir ScBaseCell* pUndoCell = (bUndo && pDocCell) ? pDocCell->CloneWithoutNote( *pDoc, rPos ) : 0; 819cdf0e10cSrcweir ScBaseCell* pRedoCell = (bUndo && pNewCell) ? pNewCell->CloneWithoutNote( *pDoc, rPos ) : 0; 820cdf0e10cSrcweir 821cdf0e10cSrcweir pDoc->PutCell( rPos, pNewCell ); 822cdf0e10cSrcweir 823cdf0e10cSrcweir // wegen ChangeTracking darf UndoAction erst nach PutCell angelegt werden 824cdf0e10cSrcweir if (bUndo) 825cdf0e10cSrcweir { 826cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 827cdf0e10cSrcweir new ScUndoPutCell( &rDocShell, rPos, pUndoCell, pRedoCell, bHeight ) ); 828cdf0e10cSrcweir } 829cdf0e10cSrcweir 830cdf0e10cSrcweir if (bHeight) 831cdf0e10cSrcweir AdjustRowHeight( ScRange(rPos) ); 832cdf0e10cSrcweir 833cdf0e10cSrcweir if (!bXMLLoading) 834cdf0e10cSrcweir rDocShell.PostPaintCell( rPos ); 835cdf0e10cSrcweir 836cdf0e10cSrcweir aModificator.SetDocumentModified(); 837cdf0e10cSrcweir 83886e1cf34SPedro Giffuni // #i925#; it is not necessary to notify on loading a XML document 839cdf0e10cSrcweir // #103934#; notify editline and cell in edit mode 840cdf0e10cSrcweir if (bApi && !bXMLLoading) 841cdf0e10cSrcweir NotifyInputHandler( rPos ); 842cdf0e10cSrcweir 843cdf0e10cSrcweir return sal_True; 844cdf0e10cSrcweir } 845cdf0e10cSrcweir 846cdf0e10cSrcweir void ScDocFunc::NotifyInputHandler( const ScAddress& rPos ) 847cdf0e10cSrcweir { 848cdf0e10cSrcweir ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell(); 849cdf0e10cSrcweir if ( pViewSh && pViewSh->GetViewData()->GetDocShell() == &rDocShell ) 850cdf0e10cSrcweir { 851cdf0e10cSrcweir ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl(); 852cdf0e10cSrcweir if ( pInputHdl && pInputHdl->GetCursorPos() == rPos ) 853cdf0e10cSrcweir { 854cdf0e10cSrcweir sal_Bool bIsEditMode(pInputHdl->IsEditMode()); 855cdf0e10cSrcweir 856cdf0e10cSrcweir // set modified if in editmode, because so the string is not set in the InputWindow like in the cell 857cdf0e10cSrcweir // (the cell shows the same like the InputWindow) 858cdf0e10cSrcweir if (bIsEditMode) 859cdf0e10cSrcweir pInputHdl->SetModified(); 860cdf0e10cSrcweir pViewSh->UpdateInputHandler(sal_False, !bIsEditMode); 861cdf0e10cSrcweir } 862cdf0e10cSrcweir } 863cdf0e10cSrcweir } 864cdf0e10cSrcweir 865cdf0e10cSrcweir struct ScMyRememberItem 866cdf0e10cSrcweir { 86736a46462SDamjan Jovanovic sal_uInt32 nIndex; 868cdf0e10cSrcweir SfxItemSet aItemSet; 869cdf0e10cSrcweir 87036a46462SDamjan Jovanovic ScMyRememberItem(const SfxItemSet& rItemSet, sal_uInt32 nTempIndex) : 871cdf0e10cSrcweir nIndex(nTempIndex), aItemSet(rItemSet) {} 872cdf0e10cSrcweir }; 873cdf0e10cSrcweir 874cdf0e10cSrcweir typedef ::std::list<ScMyRememberItem*> ScMyRememberItemList; 875cdf0e10cSrcweir 876cdf0e10cSrcweir sal_Bool ScDocFunc::PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine, sal_Bool bInterpret, sal_Bool bApi ) 877cdf0e10cSrcweir { 878cdf0e10cSrcweir // PutData ruft PutCell oder SetNormalString 879cdf0e10cSrcweir 880cdf0e10cSrcweir sal_Bool bRet = sal_False; 881cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 882cdf0e10cSrcweir ScEditAttrTester aTester( &rEngine ); 883cdf0e10cSrcweir sal_Bool bEditCell = aTester.NeedsObject(); 884cdf0e10cSrcweir if ( bEditCell ) 885cdf0e10cSrcweir { 886cdf0e10cSrcweir // #i61702# With bLoseContent set, the content of rEngine isn't restored 887*0ba51277Smseidel // (used in loading XML, where after the removeActionLock call the API object's 888cdf0e10cSrcweir // EditEngine isn't accessed again. 889cdf0e10cSrcweir sal_Bool bLoseContent = pDoc->IsImportingXML(); 890cdf0e10cSrcweir 891cdf0e10cSrcweir sal_Bool bUpdateMode(rEngine.GetUpdateMode()); 892cdf0e10cSrcweir if (bUpdateMode) 893cdf0e10cSrcweir rEngine.SetUpdateMode(sal_False); 894cdf0e10cSrcweir 895cdf0e10cSrcweir ScMyRememberItemList aRememberItems; 896cdf0e10cSrcweir ScMyRememberItem* pRememberItem = NULL; 897cdf0e10cSrcweir 898cdf0e10cSrcweir // All paragraph attributes must be removed before calling CreateTextObject, 899cdf0e10cSrcweir // not only alignment, so the object doesn't contain the cell attributes as 900cdf0e10cSrcweir // paragraph attributes. Before remove the attributes store they in a list to 901cdf0e10cSrcweir // set they back to the EditEngine. 902c2eaa082SDamjan Jovanovic sal_uInt32 nCount = rEngine.GetParagraphCount(); 903c2eaa082SDamjan Jovanovic for (sal_uInt32 i=0; i<nCount; i++) 904cdf0e10cSrcweir { 905cdf0e10cSrcweir const SfxItemSet& rOld = rEngine.GetParaAttribs( i ); 906cdf0e10cSrcweir if ( rOld.Count() ) 907cdf0e10cSrcweir { 908cdf0e10cSrcweir if ( !bLoseContent ) 909cdf0e10cSrcweir { 910cdf0e10cSrcweir pRememberItem = new ScMyRememberItem(rEngine.GetParaAttribs(i), i); 911cdf0e10cSrcweir aRememberItems.push_back(pRememberItem); 912cdf0e10cSrcweir } 913cdf0e10cSrcweir rEngine.SetParaAttribs( i, SfxItemSet( *rOld.GetPool(), rOld.GetRanges() ) ); 914cdf0e10cSrcweir } 915cdf0e10cSrcweir } 916cdf0e10cSrcweir 917cdf0e10cSrcweir EditTextObject* pNewData = rEngine.CreateTextObject(); 918cdf0e10cSrcweir bRet = PutCell( rPos, 919cdf0e10cSrcweir new ScEditCell( pNewData, pDoc, rEngine.GetEditTextObjectPool() ), 920cdf0e10cSrcweir bApi ); 921cdf0e10cSrcweir delete pNewData; 922cdf0e10cSrcweir 923cdf0e10cSrcweir // Set the paragraph attributes back to the EditEngine. 924cdf0e10cSrcweir if (!aRememberItems.empty()) 925cdf0e10cSrcweir { 926cdf0e10cSrcweir // ScMyRememberItem* pRememberItem = NULL; 927cdf0e10cSrcweir ScMyRememberItemList::iterator aItr = aRememberItems.begin(); 928cdf0e10cSrcweir while (aItr != aRememberItems.end()) 929cdf0e10cSrcweir { 930cdf0e10cSrcweir pRememberItem = *aItr; 931cdf0e10cSrcweir rEngine.SetParaAttribs(pRememberItem->nIndex, pRememberItem->aItemSet); 932cdf0e10cSrcweir delete pRememberItem; 933cdf0e10cSrcweir aItr = aRememberItems.erase(aItr); 934cdf0e10cSrcweir } 935cdf0e10cSrcweir } 936cdf0e10cSrcweir 937cdf0e10cSrcweir // #i61702# if the content isn't accessed, there's no need to set the UpdateMode again 938cdf0e10cSrcweir if ( bUpdateMode && !bLoseContent ) 939cdf0e10cSrcweir rEngine.SetUpdateMode(sal_True); 940cdf0e10cSrcweir } 941cdf0e10cSrcweir else 942cdf0e10cSrcweir { 943cdf0e10cSrcweir String aText = rEngine.GetText(); 944cdf0e10cSrcweir if ( bInterpret || !aText.Len() ) 945cdf0e10cSrcweir bRet = SetNormalString( rPos, aText, bApi ); 946cdf0e10cSrcweir else 947cdf0e10cSrcweir bRet = PutCell( rPos, new ScStringCell( aText ), bApi ); 948cdf0e10cSrcweir } 949cdf0e10cSrcweir 950cdf0e10cSrcweir if ( bRet && aTester.NeedsCellAttr() ) 951cdf0e10cSrcweir { 952cdf0e10cSrcweir const SfxItemSet& rEditAttr = aTester.GetAttribs(); 953cdf0e10cSrcweir ScPatternAttr aPattern( pDoc->GetPool() ); 954cdf0e10cSrcweir aPattern.GetFromEditItemSet( &rEditAttr ); 955cdf0e10cSrcweir aPattern.DeleteUnchanged( pDoc->GetPattern( rPos.Col(), rPos.Row(), rPos.Tab() ) ); 956cdf0e10cSrcweir aPattern.GetItemSet().ClearItem( ATTR_HOR_JUSTIFY ); // wasn't removed above if no edit object 957cdf0e10cSrcweir if ( aPattern.GetItemSet().Count() > 0 ) 958cdf0e10cSrcweir { 959cdf0e10cSrcweir ScMarkData aMark; 960cdf0e10cSrcweir aMark.SelectTable( rPos.Tab(), sal_True ); 961cdf0e10cSrcweir aMark.SetMarkArea( ScRange( rPos ) ); 962cdf0e10cSrcweir ApplyAttributes( aMark, aPattern, sal_True, bApi ); 963cdf0e10cSrcweir } 964cdf0e10cSrcweir } 965cdf0e10cSrcweir 966cdf0e10cSrcweir return bRet; 967cdf0e10cSrcweir } 968cdf0e10cSrcweir 969cdf0e10cSrcweir 970cdf0e10cSrcweir ScTokenArray* lcl_ScDocFunc_CreateTokenArrayXML( const String& rText, const String& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) 971cdf0e10cSrcweir { 972cdf0e10cSrcweir ScTokenArray* pCode = new ScTokenArray; 973cdf0e10cSrcweir pCode->AddString( rText ); 974cdf0e10cSrcweir if( (eGrammar == formula::FormulaGrammar::GRAM_EXTERNAL) && (rFormulaNmsp.Len() > 0) ) 975cdf0e10cSrcweir pCode->AddString( rFormulaNmsp ); 976cdf0e10cSrcweir return pCode; 977cdf0e10cSrcweir } 978cdf0e10cSrcweir 979cdf0e10cSrcweir 980cdf0e10cSrcweir ScBaseCell* ScDocFunc::InterpretEnglishString( const ScAddress& rPos, 981cdf0e10cSrcweir const String& rText, const String& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar, short* pRetFormatType ) 982cdf0e10cSrcweir { 983cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 984cdf0e10cSrcweir ScBaseCell* pNewCell = NULL; 985cdf0e10cSrcweir 986cdf0e10cSrcweir if ( rText.Len() > 1 && rText.GetChar(0) == '=' ) 987cdf0e10cSrcweir { 988cdf0e10cSrcweir ScTokenArray* pCode; 989cdf0e10cSrcweir if ( pDoc->IsImportingXML() ) 990cdf0e10cSrcweir { // temporary formula string as string tokens 991cdf0e10cSrcweir pCode = lcl_ScDocFunc_CreateTokenArrayXML( rText, rFormulaNmsp, eGrammar ); 992cdf0e10cSrcweir pDoc->IncXMLImportedFormulaCount( rText.Len() ); 993cdf0e10cSrcweir } 994cdf0e10cSrcweir else 995cdf0e10cSrcweir { 996cdf0e10cSrcweir ScCompiler aComp( pDoc, rPos ); 997cdf0e10cSrcweir aComp.SetGrammar(eGrammar); 998cdf0e10cSrcweir pCode = aComp.CompileString( rText ); 999cdf0e10cSrcweir } 1000cdf0e10cSrcweir pNewCell = new ScFormulaCell( pDoc, rPos, pCode, eGrammar, MM_NONE ); 1001cdf0e10cSrcweir delete pCode; // Zell-ctor hat das TokenArray kopiert 1002cdf0e10cSrcweir } 1003cdf0e10cSrcweir else if ( rText.Len() > 1 && rText.GetChar(0) == '\'' ) 1004cdf0e10cSrcweir { 1005cdf0e10cSrcweir // for bEnglish, "'" at the beginning is always interpreted as text 1006cdf0e10cSrcweir // marker and stripped 1007cdf0e10cSrcweir pNewCell = ScBaseCell::CreateTextCell( rText.Copy( 1 ), pDoc ); 1008cdf0e10cSrcweir } 1009cdf0e10cSrcweir else // (nur) auf englisches Zahlformat testen 1010cdf0e10cSrcweir { 1011cdf0e10cSrcweir SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); 1012cdf0e10cSrcweir sal_uInt32 nEnglish = pFormatter->GetStandardIndex(LANGUAGE_ENGLISH_US); 1013cdf0e10cSrcweir double fVal; 1014cdf0e10cSrcweir if ( pFormatter->IsNumberFormat( rText, nEnglish, fVal ) ) 1015cdf0e10cSrcweir { 1016cdf0e10cSrcweir pNewCell = new ScValueCell( fVal ); 1017cdf0e10cSrcweir // return the format type from the English format, so a localized format can be created 1018cdf0e10cSrcweir if ( pRetFormatType ) 1019cdf0e10cSrcweir *pRetFormatType = pFormatter->GetType( nEnglish ); 1020cdf0e10cSrcweir } 1021cdf0e10cSrcweir else if ( rText.Len() ) 1022cdf0e10cSrcweir pNewCell = ScBaseCell::CreateTextCell( rText, pDoc ); 1023cdf0e10cSrcweir 1024cdf0e10cSrcweir // das (englische) Zahlformat wird nicht gesetzt 1025cdf0e10cSrcweir //! passendes lokales Format suchen und setzen??? 1026cdf0e10cSrcweir } 1027cdf0e10cSrcweir 1028cdf0e10cSrcweir return pNewCell; 1029cdf0e10cSrcweir } 1030cdf0e10cSrcweir 1031cdf0e10cSrcweir 1032cdf0e10cSrcweir sal_Bool ScDocFunc::SetCellText( const ScAddress& rPos, const String& rText, 1033cdf0e10cSrcweir sal_Bool bInterpret, sal_Bool bEnglish, sal_Bool bApi, 1034cdf0e10cSrcweir const String& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) 1035cdf0e10cSrcweir { 1036cdf0e10cSrcweir // SetCellText ruft PutCell oder SetNormalString 1037cdf0e10cSrcweir 1038cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 1039cdf0e10cSrcweir ScBaseCell* pNewCell = NULL; 1040cdf0e10cSrcweir if ( bInterpret ) 1041cdf0e10cSrcweir { 1042cdf0e10cSrcweir if ( bEnglish ) 1043cdf0e10cSrcweir { 1044cdf0e10cSrcweir ::boost::scoped_ptr<ScExternalRefManager::ApiGuard> pExtRefGuard; 1045cdf0e10cSrcweir if (bApi) 1046cdf0e10cSrcweir pExtRefGuard.reset(new ScExternalRefManager::ApiGuard(pDoc)); 1047cdf0e10cSrcweir 1048cdf0e10cSrcweir // code moved to own method InterpretEnglishString because it is also used in 1049cdf0e10cSrcweir // ScCellRangeObj::setFormulaArray 1050cdf0e10cSrcweir 1051cdf0e10cSrcweir pNewCell = InterpretEnglishString( rPos, rText, rFormulaNmsp, eGrammar ); 1052cdf0e10cSrcweir } 1053cdf0e10cSrcweir // sonst Null behalten -> SetString mit lokalen Formeln/Zahlformat 1054cdf0e10cSrcweir } 1055cdf0e10cSrcweir else if ( rText.Len() ) 1056cdf0e10cSrcweir { 1057cdf0e10cSrcweir OSL_ENSURE( rFormulaNmsp.Len() == 0, "ScDocFunc::SetCellText - formula namespace, but do not interpret?" ); 1058cdf0e10cSrcweir pNewCell = ScBaseCell::CreateTextCell( rText, pDoc ); // immer Text 1059cdf0e10cSrcweir } 1060cdf0e10cSrcweir 1061cdf0e10cSrcweir if (pNewCell) 1062cdf0e10cSrcweir return PutCell( rPos, pNewCell, bApi ); 1063cdf0e10cSrcweir else 1064cdf0e10cSrcweir return SetNormalString( rPos, rText, bApi ); 1065cdf0e10cSrcweir } 1066cdf0e10cSrcweir 1067cdf0e10cSrcweir //------------------------------------------------------------------------ 1068cdf0e10cSrcweir 1069cdf0e10cSrcweir bool ScDocFunc::ShowNote( const ScAddress& rPos, bool bShow ) 1070cdf0e10cSrcweir { 1071cdf0e10cSrcweir ScDocument& rDoc = *rDocShell.GetDocument(); 1072cdf0e10cSrcweir ScPostIt* pNote = rDoc.GetNote( rPos ); 1073cdf0e10cSrcweir if( !pNote || (bShow == pNote->IsCaptionShown()) ) return false; 1074cdf0e10cSrcweir 1075cdf0e10cSrcweir // move the caption to internal or hidden layer and create undo action 1076cdf0e10cSrcweir pNote->ShowCaption( rPos, bShow ); 1077cdf0e10cSrcweir if( rDoc.IsUndoEnabled() ) 1078cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( new ScUndoShowHideNote( rDocShell, rPos, bShow ) ); 1079cdf0e10cSrcweir 1080cdf0e10cSrcweir if (rDoc.IsStreamValid(rPos.Tab())) 1081cdf0e10cSrcweir rDoc.SetStreamValid(rPos.Tab(), sal_False); 1082cdf0e10cSrcweir 1083cdf0e10cSrcweir rDocShell.SetDocumentModified(); 1084cdf0e10cSrcweir 1085cdf0e10cSrcweir return true; 1086cdf0e10cSrcweir } 1087cdf0e10cSrcweir 1088cdf0e10cSrcweir //------------------------------------------------------------------------ 1089cdf0e10cSrcweir 1090cdf0e10cSrcweir bool ScDocFunc::SetNoteText( const ScAddress& rPos, const String& rText, sal_Bool bApi ) 1091cdf0e10cSrcweir { 1092cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 1093cdf0e10cSrcweir 1094cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 1095cdf0e10cSrcweir ScEditableTester aTester( pDoc, rPos.Tab(), rPos.Col(),rPos.Row(), rPos.Col(),rPos.Row() ); 1096cdf0e10cSrcweir if (!aTester.IsEditable()) 1097cdf0e10cSrcweir { 1098cdf0e10cSrcweir if (!bApi) 1099cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 1100cdf0e10cSrcweir return false; 1101cdf0e10cSrcweir } 1102cdf0e10cSrcweir 1103cdf0e10cSrcweir String aNewText = rText; 1104cdf0e10cSrcweir aNewText.ConvertLineEnd(); //! ist das noetig ??? 1105cdf0e10cSrcweir 1106cdf0e10cSrcweir if( ScPostIt* pNote = (aNewText.Len() > 0) ? pDoc->GetOrCreateNote( rPos ) : pDoc->GetNote( rPos ) ) 1107cdf0e10cSrcweir pNote->SetText( rPos, aNewText ); 1108cdf0e10cSrcweir 1109cdf0e10cSrcweir //! Undo !!! 1110cdf0e10cSrcweir 1111cdf0e10cSrcweir if (pDoc->IsStreamValid(rPos.Tab())) 1112cdf0e10cSrcweir pDoc->SetStreamValid(rPos.Tab(), sal_False); 1113cdf0e10cSrcweir 1114cdf0e10cSrcweir rDocShell.PostPaintCell( rPos ); 1115cdf0e10cSrcweir aModificator.SetDocumentModified(); 1116cdf0e10cSrcweir 1117cdf0e10cSrcweir return true; 1118cdf0e10cSrcweir } 1119cdf0e10cSrcweir 1120cdf0e10cSrcweir //------------------------------------------------------------------------ 1121cdf0e10cSrcweir 1122cdf0e10cSrcweir bool ScDocFunc::ReplaceNote( const ScAddress& rPos, const String& rNoteText, const String* pAuthor, const String* pDate, sal_Bool bApi ) 1123cdf0e10cSrcweir { 1124cdf0e10cSrcweir bool bDone = false; 1125cdf0e10cSrcweir 1126cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 1127cdf0e10cSrcweir ScDocument& rDoc = *rDocShell.GetDocument(); 1128cdf0e10cSrcweir ScEditableTester aTester( &rDoc, rPos.Tab(), rPos.Col(),rPos.Row(), rPos.Col(),rPos.Row() ); 1129cdf0e10cSrcweir if (aTester.IsEditable()) 1130cdf0e10cSrcweir { 1131cdf0e10cSrcweir ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer(); 1132cdf0e10cSrcweir ::svl::IUndoManager* pUndoMgr = (pDrawLayer && rDoc.IsUndoEnabled()) ? rDocShell.GetUndoManager() : 0; 1133cdf0e10cSrcweir 1134cdf0e10cSrcweir ScNoteData aOldData; 1135cdf0e10cSrcweir ScPostIt* pOldNote = rDoc.ReleaseNote( rPos ); 1136cdf0e10cSrcweir if( pOldNote ) 1137cdf0e10cSrcweir { 1138cdf0e10cSrcweir // ensure existing caption object before draw undo tracking starts 1139cdf0e10cSrcweir pOldNote->GetOrCreateCaption( rPos ); 1140cdf0e10cSrcweir // rescue note data for undo 1141cdf0e10cSrcweir aOldData = pOldNote->GetNoteData(); 1142cdf0e10cSrcweir } 1143cdf0e10cSrcweir 1144*0ba51277Smseidel // collect drawing undo actions for deleting/inserting caption objects 1145cdf0e10cSrcweir if( pUndoMgr ) 1146a840a559SArmin Le Grand pDrawLayer->BeginCalcUndo(false); 1147cdf0e10cSrcweir 1148cdf0e10cSrcweir // delete the note (creates drawing undo action for the caption object) 1149cdf0e10cSrcweir delete pOldNote; 1150cdf0e10cSrcweir 1151cdf0e10cSrcweir // create new note (creates drawing undo action for the new caption object) 1152cdf0e10cSrcweir ScNoteData aNewData; 1153cdf0e10cSrcweir if( ScPostIt* pNewNote = ScNoteUtil::CreateNoteFromString( rDoc, rPos, rNoteText, false, true ) ) 1154cdf0e10cSrcweir { 1155cdf0e10cSrcweir if( pAuthor ) pNewNote->SetAuthor( *pAuthor ); 1156cdf0e10cSrcweir if( pDate ) pNewNote->SetDate( *pDate ); 1157cdf0e10cSrcweir // rescue note data for undo 1158cdf0e10cSrcweir aNewData = pNewNote->GetNoteData(); 1159cdf0e10cSrcweir } 1160cdf0e10cSrcweir 1161cdf0e10cSrcweir // create the undo action 1162cdf0e10cSrcweir if( pUndoMgr && (aOldData.mpCaption || aNewData.mpCaption) ) 1163cdf0e10cSrcweir pUndoMgr->AddUndoAction( new ScUndoReplaceNote( rDocShell, rPos, aOldData, aNewData, pDrawLayer->GetCalcUndo() ) ); 1164cdf0e10cSrcweir 1165cdf0e10cSrcweir // repaint cell (to make note marker visible) 1166cdf0e10cSrcweir rDocShell.PostPaintCell( rPos ); 1167cdf0e10cSrcweir 1168cdf0e10cSrcweir if (rDoc.IsStreamValid(rPos.Tab())) 1169cdf0e10cSrcweir rDoc.SetStreamValid(rPos.Tab(), sal_False); 1170cdf0e10cSrcweir 1171cdf0e10cSrcweir aModificator.SetDocumentModified(); 1172cdf0e10cSrcweir bDone = true; 1173cdf0e10cSrcweir } 1174cdf0e10cSrcweir else if (!bApi) 1175cdf0e10cSrcweir { 1176cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 1177cdf0e10cSrcweir } 1178cdf0e10cSrcweir 1179cdf0e10cSrcweir return bDone; 1180cdf0e10cSrcweir } 1181cdf0e10cSrcweir 1182cdf0e10cSrcweir //------------------------------------------------------------------------ 1183cdf0e10cSrcweir 1184cdf0e10cSrcweir sal_Bool ScDocFunc::ApplyAttributes( const ScMarkData& rMark, const ScPatternAttr& rPattern, 1185cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bApi ) 1186cdf0e10cSrcweir { 1187cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 1188cdf0e10cSrcweir if ( bRecord && !pDoc->IsUndoEnabled() ) 1189cdf0e10cSrcweir bRecord = sal_False; 1190cdf0e10cSrcweir 1191cdf0e10cSrcweir sal_Bool bImportingXML = pDoc->IsImportingXML(); 1192cdf0e10cSrcweir // Cell formats can still be set if the range isn't editable only because of matrix formulas. 1193cdf0e10cSrcweir // #i62483# When loading XML, the check can be skipped altogether. 1194cdf0e10cSrcweir sal_Bool bOnlyNotBecauseOfMatrix; 1195cdf0e10cSrcweir if ( !bImportingXML && !pDoc->IsSelectionEditable( rMark, &bOnlyNotBecauseOfMatrix ) 1196cdf0e10cSrcweir && !bOnlyNotBecauseOfMatrix ) 1197cdf0e10cSrcweir { 1198cdf0e10cSrcweir if (!bApi) 1199cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PROTECTIONERR); 1200cdf0e10cSrcweir return sal_False; 1201cdf0e10cSrcweir } 1202cdf0e10cSrcweir 1203cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 1204cdf0e10cSrcweir 1205cdf0e10cSrcweir //! Umrandung 1206cdf0e10cSrcweir 1207cdf0e10cSrcweir ScRange aMultiRange; 1208cdf0e10cSrcweir sal_Bool bMulti = rMark.IsMultiMarked(); 1209cdf0e10cSrcweir if ( bMulti ) 1210cdf0e10cSrcweir rMark.GetMultiMarkArea( aMultiRange ); 1211cdf0e10cSrcweir else 1212cdf0e10cSrcweir rMark.GetMarkArea( aMultiRange ); 1213cdf0e10cSrcweir 1214cdf0e10cSrcweir if ( bRecord ) 1215cdf0e10cSrcweir { 1216cdf0e10cSrcweir ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 1217cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, aMultiRange.aStart.Tab(), aMultiRange.aEnd.Tab() ); 1218cdf0e10cSrcweir pDoc->CopyToDocument( aMultiRange, IDF_ATTRIB, bMulti, pUndoDoc, &rMark ); 1219cdf0e10cSrcweir 1220cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 1221cdf0e10cSrcweir new ScUndoSelectionAttr( 1222cdf0e10cSrcweir &rDocShell, rMark, 1223cdf0e10cSrcweir aMultiRange.aStart.Col(), aMultiRange.aStart.Row(), aMultiRange.aStart.Tab(), 1224cdf0e10cSrcweir aMultiRange.aEnd.Col(), aMultiRange.aEnd.Row(), aMultiRange.aEnd.Tab(), 1225cdf0e10cSrcweir pUndoDoc, bMulti, &rPattern ) ); 1226cdf0e10cSrcweir } 1227cdf0e10cSrcweir 122886e1cf34SPedro Giffuni // While loading XML it is not necessary to ask HasAttrib. It needs too much time. 1229cdf0e10cSrcweir sal_uInt16 nExtFlags = 0; 1230cdf0e10cSrcweir if ( !bImportingXML ) 1231cdf0e10cSrcweir rDocShell.UpdatePaintExt( nExtFlags, aMultiRange ); // content before the change 1232cdf0e10cSrcweir pDoc->ApplySelectionPattern( rPattern, rMark ); 1233cdf0e10cSrcweir if ( !bImportingXML ) 1234cdf0e10cSrcweir rDocShell.UpdatePaintExt( nExtFlags, aMultiRange ); // content after the change 1235cdf0e10cSrcweir 1236cdf0e10cSrcweir if (!AdjustRowHeight( aMultiRange )) 1237cdf0e10cSrcweir rDocShell.PostPaint( aMultiRange, PAINT_GRID, nExtFlags ); 1238cdf0e10cSrcweir else if (nExtFlags & SC_PF_LINES) 1239cdf0e10cSrcweir lcl_PaintAbove( rDocShell, aMultiRange ); // fuer Linien ueber dem Bereich 1240cdf0e10cSrcweir 1241cdf0e10cSrcweir aModificator.SetDocumentModified(); 1242cdf0e10cSrcweir 1243cdf0e10cSrcweir return sal_True; 1244cdf0e10cSrcweir } 1245cdf0e10cSrcweir 1246cdf0e10cSrcweir 1247cdf0e10cSrcweir sal_Bool ScDocFunc::ApplyStyle( const ScMarkData& rMark, const String& rStyleName, 1248cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bApi ) 1249cdf0e10cSrcweir { 1250cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 1251cdf0e10cSrcweir if ( bRecord && !pDoc->IsUndoEnabled() ) 1252cdf0e10cSrcweir bRecord = sal_False; 1253cdf0e10cSrcweir 1254cdf0e10cSrcweir sal_Bool bImportingXML = pDoc->IsImportingXML(); 1255cdf0e10cSrcweir // Cell formats can still be set if the range isn't editable only because of matrix formulas. 1256cdf0e10cSrcweir // #i62483# When loading XML, the check can be skipped altogether. 1257cdf0e10cSrcweir sal_Bool bOnlyNotBecauseOfMatrix; 1258cdf0e10cSrcweir if ( !bImportingXML && !pDoc->IsSelectionEditable( rMark, &bOnlyNotBecauseOfMatrix ) 1259cdf0e10cSrcweir && !bOnlyNotBecauseOfMatrix ) 1260cdf0e10cSrcweir { 1261cdf0e10cSrcweir if (!bApi) 1262cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PROTECTIONERR); 1263cdf0e10cSrcweir return sal_False; 1264cdf0e10cSrcweir } 1265cdf0e10cSrcweir 1266cdf0e10cSrcweir ScStyleSheet* pStyleSheet = (ScStyleSheet*) pDoc->GetStyleSheetPool()->Find( 1267cdf0e10cSrcweir rStyleName, SFX_STYLE_FAMILY_PARA ); 1268cdf0e10cSrcweir if (!pStyleSheet) 1269cdf0e10cSrcweir return sal_False; 1270cdf0e10cSrcweir 1271cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 1272cdf0e10cSrcweir 1273cdf0e10cSrcweir ScRange aMultiRange; 1274cdf0e10cSrcweir sal_Bool bMulti = rMark.IsMultiMarked(); 1275cdf0e10cSrcweir if ( bMulti ) 1276cdf0e10cSrcweir rMark.GetMultiMarkArea( aMultiRange ); 1277cdf0e10cSrcweir else 1278cdf0e10cSrcweir rMark.GetMarkArea( aMultiRange ); 1279cdf0e10cSrcweir 1280cdf0e10cSrcweir if ( bRecord ) 1281cdf0e10cSrcweir { 1282cdf0e10cSrcweir ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 1283cdf0e10cSrcweir SCTAB nStartTab = aMultiRange.aStart.Tab(); 1284cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 1285cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab ); 1286cdf0e10cSrcweir for (SCTAB i=0; i<nTabCount; i++) 1287cdf0e10cSrcweir if (i != nStartTab && rMark.GetTableSelect(i)) 1288cdf0e10cSrcweir pUndoDoc->AddUndoTab( i, i ); 1289cdf0e10cSrcweir 1290cdf0e10cSrcweir ScRange aCopyRange = aMultiRange; 1291cdf0e10cSrcweir aCopyRange.aStart.SetTab(0); 1292cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1); 1293cdf0e10cSrcweir pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, bMulti, pUndoDoc, &rMark ); 1294cdf0e10cSrcweir 1295cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 1296cdf0e10cSrcweir new ScUndoSelectionStyle( 1297cdf0e10cSrcweir &rDocShell, rMark, aMultiRange, rStyleName, pUndoDoc ) ); 1298cdf0e10cSrcweir 1299cdf0e10cSrcweir } 1300cdf0e10cSrcweir 1301cdf0e10cSrcweir // sal_Bool bPaintExt = pDoc->HasAttrib( aMultiRange, HASATTR_PAINTEXT ); 1302cdf0e10cSrcweir // pDoc->ApplySelectionPattern( rPattern, rMark ); 1303cdf0e10cSrcweir 1304cdf0e10cSrcweir pDoc->ApplySelectionStyle( (ScStyleSheet&)*pStyleSheet, rMark ); 1305cdf0e10cSrcweir 1306cdf0e10cSrcweir // if (!bPaintExt) 1307cdf0e10cSrcweir // bPaintExt = pDoc->HasAttrib( aMultiRange, HASATTR_PAINTEXT ); 1308cdf0e10cSrcweir // sal_uInt16 nExtFlags = bPaintExt ? SC_PF_LINES : 0; 1309cdf0e10cSrcweir sal_uInt16 nExtFlags = 0; 1310cdf0e10cSrcweir if (!AdjustRowHeight( aMultiRange )) 1311cdf0e10cSrcweir rDocShell.PostPaint( aMultiRange, PAINT_GRID, nExtFlags ); 1312cdf0e10cSrcweir else if (nExtFlags & SC_PF_LINES) 1313cdf0e10cSrcweir lcl_PaintAbove( rDocShell, aMultiRange ); // fuer Linien ueber dem Bereich 1314cdf0e10cSrcweir 1315cdf0e10cSrcweir aModificator.SetDocumentModified(); 1316cdf0e10cSrcweir 1317cdf0e10cSrcweir return sal_True; 1318cdf0e10cSrcweir } 1319cdf0e10cSrcweir 1320cdf0e10cSrcweir //------------------------------------------------------------------------ 1321cdf0e10cSrcweir 1322cdf0e10cSrcweir sal_Bool ScDocFunc::InsertCells( const ScRange& rRange, const ScMarkData* pTabMark, InsCellCmd eCmd, 1323cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bApi, sal_Bool bPartOfPaste ) 1324cdf0e10cSrcweir { 1325cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 1326cdf0e10cSrcweir 1327cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 1328cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 1329cdf0e10cSrcweir SCTAB nStartTab = rRange.aStart.Tab(); 1330cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 1331cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 1332cdf0e10cSrcweir SCTAB nEndTab = rRange.aEnd.Tab(); 1333cdf0e10cSrcweir 1334cdf0e10cSrcweir if ( !ValidRow(nStartRow) || !ValidRow(nEndRow) ) 1335cdf0e10cSrcweir { 1336cdf0e10cSrcweir DBG_ERROR("invalid row in InsertCells"); 1337cdf0e10cSrcweir return sal_False; 1338cdf0e10cSrcweir } 1339cdf0e10cSrcweir 1340cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 1341cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 1342cdf0e10cSrcweir SCCOL nPaintStartX = nStartCol; 1343cdf0e10cSrcweir SCROW nPaintStartY = nStartRow; 1344cdf0e10cSrcweir SCCOL nPaintEndX = nEndCol; 1345cdf0e10cSrcweir SCROW nPaintEndY = nEndRow; 1346cdf0e10cSrcweir sal_uInt16 nPaintFlags = PAINT_GRID; 1347cdf0e10cSrcweir sal_Bool bSuccess; 1348cdf0e10cSrcweir SCTAB i; 1349cdf0e10cSrcweir 1350cdf0e10cSrcweir ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); //preserve current cursor position 1351cdf0e10cSrcweir SCCOL nCursorCol = 0; 1352cdf0e10cSrcweir SCROW nCursorRow = 0; 1353cdf0e10cSrcweir if( pViewSh ) 1354cdf0e10cSrcweir { 1355cdf0e10cSrcweir nCursorCol = pViewSh->GetViewData()->GetCurX(); 1356cdf0e10cSrcweir nCursorRow = pViewSh->GetViewData()->GetCurY(); 1357cdf0e10cSrcweir } 1358cdf0e10cSrcweir 1359cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 1360cdf0e10cSrcweir bRecord = sal_False; 1361cdf0e10cSrcweir 1362cdf0e10cSrcweir ScMarkData aMark; 1363cdf0e10cSrcweir if (pTabMark) 1364cdf0e10cSrcweir aMark = *pTabMark; 1365cdf0e10cSrcweir else 1366cdf0e10cSrcweir { 1367cdf0e10cSrcweir SCTAB nCount = 0; 1368cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 1369cdf0e10cSrcweir { 1370cdf0e10cSrcweir if( !pDoc->IsScenario(i) ) 1371cdf0e10cSrcweir { 1372cdf0e10cSrcweir nCount++; 1373cdf0e10cSrcweir if( nCount == nEndTab+1 ) 1374cdf0e10cSrcweir { 1375cdf0e10cSrcweir aMark.SelectTable( i, sal_True ); 1376cdf0e10cSrcweir break; 1377cdf0e10cSrcweir } 1378cdf0e10cSrcweir } 1379cdf0e10cSrcweir } 1380cdf0e10cSrcweir } 1381cdf0e10cSrcweir 1382cdf0e10cSrcweir ScMarkData aFullMark( aMark ); // including scenario sheets 1383cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 1384cdf0e10cSrcweir if( aMark.GetTableSelect( i ) ) 1385cdf0e10cSrcweir { 1386cdf0e10cSrcweir for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) 1387cdf0e10cSrcweir aFullMark.SelectTable( j, sal_True ); 1388cdf0e10cSrcweir } 1389cdf0e10cSrcweir 1390cdf0e10cSrcweir SCTAB nSelCount = aMark.GetSelectCount(); 1391cdf0e10cSrcweir 1392cdf0e10cSrcweir // zugehoerige Szenarien auch anpassen 1393cdf0e10cSrcweir // Test zusammengefasste 1394cdf0e10cSrcweir 1395cdf0e10cSrcweir SCCOL nMergeTestStartX = nStartCol; 1396cdf0e10cSrcweir SCROW nMergeTestStartY = nStartRow; 1397cdf0e10cSrcweir SCCOL nMergeTestEndX = nEndCol; 1398cdf0e10cSrcweir SCROW nMergeTestEndY = nEndRow; 1399cdf0e10cSrcweir 1400cdf0e10cSrcweir ScRange aExtendMergeRange( rRange ); 1401cdf0e10cSrcweir 1402cdf0e10cSrcweir if( rRange.aStart == rRange.aEnd && pDoc->HasAttrib(rRange, HASATTR_MERGED) ) 1403cdf0e10cSrcweir { 1404cdf0e10cSrcweir pDoc->ExtendMerge( aExtendMergeRange ); 1405cdf0e10cSrcweir pDoc->ExtendOverlapped( aExtendMergeRange ); 1406cdf0e10cSrcweir nMergeTestEndX = aExtendMergeRange.aEnd.Col(); 1407cdf0e10cSrcweir nMergeTestEndY = aExtendMergeRange.aEnd.Row(); 1408cdf0e10cSrcweir nPaintEndX = nMergeTestEndX; 1409cdf0e10cSrcweir nPaintEndY = nMergeTestEndY; 1410cdf0e10cSrcweir } 1411cdf0e10cSrcweir 1412cdf0e10cSrcweir if ( eCmd == INS_INSROWS ) 1413cdf0e10cSrcweir { 1414cdf0e10cSrcweir nMergeTestStartX = 0; 1415cdf0e10cSrcweir nMergeTestEndX = MAXCOL; 1416cdf0e10cSrcweir } 1417cdf0e10cSrcweir if ( eCmd == INS_INSCOLS ) 1418cdf0e10cSrcweir { 1419cdf0e10cSrcweir nMergeTestStartY = 0; 1420cdf0e10cSrcweir nMergeTestEndY = MAXROW; 1421cdf0e10cSrcweir } 1422cdf0e10cSrcweir if ( eCmd == INS_CELLSDOWN ) 1423cdf0e10cSrcweir nMergeTestEndY = MAXROW; 1424cdf0e10cSrcweir if ( eCmd == INS_CELLSRIGHT ) 1425cdf0e10cSrcweir nMergeTestEndX = MAXCOL; 1426cdf0e10cSrcweir 1427cdf0e10cSrcweir sal_Bool bNeedRefresh = sal_False; 1428cdf0e10cSrcweir 1429cdf0e10cSrcweir SCCOL nEditTestEndX = (eCmd==INS_INSCOLS) ? MAXCOL : nMergeTestEndX; 1430cdf0e10cSrcweir SCROW nEditTestEndY = (eCmd==INS_INSROWS) ? MAXROW : nMergeTestEndY; 1431cdf0e10cSrcweir ScEditableTester aTester( pDoc, nMergeTestStartX, nMergeTestStartY, nEditTestEndX, nEditTestEndY, aMark ); 1432cdf0e10cSrcweir if (!aTester.IsEditable()) 1433cdf0e10cSrcweir { 1434cdf0e10cSrcweir if (!bApi) 1435cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 1436cdf0e10cSrcweir return sal_False; 1437cdf0e10cSrcweir } 1438cdf0e10cSrcweir 1439cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); // wichtig wegen TrackFormulas bei UpdateReference 1440cdf0e10cSrcweir 1441cdf0e10cSrcweir ScDocument* pRefUndoDoc = NULL; 1442cdf0e10cSrcweir ScRefUndoData* pUndoData = NULL; 1443cdf0e10cSrcweir if ( bRecord ) 1444cdf0e10cSrcweir { 1445cdf0e10cSrcweir pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 1446cdf0e10cSrcweir pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, sal_False, sal_False ); 1447cdf0e10cSrcweir 1448cdf0e10cSrcweir // pRefUndoDoc is filled in InsertCol / InsertRow 1449cdf0e10cSrcweir 1450cdf0e10cSrcweir pUndoData = new ScRefUndoData( pDoc ); 1451cdf0e10cSrcweir 1452cdf0e10cSrcweir pDoc->BeginDrawUndo(); 1453cdf0e10cSrcweir } 1454cdf0e10cSrcweir 1455cdf0e10cSrcweir // #i8302 : we unmerge overwhelming ranges, before insertion all the actions are put in the same ListAction 1456cdf0e10cSrcweir // the patch comes from mloiseleur and maoyg 1457cdf0e10cSrcweir sal_Bool bInsertMerge = sal_False; 1458cdf0e10cSrcweir std::vector<ScRange> qIncreaseRange; 1459cdf0e10cSrcweir String aUndo = ScGlobal::GetRscString( STR_UNDO_INSERTCELLS ); 1460cdf0e10cSrcweir if (bRecord) 1461cdf0e10cSrcweir rDocShell.GetUndoManager()->EnterListAction( aUndo, aUndo ); 1462cdf0e10cSrcweir 1463cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 1464cdf0e10cSrcweir { 1465cdf0e10cSrcweir if( aMark.GetTableSelect(i) ) 1466cdf0e10cSrcweir { 1467cdf0e10cSrcweir if( pDoc->HasAttrib( nMergeTestStartX, nMergeTestStartY, i, nMergeTestEndX, nMergeTestEndY, i, HASATTR_MERGED | HASATTR_OVERLAPPED ) ) 1468cdf0e10cSrcweir { 1469cdf0e10cSrcweir if (eCmd==INS_CELLSRIGHT) 1470cdf0e10cSrcweir bNeedRefresh = sal_True; 1471cdf0e10cSrcweir 1472cdf0e10cSrcweir SCCOL nMergeStartX = nMergeTestStartX; 1473cdf0e10cSrcweir SCROW nMergeStartY = nMergeTestStartY; 1474cdf0e10cSrcweir SCCOL nMergeEndX = nMergeTestEndX; 1475cdf0e10cSrcweir SCROW nMergeEndY = nMergeTestEndY; 1476cdf0e10cSrcweir 1477cdf0e10cSrcweir pDoc->ExtendMerge( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i ); 1478cdf0e10cSrcweir pDoc->ExtendOverlapped( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i ); 1479cdf0e10cSrcweir 1480cdf0e10cSrcweir if(( eCmd == INS_CELLSDOWN && ( nMergeStartX != nMergeTestStartX || nMergeEndX != nMergeTestEndX )) || 1481cdf0e10cSrcweir (eCmd == INS_CELLSRIGHT && ( nMergeStartY != nMergeTestStartY || nMergeEndY != nMergeTestEndY )) ) 1482cdf0e10cSrcweir { 1483cdf0e10cSrcweir if (!bApi) 1484cdf0e10cSrcweir rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0); 1485cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 1486cdf0e10cSrcweir return sal_False; 1487cdf0e10cSrcweir } 1488cdf0e10cSrcweir 1489cdf0e10cSrcweir SCCOL nTestCol = -1; 1490cdf0e10cSrcweir SCROW nTestRow1 = -1; 1491cdf0e10cSrcweir SCROW nTestRow2 = -1; 1492cdf0e10cSrcweir 1493cdf0e10cSrcweir ScDocAttrIterator aTestIter( pDoc, i, nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY ); 1494cdf0e10cSrcweir ScRange aExtendRange( nMergeTestStartX, nMergeTestStartY, i, nMergeTestEndX, nMergeTestEndY, i ); 1495cdf0e10cSrcweir const ScPatternAttr* pPattern = NULL; 1496cdf0e10cSrcweir const ScMergeAttr* pMergeFlag = NULL; 1497cdf0e10cSrcweir const ScMergeFlagAttr* pMergeFlagAttr = NULL; 1498cdf0e10cSrcweir while ( ( pPattern = aTestIter.GetNext( nTestCol, nTestRow1, nTestRow2 ) ) != NULL ) 1499cdf0e10cSrcweir { 1500cdf0e10cSrcweir pMergeFlag = (const ScMergeAttr*) &pPattern->GetItem(ATTR_MERGE); 1501cdf0e10cSrcweir pMergeFlagAttr = (const ScMergeFlagAttr*) &pPattern->GetItem(ATTR_MERGE_FLAG); 1502cdf0e10cSrcweir sal_Int16 nNewFlags = pMergeFlagAttr->GetValue() & ( SC_MF_HOR | SC_MF_VER ); 1503cdf0e10cSrcweir if( ( pMergeFlag && pMergeFlag->IsMerged() ) || nNewFlags == SC_MF_HOR || nNewFlags == SC_MF_VER ) 1504cdf0e10cSrcweir { 1505cdf0e10cSrcweir ScRange aRange( nTestCol, nTestRow1, i ); 1506cdf0e10cSrcweir pDoc->ExtendOverlapped(aRange); 1507cdf0e10cSrcweir pDoc->ExtendMerge(aRange, sal_True, sal_True); 1508cdf0e10cSrcweir 1509cdf0e10cSrcweir if( nTestRow1 < nTestRow2 && nNewFlags == SC_MF_HOR ) 1510cdf0e10cSrcweir { 1511cdf0e10cSrcweir for( SCROW nTestRow = nTestRow1; nTestRow <= nTestRow2; nTestRow++ ) 1512cdf0e10cSrcweir { 1513cdf0e10cSrcweir ScRange aTestRange( nTestCol, nTestRow, i ); 1514cdf0e10cSrcweir pDoc->ExtendOverlapped( aTestRange ); 1515cdf0e10cSrcweir pDoc->ExtendMerge( aTestRange, sal_True, sal_True); 1516cdf0e10cSrcweir ScRange aMergeRange( aTestRange.aStart.Col(),aTestRange.aStart.Row(), i ); 1517cdf0e10cSrcweir if( !aExtendRange.In( aMergeRange ) ) 1518cdf0e10cSrcweir { 1519cdf0e10cSrcweir qIncreaseRange.push_back( aTestRange ); 1520cdf0e10cSrcweir bInsertMerge = sal_True; 1521cdf0e10cSrcweir } 1522cdf0e10cSrcweir } 1523cdf0e10cSrcweir } 1524cdf0e10cSrcweir else 1525cdf0e10cSrcweir { 1526cdf0e10cSrcweir ScRange aMergeRange( aRange.aStart.Col(),aRange.aStart.Row(), i ); 1527cdf0e10cSrcweir if( !aExtendRange.In( aMergeRange ) ) 1528cdf0e10cSrcweir { 1529cdf0e10cSrcweir qIncreaseRange.push_back( aRange ); 1530cdf0e10cSrcweir } 1531cdf0e10cSrcweir bInsertMerge = sal_True; 1532cdf0e10cSrcweir } 1533cdf0e10cSrcweir } 1534cdf0e10cSrcweir } 1535cdf0e10cSrcweir 1536cdf0e10cSrcweir if( bInsertMerge ) 1537cdf0e10cSrcweir { 1538cdf0e10cSrcweir if( eCmd == INS_INSROWS || eCmd == INS_CELLSDOWN ) 1539cdf0e10cSrcweir { 1540cdf0e10cSrcweir nStartRow = aExtendMergeRange.aStart.Row(); 1541cdf0e10cSrcweir nEndRow = aExtendMergeRange.aEnd.Row(); 1542cdf0e10cSrcweir 1543cdf0e10cSrcweir if( eCmd == INS_CELLSDOWN ) 1544cdf0e10cSrcweir nEndCol = nMergeTestEndX; 1545cdf0e10cSrcweir else 1546cdf0e10cSrcweir { 1547cdf0e10cSrcweir nStartCol = 0; 1548cdf0e10cSrcweir nEndCol = MAXCOL; 1549cdf0e10cSrcweir } 1550cdf0e10cSrcweir } 1551cdf0e10cSrcweir else if( eCmd == INS_CELLSRIGHT || eCmd == INS_INSCOLS ) 1552cdf0e10cSrcweir { 1553cdf0e10cSrcweir 1554cdf0e10cSrcweir nStartCol = aExtendMergeRange.aStart.Col(); 1555cdf0e10cSrcweir nEndCol = aExtendMergeRange.aEnd.Col(); 1556cdf0e10cSrcweir if( eCmd == INS_CELLSRIGHT ) 1557cdf0e10cSrcweir { 1558cdf0e10cSrcweir nEndRow = nMergeTestEndY; 1559cdf0e10cSrcweir } 1560cdf0e10cSrcweir else 1561cdf0e10cSrcweir { 1562cdf0e10cSrcweir nStartRow = 0; 1563cdf0e10cSrcweir nEndRow = MAXROW; 1564cdf0e10cSrcweir } 1565cdf0e10cSrcweir } 1566cdf0e10cSrcweir 1567cdf0e10cSrcweir if( !qIncreaseRange.empty() ) 1568cdf0e10cSrcweir { 1569cdf0e10cSrcweir for( ::std::vector<ScRange>::const_iterator iIter( qIncreaseRange.begin()); iIter != qIncreaseRange.end(); iIter++ ) 1570cdf0e10cSrcweir { 1571cdf0e10cSrcweir ScRange aRange( *iIter ); 1572cdf0e10cSrcweir if( pDoc->HasAttrib( aRange, HASATTR_OVERLAPPED | HASATTR_MERGED ) ) 1573cdf0e10cSrcweir { 1574cdf0e10cSrcweir UnmergeCells( aRange, sal_True, sal_True ); 1575cdf0e10cSrcweir } 1576cdf0e10cSrcweir } 1577cdf0e10cSrcweir } 1578cdf0e10cSrcweir } 1579cdf0e10cSrcweir else 1580cdf0e10cSrcweir { 1581cdf0e10cSrcweir if (!bApi) 1582cdf0e10cSrcweir rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0); 1583cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 1584cdf0e10cSrcweir return sal_False; 1585cdf0e10cSrcweir } 1586cdf0e10cSrcweir } 1587cdf0e10cSrcweir } 1588cdf0e10cSrcweir } 1589cdf0e10cSrcweir 1590cdf0e10cSrcweir switch (eCmd) 1591cdf0e10cSrcweir { 1592cdf0e10cSrcweir case INS_CELLSDOWN: 1593cdf0e10cSrcweir bSuccess = pDoc->InsertRow( nStartCol, 0, nEndCol, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &aFullMark ); 1594cdf0e10cSrcweir nPaintEndY = MAXROW; 1595cdf0e10cSrcweir break; 1596cdf0e10cSrcweir case INS_INSROWS: 1597cdf0e10cSrcweir bSuccess = pDoc->InsertRow( 0, 0, MAXCOL, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &aFullMark ); 1598cdf0e10cSrcweir nPaintStartX = 0; 1599cdf0e10cSrcweir nPaintEndX = MAXCOL; 1600cdf0e10cSrcweir nPaintEndY = MAXROW; 1601cdf0e10cSrcweir nPaintFlags |= PAINT_LEFT; 1602cdf0e10cSrcweir break; 1603cdf0e10cSrcweir case INS_CELLSRIGHT: 1604cdf0e10cSrcweir bSuccess = pDoc->InsertCol( nStartRow, 0, nEndRow, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &aFullMark ); 1605cdf0e10cSrcweir nPaintEndX = MAXCOL; 1606cdf0e10cSrcweir break; 1607cdf0e10cSrcweir case INS_INSCOLS: 1608cdf0e10cSrcweir bSuccess = pDoc->InsertCol( 0, 0, MAXROW, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &aFullMark ); 1609cdf0e10cSrcweir nPaintStartY = 0; 1610cdf0e10cSrcweir nPaintEndY = MAXROW; 1611cdf0e10cSrcweir nPaintEndX = MAXCOL; 1612cdf0e10cSrcweir nPaintFlags |= PAINT_TOP; 1613cdf0e10cSrcweir break; 1614cdf0e10cSrcweir default: 1615cdf0e10cSrcweir DBG_ERROR("Falscher Code beim Einfuegen"); 1616cdf0e10cSrcweir bSuccess = sal_False; 1617cdf0e10cSrcweir break; 1618cdf0e10cSrcweir } 1619cdf0e10cSrcweir 1620cdf0e10cSrcweir if ( bSuccess ) 1621cdf0e10cSrcweir { 1622cdf0e10cSrcweir SCTAB* pTabs = NULL; 1623cdf0e10cSrcweir SCTAB* pScenarios = NULL; 1624cdf0e10cSrcweir SCTAB nUndoPos = 0; 1625cdf0e10cSrcweir 1626cdf0e10cSrcweir if ( bRecord ) 1627cdf0e10cSrcweir { 1628cdf0e10cSrcweir pTabs = new SCTAB[nSelCount]; 1629cdf0e10cSrcweir pScenarios = new SCTAB[nSelCount]; 1630cdf0e10cSrcweir nUndoPos = 0; 1631cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 1632cdf0e10cSrcweir { 1633cdf0e10cSrcweir if( aMark.GetTableSelect( i ) ) 1634cdf0e10cSrcweir { 1635cdf0e10cSrcweir SCTAB nCount = 0; 1636cdf0e10cSrcweir for( SCTAB j=i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) 1637cdf0e10cSrcweir nCount ++; 1638cdf0e10cSrcweir 1639cdf0e10cSrcweir pScenarios[nUndoPos] = nCount; 1640cdf0e10cSrcweir pTabs[nUndoPos] = i; 1641cdf0e10cSrcweir nUndoPos ++; 1642cdf0e10cSrcweir } 1643cdf0e10cSrcweir } 1644cdf0e10cSrcweir 1645cdf0e10cSrcweir if( !bInsertMerge ) 1646cdf0e10cSrcweir { 1647cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 1648cdf0e10cSrcweir } 1649cdf0e10cSrcweir 1650cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( new ScUndoInsertCells( 1651cdf0e10cSrcweir &rDocShell, ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ), 1652cdf0e10cSrcweir nUndoPos, pTabs, pScenarios, eCmd, pRefUndoDoc, pUndoData, bPartOfPaste ) ); 1653cdf0e10cSrcweir } 1654cdf0e10cSrcweir 1655cdf0e10cSrcweir // #i8302 : we remerge growing ranges, with the new part inserted 1656cdf0e10cSrcweir 1657cdf0e10cSrcweir while( !qIncreaseRange.empty() ) 1658cdf0e10cSrcweir { 1659cdf0e10cSrcweir ScRange aRange = qIncreaseRange.back(); 1660cdf0e10cSrcweir if( !pDoc->HasAttrib( aRange, HASATTR_OVERLAPPED | HASATTR_MERGED ) ) 1661cdf0e10cSrcweir { 1662cdf0e10cSrcweir switch (eCmd) 1663cdf0e10cSrcweir { 1664cdf0e10cSrcweir case INS_CELLSDOWN: 1665cdf0e10cSrcweir case INS_INSROWS: 1666cdf0e10cSrcweir aRange.aEnd.IncRow(static_cast<SCsCOL>(nEndRow-nStartRow+1)); 1667cdf0e10cSrcweir break; 1668cdf0e10cSrcweir case INS_CELLSRIGHT: 1669cdf0e10cSrcweir case INS_INSCOLS: 1670cdf0e10cSrcweir aRange.aEnd.IncCol(static_cast<SCsCOL>(nEndCol-nStartCol+1)); 1671cdf0e10cSrcweir break; 1672cdf0e10cSrcweir default: 1673cdf0e10cSrcweir break; 1674cdf0e10cSrcweir } 1675cdf0e10cSrcweir MergeCells(aRange, sal_False, sal_True, sal_True); 1676cdf0e10cSrcweir } 1677cdf0e10cSrcweir qIncreaseRange.pop_back(); 1678cdf0e10cSrcweir } 1679cdf0e10cSrcweir 1680cdf0e10cSrcweir if( bInsertMerge ) 1681cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 1682cdf0e10cSrcweir 1683cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 1684cdf0e10cSrcweir { 1685cdf0e10cSrcweir if( aMark.GetTableSelect( i ) ) 1686cdf0e10cSrcweir { 1687cdf0e10cSrcweir if (bNeedRefresh) 1688cdf0e10cSrcweir pDoc->ExtendMerge( nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY, i, sal_True ); 1689cdf0e10cSrcweir else 1690cdf0e10cSrcweir pDoc->RefreshAutoFilter( nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY, i ); 1691cdf0e10cSrcweir 1692cdf0e10cSrcweir if ( eCmd == INS_INSROWS || eCmd == INS_INSCOLS ) 1693cdf0e10cSrcweir pDoc->UpdatePageBreaks( i ); 1694cdf0e10cSrcweir 1695cdf0e10cSrcweir sal_uInt16 nExtFlags = 0; 1696cdf0e10cSrcweir rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i ); 1697cdf0e10cSrcweir 1698cdf0e10cSrcweir SCTAB nScenarioCount = 0; 1699cdf0e10cSrcweir 1700cdf0e10cSrcweir for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) 1701cdf0e10cSrcweir nScenarioCount ++; 1702cdf0e10cSrcweir 1703cdf0e10cSrcweir sal_Bool bAdjusted = ( eCmd == INS_INSROWS ) ? AdjustRowHeight(ScRange(0, nStartRow, i, MAXCOL, nEndRow, i+nScenarioCount )) : 1704cdf0e10cSrcweir AdjustRowHeight(ScRange(0, nPaintStartY, i, MAXCOL, nPaintEndY, i+nScenarioCount )); 1705cdf0e10cSrcweir if (bAdjusted) 1706cdf0e10cSrcweir { 1707cdf0e10cSrcweir // paint only what is not done by AdjustRowHeight 1708cdf0e10cSrcweir if (nPaintFlags & PAINT_TOP) 1709cdf0e10cSrcweir rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, PAINT_TOP ); 1710cdf0e10cSrcweir } 1711cdf0e10cSrcweir else 1712cdf0e10cSrcweir rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, nPaintFlags, nExtFlags ); 1713cdf0e10cSrcweir } 1714cdf0e10cSrcweir } 1715cdf0e10cSrcweir //aModificator.SetDocumentModified(); 1716cdf0e10cSrcweir } 1717cdf0e10cSrcweir else 1718cdf0e10cSrcweir { 1719cdf0e10cSrcweir if( bInsertMerge ) 1720cdf0e10cSrcweir { 1721cdf0e10cSrcweir while( !qIncreaseRange.empty() ) 1722cdf0e10cSrcweir { 1723cdf0e10cSrcweir ScRange aRange = qIncreaseRange.back(); 1724cdf0e10cSrcweir MergeCells(aRange, sal_False, sal_True, sal_True); 1725cdf0e10cSrcweir qIncreaseRange.pop_back(); 1726cdf0e10cSrcweir } 1727cdf0e10cSrcweir 1728cdf0e10cSrcweir if( pViewSh ) 1729cdf0e10cSrcweir { 1730cdf0e10cSrcweir pViewSh->MarkRange( rRange, sal_False ); 1731cdf0e10cSrcweir pViewSh->SetCursor( nCursorCol, nCursorRow ); 1732cdf0e10cSrcweir } 1733cdf0e10cSrcweir } 1734cdf0e10cSrcweir 1735cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 1736cdf0e10cSrcweir rDocShell.GetUndoManager()->RemoveLastUndoAction(); 1737cdf0e10cSrcweir 1738cdf0e10cSrcweir delete pRefUndoDoc; 1739cdf0e10cSrcweir delete pUndoData; 1740cdf0e10cSrcweir if (!bApi) 1741cdf0e10cSrcweir rDocShell.ErrorMessage(STR_INSERT_FULL); // Spalte/Zeile voll 1742cdf0e10cSrcweir } 1743cdf0e10cSrcweir 1744cdf0e10cSrcweir aModificator.SetDocumentModified(); 1745cdf0e10cSrcweir 1746cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); 1747cdf0e10cSrcweir return bSuccess; 1748cdf0e10cSrcweir } 1749cdf0e10cSrcweir 1750cdf0e10cSrcweir sal_Bool ScDocFunc::DeleteCells( const ScRange& rRange, const ScMarkData* pTabMark, DelCellCmd eCmd, 1751cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bApi ) 1752cdf0e10cSrcweir { 1753cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 1754cdf0e10cSrcweir 1755cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 1756cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 1757cdf0e10cSrcweir SCTAB nStartTab = rRange.aStart.Tab(); 1758cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 1759cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 1760cdf0e10cSrcweir SCTAB nEndTab = rRange.aEnd.Tab(); 1761cdf0e10cSrcweir 1762cdf0e10cSrcweir if ( !ValidRow(nStartRow) || !ValidRow(nEndRow) ) 1763cdf0e10cSrcweir { 1764cdf0e10cSrcweir DBG_ERROR("invalid row in DeleteCells"); 1765cdf0e10cSrcweir return sal_False; 1766cdf0e10cSrcweir } 1767cdf0e10cSrcweir 1768cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 1769cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 1770cdf0e10cSrcweir SCCOL nPaintStartX = nStartCol; 1771cdf0e10cSrcweir SCROW nPaintStartY = nStartRow; 1772cdf0e10cSrcweir SCCOL nPaintEndX = nEndCol; 1773cdf0e10cSrcweir SCROW nPaintEndY = nEndRow; 1774cdf0e10cSrcweir sal_uInt16 nPaintFlags = PAINT_GRID; 1775cdf0e10cSrcweir SCTAB i; 1776cdf0e10cSrcweir 1777cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 1778cdf0e10cSrcweir bRecord = sal_False; 1779cdf0e10cSrcweir 1780cdf0e10cSrcweir ScMarkData aMark; 1781cdf0e10cSrcweir if (pTabMark) 1782cdf0e10cSrcweir aMark = *pTabMark; 1783cdf0e10cSrcweir else 1784cdf0e10cSrcweir { 1785cdf0e10cSrcweir SCTAB nCount = 0; 1786cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 1787cdf0e10cSrcweir { 1788cdf0e10cSrcweir if( !pDoc->IsScenario(i) ) 1789cdf0e10cSrcweir { 1790cdf0e10cSrcweir nCount++; 1791cdf0e10cSrcweir if( nCount == nEndTab+1 ) 1792cdf0e10cSrcweir { 1793cdf0e10cSrcweir aMark.SelectTable( i, sal_True ); 1794cdf0e10cSrcweir break; 1795cdf0e10cSrcweir } 1796cdf0e10cSrcweir } 1797cdf0e10cSrcweir } 1798cdf0e10cSrcweir } 1799cdf0e10cSrcweir 1800cdf0e10cSrcweir ScMarkData aFullMark( aMark ); // including scenario sheets 1801cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 1802cdf0e10cSrcweir if( aMark.GetTableSelect( i ) ) 1803cdf0e10cSrcweir { 1804cdf0e10cSrcweir for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) 1805cdf0e10cSrcweir aFullMark.SelectTable( j, sal_True ); 1806cdf0e10cSrcweir } 1807cdf0e10cSrcweir 1808cdf0e10cSrcweir SCTAB nSelCount = aMark.GetSelectCount(); 1809cdf0e10cSrcweir 1810cdf0e10cSrcweir SCCOL nUndoStartX = nStartCol; 1811cdf0e10cSrcweir SCROW nUndoStartY = nStartRow; 1812cdf0e10cSrcweir SCCOL nUndoEndX = nEndCol; 1813cdf0e10cSrcweir SCROW nUndoEndY = nEndRow; 1814cdf0e10cSrcweir 1815cdf0e10cSrcweir ScRange aExtendMergeRange( rRange ); 1816cdf0e10cSrcweir 1817cdf0e10cSrcweir if( rRange.aStart == rRange.aEnd && pDoc->HasAttrib(rRange, HASATTR_MERGED) ) 1818cdf0e10cSrcweir { 1819cdf0e10cSrcweir pDoc->ExtendMerge( aExtendMergeRange ); 1820cdf0e10cSrcweir pDoc->ExtendOverlapped( aExtendMergeRange ); 1821cdf0e10cSrcweir nUndoEndX = aExtendMergeRange.aEnd.Col(); 1822cdf0e10cSrcweir nUndoEndY = aExtendMergeRange.aEnd.Row(); 1823cdf0e10cSrcweir nPaintEndX = nUndoEndX; 1824cdf0e10cSrcweir nPaintEndY = nUndoEndY; 1825cdf0e10cSrcweir } 1826cdf0e10cSrcweir 1827cdf0e10cSrcweir if (eCmd==DEL_DELROWS) 1828cdf0e10cSrcweir { 1829cdf0e10cSrcweir nUndoStartX = 0; 1830cdf0e10cSrcweir nUndoEndX = MAXCOL; 1831cdf0e10cSrcweir } 1832cdf0e10cSrcweir if (eCmd==DEL_DELCOLS) 1833cdf0e10cSrcweir { 1834cdf0e10cSrcweir nUndoStartY = 0; 1835cdf0e10cSrcweir nUndoEndY = MAXROW; 1836cdf0e10cSrcweir } 1837cdf0e10cSrcweir // Test Zellschutz 1838cdf0e10cSrcweir 1839cdf0e10cSrcweir SCCOL nEditTestEndX = nUndoEndX; 1840cdf0e10cSrcweir if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT ) 1841cdf0e10cSrcweir nEditTestEndX = MAXCOL; 1842cdf0e10cSrcweir SCROW nEditTestEndY = nUndoEndY; 1843cdf0e10cSrcweir if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP ) 1844cdf0e10cSrcweir nEditTestEndY = MAXROW; 1845cdf0e10cSrcweir ScEditableTester aTester( pDoc, nUndoStartX, nUndoStartY, nEditTestEndX, nEditTestEndY, aMark ); 1846cdf0e10cSrcweir if (!aTester.IsEditable()) 1847cdf0e10cSrcweir { 1848cdf0e10cSrcweir if (!bApi) 1849cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 1850cdf0e10cSrcweir return sal_False; 1851cdf0e10cSrcweir } 1852cdf0e10cSrcweir 1853cdf0e10cSrcweir // Test zusammengefasste 1854cdf0e10cSrcweir 1855cdf0e10cSrcweir SCCOL nMergeTestEndX = (eCmd==DEL_CELLSLEFT) ? MAXCOL : nUndoEndX; 1856cdf0e10cSrcweir SCROW nMergeTestEndY = (eCmd==DEL_CELLSUP) ? MAXROW : nUndoEndY; 1857cdf0e10cSrcweir SCCOL nExtendStartCol = nUndoStartX; 1858cdf0e10cSrcweir SCROW nExtendStartRow = nUndoStartY; 1859cdf0e10cSrcweir sal_Bool bNeedRefresh = sal_False; 1860cdf0e10cSrcweir 1861cdf0e10cSrcweir //Issue 8302 want to be able to insert into the middle of merged cells 1862cdf0e10cSrcweir //the patch comes from maoyg 1863cdf0e10cSrcweir ::std::vector<ScRange> qDecreaseRange; 1864cdf0e10cSrcweir sal_Bool bDeletingMerge = sal_False; 1865cdf0e10cSrcweir String aUndo = ScGlobal::GetRscString( STR_UNDO_DELETECELLS ); 1866cdf0e10cSrcweir if (bRecord) 1867cdf0e10cSrcweir rDocShell.GetUndoManager()->EnterListAction( aUndo, aUndo ); 1868cdf0e10cSrcweir 1869cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 1870cdf0e10cSrcweir { 1871cdf0e10cSrcweir if( aMark.GetTableSelect(i) ) 1872cdf0e10cSrcweir { 1873cdf0e10cSrcweir if ( pDoc->HasAttrib( nUndoStartX, nUndoStartY, i, nMergeTestEndX, nMergeTestEndY, i, HASATTR_MERGED | HASATTR_OVERLAPPED )) 1874cdf0e10cSrcweir { 1875cdf0e10cSrcweir SCCOL nMergeStartX = nUndoStartX; 1876cdf0e10cSrcweir SCROW nMergeStartY = nUndoStartY; 1877cdf0e10cSrcweir SCCOL nMergeEndX = nMergeTestEndX; 1878cdf0e10cSrcweir SCROW nMergeEndY = nMergeTestEndY; 1879cdf0e10cSrcweir 1880cdf0e10cSrcweir pDoc->ExtendMerge( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i ); 1881cdf0e10cSrcweir pDoc->ExtendOverlapped( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i ); 1882cdf0e10cSrcweir if( ( eCmd == DEL_CELLSUP && ( nMergeStartX != nUndoStartX || nMergeEndX != nMergeTestEndX))|| 1883cdf0e10cSrcweir ( eCmd == DEL_CELLSLEFT && ( nMergeStartY != nUndoStartY || nMergeEndY != nMergeTestEndY))) 1884cdf0e10cSrcweir { 1885cdf0e10cSrcweir if (!bApi) 1886cdf0e10cSrcweir rDocShell.ErrorMessage(STR_MSSG_DELETECELLS_0); 1887cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 1888cdf0e10cSrcweir return sal_False; 1889cdf0e10cSrcweir } 1890cdf0e10cSrcweir 1891cdf0e10cSrcweir nExtendStartCol = nMergeStartX; 1892cdf0e10cSrcweir nExtendStartRow = nMergeStartY; 1893cdf0e10cSrcweir SCCOL nTestCol = -1; 1894cdf0e10cSrcweir SCROW nTestRow1 = -1; 1895cdf0e10cSrcweir SCROW nTestRow2 = -1; 1896cdf0e10cSrcweir 1897cdf0e10cSrcweir ScDocAttrIterator aTestIter( pDoc, i, nUndoStartX, nUndoStartY, nMergeTestEndX, nMergeTestEndY ); 1898cdf0e10cSrcweir ScRange aExtendRange( nUndoStartX, nUndoStartY, i, nMergeTestEndX, nMergeTestEndY, i ); 1899cdf0e10cSrcweir const ScPatternAttr* pPattern = NULL; 1900cdf0e10cSrcweir const ScMergeAttr* pMergeFlag = NULL; 1901cdf0e10cSrcweir const ScMergeFlagAttr* pMergeFlagAttr = NULL; 1902cdf0e10cSrcweir while ( ( pPattern = aTestIter.GetNext( nTestCol, nTestRow1, nTestRow2 ) ) != NULL ) 1903cdf0e10cSrcweir { 1904cdf0e10cSrcweir pMergeFlag = (const ScMergeAttr*) &pPattern->GetItem( ATTR_MERGE ); 1905cdf0e10cSrcweir pMergeFlagAttr = (const ScMergeFlagAttr*) &pPattern->GetItem( ATTR_MERGE_FLAG ); 1906cdf0e10cSrcweir sal_Int16 nNewFlags = pMergeFlagAttr->GetValue() & ( SC_MF_HOR | SC_MF_VER ); 1907cdf0e10cSrcweir if( ( pMergeFlag && pMergeFlag->IsMerged() ) || nNewFlags == SC_MF_HOR || nNewFlags == SC_MF_VER ) 1908cdf0e10cSrcweir { 1909cdf0e10cSrcweir ScRange aRange( nTestCol, nTestRow1, i ); 1910cdf0e10cSrcweir pDoc->ExtendOverlapped( aRange ); 1911cdf0e10cSrcweir pDoc->ExtendMerge( aRange, sal_True, sal_True ); 1912cdf0e10cSrcweir 1913cdf0e10cSrcweir if( nTestRow1 < nTestRow2 && nNewFlags == SC_MF_HOR ) 1914cdf0e10cSrcweir { 1915cdf0e10cSrcweir for( SCROW nTestRow = nTestRow1; nTestRow <= nTestRow2; nTestRow++ ) 1916cdf0e10cSrcweir { 1917cdf0e10cSrcweir ScRange aTestRange( nTestCol, nTestRow, i ); 1918cdf0e10cSrcweir pDoc->ExtendOverlapped( aTestRange ); 1919cdf0e10cSrcweir pDoc->ExtendMerge( aTestRange, sal_True, sal_True); 1920cdf0e10cSrcweir ScRange aMergeRange( aTestRange.aStart.Col(),aTestRange.aStart.Row(), i ); 1921cdf0e10cSrcweir if( !aExtendRange.In( aMergeRange ) ) 1922cdf0e10cSrcweir { 1923cdf0e10cSrcweir qDecreaseRange.push_back( aTestRange ); 1924cdf0e10cSrcweir bDeletingMerge = sal_True; 1925cdf0e10cSrcweir } 1926cdf0e10cSrcweir } 1927cdf0e10cSrcweir } 1928cdf0e10cSrcweir else 1929cdf0e10cSrcweir { 1930cdf0e10cSrcweir ScRange aMergeRange( aRange.aStart.Col(),aRange.aStart.Row(), i ); 1931cdf0e10cSrcweir if( !aExtendRange.In( aMergeRange ) ) 1932cdf0e10cSrcweir { 1933cdf0e10cSrcweir qDecreaseRange.push_back( aRange ); 1934cdf0e10cSrcweir } 1935cdf0e10cSrcweir bDeletingMerge = sal_True; 1936cdf0e10cSrcweir } 1937cdf0e10cSrcweir } 1938cdf0e10cSrcweir } 1939cdf0e10cSrcweir 1940cdf0e10cSrcweir if( bDeletingMerge ) 1941cdf0e10cSrcweir { 1942cdf0e10cSrcweir 1943cdf0e10cSrcweir if( eCmd == DEL_DELROWS || eCmd == DEL_CELLSUP ) 1944cdf0e10cSrcweir { 1945cdf0e10cSrcweir nStartRow = aExtendMergeRange.aStart.Row(); 1946cdf0e10cSrcweir nEndRow = aExtendMergeRange.aEnd.Row(); 1947cdf0e10cSrcweir bNeedRefresh = sal_True; 1948cdf0e10cSrcweir 1949cdf0e10cSrcweir if( eCmd == DEL_CELLSUP ) 1950cdf0e10cSrcweir { 1951cdf0e10cSrcweir nEndCol = aExtendMergeRange.aEnd.Col(); 1952cdf0e10cSrcweir } 1953cdf0e10cSrcweir else 1954cdf0e10cSrcweir { 1955cdf0e10cSrcweir nStartCol = 0; 1956cdf0e10cSrcweir nEndCol = MAXCOL; 1957cdf0e10cSrcweir } 1958cdf0e10cSrcweir } 1959cdf0e10cSrcweir else if( eCmd == DEL_CELLSLEFT || eCmd == DEL_DELCOLS ) 1960cdf0e10cSrcweir { 1961cdf0e10cSrcweir 1962cdf0e10cSrcweir nStartCol = aExtendMergeRange.aStart.Col(); 1963cdf0e10cSrcweir nEndCol = aExtendMergeRange.aEnd.Col(); 1964cdf0e10cSrcweir if( eCmd == DEL_CELLSLEFT ) 1965cdf0e10cSrcweir { 1966cdf0e10cSrcweir nEndRow = aExtendMergeRange.aEnd.Row(); 1967cdf0e10cSrcweir bNeedRefresh = sal_True; 1968cdf0e10cSrcweir } 1969cdf0e10cSrcweir else 1970cdf0e10cSrcweir { 1971cdf0e10cSrcweir nStartRow = 0; 1972cdf0e10cSrcweir nEndRow = MAXROW; 1973cdf0e10cSrcweir } 1974cdf0e10cSrcweir } 1975cdf0e10cSrcweir 1976cdf0e10cSrcweir if( !qDecreaseRange.empty() ) 1977cdf0e10cSrcweir { 1978cdf0e10cSrcweir for( ::std::vector<ScRange>::const_iterator iIter( qDecreaseRange.begin()); iIter != qDecreaseRange.end(); iIter++ ) 1979cdf0e10cSrcweir { 1980cdf0e10cSrcweir ScRange aRange( *iIter ); 1981cdf0e10cSrcweir if( pDoc->HasAttrib( aRange, HASATTR_OVERLAPPED | HASATTR_MERGED ) ) 1982cdf0e10cSrcweir { 1983cdf0e10cSrcweir UnmergeCells( aRange, sal_True, sal_True ); 1984cdf0e10cSrcweir } 1985cdf0e10cSrcweir } 1986cdf0e10cSrcweir } 1987cdf0e10cSrcweir } 1988cdf0e10cSrcweir else 1989cdf0e10cSrcweir { 1990cdf0e10cSrcweir if (!bApi) 1991cdf0e10cSrcweir rDocShell.ErrorMessage(STR_MSSG_DELETECELLS_0); 1992cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 1993cdf0e10cSrcweir return sal_False; 1994cdf0e10cSrcweir } 1995cdf0e10cSrcweir } 1996cdf0e10cSrcweir } 1997cdf0e10cSrcweir } 1998cdf0e10cSrcweir 1999cdf0e10cSrcweir // 2000cdf0e10cSrcweir // ausfuehren 2001cdf0e10cSrcweir // 2002cdf0e10cSrcweir 2003cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); // wichtig wegen TrackFormulas bei UpdateReference 2004cdf0e10cSrcweir 2005cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 2006cdf0e10cSrcweir ScDocument* pRefUndoDoc = NULL; 2007cdf0e10cSrcweir ScRefUndoData* pUndoData = NULL; 2008cdf0e10cSrcweir if ( bRecord ) 2009cdf0e10cSrcweir { 2010cdf0e10cSrcweir // With the fix for #101329#, UpdateRef always puts cells into pRefUndoDoc at their old position, 2011cdf0e10cSrcweir // so it's no longer necessary to copy more than the deleted range into pUndoDoc. 2012cdf0e10cSrcweir 2013cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 2014cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, 0, nTabCount-1, (eCmd==DEL_DELCOLS), (eCmd==DEL_DELROWS) ); 2015cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 2016cdf0e10cSrcweir { 2017cdf0e10cSrcweir if( aMark.GetTableSelect( i ) ) 2018cdf0e10cSrcweir { 2019cdf0e10cSrcweir SCTAB nScenarioCount = 0; 2020cdf0e10cSrcweir 2021cdf0e10cSrcweir for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) 2022cdf0e10cSrcweir nScenarioCount ++; 2023cdf0e10cSrcweir 2024cdf0e10cSrcweir pDoc->CopyToDocument( nUndoStartX, nUndoStartY, i, nUndoEndX, nUndoEndY, i+nScenarioCount, 2025cdf0e10cSrcweir IDF_ALL | IDF_NOCAPTIONS, sal_False, pUndoDoc ); 2026cdf0e10cSrcweir } 2027cdf0e10cSrcweir } 2028cdf0e10cSrcweir 2029cdf0e10cSrcweir pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 2030cdf0e10cSrcweir pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, sal_False, sal_False ); 2031cdf0e10cSrcweir 2032cdf0e10cSrcweir pUndoData = new ScRefUndoData( pDoc ); 2033cdf0e10cSrcweir 2034cdf0e10cSrcweir pDoc->BeginDrawUndo(); 2035cdf0e10cSrcweir } 2036cdf0e10cSrcweir 2037cdf0e10cSrcweir sal_uInt16 nExtFlags = 0; 2038cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 2039cdf0e10cSrcweir { 2040cdf0e10cSrcweir if( aMark.GetTableSelect( i ) ) 2041cdf0e10cSrcweir rDocShell.UpdatePaintExt( nExtFlags, nStartCol, nStartRow, i, nEndCol, nEndRow, i ); 2042cdf0e10cSrcweir } 2043cdf0e10cSrcweir 2044cdf0e10cSrcweir sal_Bool bUndoOutline = sal_False; 2045cdf0e10cSrcweir switch (eCmd) 2046cdf0e10cSrcweir { 2047cdf0e10cSrcweir case DEL_CELLSUP: 2048cdf0e10cSrcweir pDoc->DeleteRow( nStartCol, 0, nEndCol, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, NULL, &aFullMark ); 2049cdf0e10cSrcweir nPaintEndY = MAXROW; 2050cdf0e10cSrcweir break; 2051cdf0e10cSrcweir case DEL_DELROWS: 2052cdf0e10cSrcweir pDoc->DeleteRow( 0, 0, MAXCOL, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &bUndoOutline, &aFullMark ); 2053cdf0e10cSrcweir nPaintStartX = 0; 2054cdf0e10cSrcweir nPaintEndX = MAXCOL; 2055cdf0e10cSrcweir nPaintEndY = MAXROW; 2056cdf0e10cSrcweir nPaintFlags |= PAINT_LEFT; 2057cdf0e10cSrcweir break; 2058cdf0e10cSrcweir case DEL_CELLSLEFT: 2059cdf0e10cSrcweir pDoc->DeleteCol( nStartRow, 0, nEndRow, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, NULL, &aFullMark ); 2060cdf0e10cSrcweir nPaintEndX = MAXCOL; 2061cdf0e10cSrcweir break; 2062cdf0e10cSrcweir case DEL_DELCOLS: 2063cdf0e10cSrcweir pDoc->DeleteCol( 0, 0, MAXROW, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &bUndoOutline, &aFullMark ); 2064cdf0e10cSrcweir nPaintStartY = 0; 2065cdf0e10cSrcweir nPaintEndY = MAXROW; 2066cdf0e10cSrcweir nPaintEndX = MAXCOL; 2067cdf0e10cSrcweir nPaintFlags |= PAINT_TOP; 2068cdf0e10cSrcweir break; 2069cdf0e10cSrcweir default: 2070cdf0e10cSrcweir DBG_ERROR("Falscher Code beim Loeschen"); 2071cdf0e10cSrcweir break; 2072cdf0e10cSrcweir } 2073cdf0e10cSrcweir 2074cdf0e10cSrcweir //! Test, ob Outline in Groesse geaendert 2075cdf0e10cSrcweir 2076cdf0e10cSrcweir if ( bRecord ) 2077cdf0e10cSrcweir { 2078cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 2079cdf0e10cSrcweir if( aFullMark.GetTableSelect( i ) ) 2080cdf0e10cSrcweir pRefUndoDoc->DeleteAreaTab(nUndoStartX,nUndoStartY,nUndoEndX,nUndoEndY, i, IDF_ALL); 2081cdf0e10cSrcweir 2082cdf0e10cSrcweir // alle Tabellen anlegen, damit Formeln kopiert werden koennen: 2083cdf0e10cSrcweir pUndoDoc->AddUndoTab( 0, nTabCount-1, sal_False, sal_False ); 2084cdf0e10cSrcweir 2085cdf0e10cSrcweir // kopieren mit bColRowFlags=sal_False (#54194#) 2086cdf0e10cSrcweir pRefUndoDoc->CopyToDocument(0,0,0,MAXCOL,MAXROW,MAXTAB,IDF_FORMULA,sal_False,pUndoDoc,NULL,sal_False); 2087cdf0e10cSrcweir delete pRefUndoDoc; 2088cdf0e10cSrcweir 2089cdf0e10cSrcweir SCTAB* pTabs = new SCTAB[nSelCount]; 2090cdf0e10cSrcweir SCTAB* pScenarios = new SCTAB[nSelCount]; 2091cdf0e10cSrcweir SCTAB nUndoPos = 0; 2092cdf0e10cSrcweir 2093cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 2094cdf0e10cSrcweir { 2095cdf0e10cSrcweir if( aMark.GetTableSelect( i ) ) 2096cdf0e10cSrcweir { 2097cdf0e10cSrcweir SCTAB nCount = 0; 2098cdf0e10cSrcweir for( SCTAB j=i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) 2099cdf0e10cSrcweir nCount ++; 2100cdf0e10cSrcweir 2101cdf0e10cSrcweir pScenarios[nUndoPos] = nCount; 2102cdf0e10cSrcweir pTabs[nUndoPos] = i; 2103cdf0e10cSrcweir nUndoPos ++; 2104cdf0e10cSrcweir } 2105cdf0e10cSrcweir } 2106cdf0e10cSrcweir 2107cdf0e10cSrcweir if( !bDeletingMerge ) 2108cdf0e10cSrcweir { 2109cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 2110cdf0e10cSrcweir } 2111cdf0e10cSrcweir 2112cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( new ScUndoDeleteCells( 2113cdf0e10cSrcweir &rDocShell, ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ),nUndoPos, pTabs, pScenarios, 2114cdf0e10cSrcweir eCmd, pUndoDoc, pUndoData ) ); 2115cdf0e10cSrcweir } 2116cdf0e10cSrcweir 2117cdf0e10cSrcweir // #i8302 want to be able to insert into the middle of merged cells 2118cdf0e10cSrcweir // the patch comes from maoyg 2119cdf0e10cSrcweir 2120cdf0e10cSrcweir while( !qDecreaseRange.empty() ) 2121cdf0e10cSrcweir { 2122cdf0e10cSrcweir ScRange aRange = qDecreaseRange.back(); 2123cdf0e10cSrcweir 2124cdf0e10cSrcweir long nDecreaseRowCount = 0; 2125cdf0e10cSrcweir long nDecreaseColCount = 0; 2126cdf0e10cSrcweir if( eCmd == DEL_CELLSUP || eCmd == DEL_DELROWS ) 2127cdf0e10cSrcweir { 2128cdf0e10cSrcweir if( nStartRow >= aRange.aStart.Row() && nStartRow <= aRange.aEnd.Row() && nEndRow>= aRange.aStart.Row() && nEndRow <= aRange.aEnd.Row() ) 2129cdf0e10cSrcweir nDecreaseRowCount = nEndRow-nStartRow+1; 2130cdf0e10cSrcweir else if( nStartRow >= aRange.aStart.Row() && nStartRow <= aRange.aEnd.Row() && nEndRow >= aRange.aStart.Row() && nEndRow >= aRange.aEnd.Row() ) 2131cdf0e10cSrcweir nDecreaseRowCount = aRange.aEnd.Row()-nStartRow+1; 2132cdf0e10cSrcweir else if( nStartRow >= aRange.aStart.Row() && nStartRow >= aRange.aEnd.Row() && nEndRow>= aRange.aStart.Row() && nEndRow <= aRange.aEnd.Row() ) 2133cdf0e10cSrcweir nDecreaseRowCount = aRange.aEnd.Row()-nEndRow+1; 2134cdf0e10cSrcweir } 2135cdf0e10cSrcweir else if( eCmd == DEL_CELLSLEFT || eCmd == DEL_DELCOLS ) 2136cdf0e10cSrcweir { 2137cdf0e10cSrcweir if( nStartCol >= aRange.aStart.Col() && nStartCol <= aRange.aEnd.Col() && nEndCol>= aRange.aStart.Col() && nEndCol <= aRange.aEnd.Col() ) 2138cdf0e10cSrcweir nDecreaseColCount = nEndCol-nStartCol+1; 2139cdf0e10cSrcweir else if( nStartCol >= aRange.aStart.Col() && nStartCol <= aRange.aEnd.Col() && nEndCol >= aRange.aStart.Col() && nEndCol >= aRange.aEnd.Col() ) 2140cdf0e10cSrcweir nDecreaseColCount = aRange.aEnd.Col()-nStartCol+1; 2141cdf0e10cSrcweir else if( nStartCol >= aRange.aStart.Col() && nStartCol >= aRange.aEnd.Col() && nEndCol>= aRange.aStart.Col() && nEndCol <= aRange.aEnd.Col() ) 2142cdf0e10cSrcweir nDecreaseColCount = aRange.aEnd.Col()-nEndCol+1; 2143cdf0e10cSrcweir } 2144cdf0e10cSrcweir 2145cdf0e10cSrcweir switch (eCmd) 2146cdf0e10cSrcweir { 2147cdf0e10cSrcweir case DEL_CELLSUP: 2148cdf0e10cSrcweir case DEL_DELROWS: 2149cdf0e10cSrcweir aRange.aEnd.SetRow(static_cast<SCsCOL>( aRange.aEnd.Row()-nDecreaseRowCount)); 2150cdf0e10cSrcweir break; 2151cdf0e10cSrcweir case DEL_CELLSLEFT: 2152cdf0e10cSrcweir case DEL_DELCOLS: 2153cdf0e10cSrcweir aRange.aEnd.SetCol(static_cast<SCsCOL>( aRange.aEnd.Col()-nDecreaseColCount)); 2154cdf0e10cSrcweir break; 2155cdf0e10cSrcweir default: 2156cdf0e10cSrcweir break; 2157cdf0e10cSrcweir } 2158cdf0e10cSrcweir 2159cdf0e10cSrcweir if( !pDoc->HasAttrib( aRange, HASATTR_OVERLAPPED | HASATTR_MERGED ) ) 2160cdf0e10cSrcweir { 2161cdf0e10cSrcweir MergeCells( aRange, sal_False, sal_True, sal_True ); 2162cdf0e10cSrcweir } 2163cdf0e10cSrcweir qDecreaseRange.pop_back(); 2164cdf0e10cSrcweir } 2165cdf0e10cSrcweir 2166cdf0e10cSrcweir if( bDeletingMerge ) 2167cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 2168cdf0e10cSrcweir 2169cdf0e10cSrcweir if ( bNeedRefresh ) 2170cdf0e10cSrcweir { 2171cdf0e10cSrcweir // #i51445# old merge flag attributes must be deleted also for single cells, 2172cdf0e10cSrcweir // not only for whole columns/rows 2173cdf0e10cSrcweir 2174cdf0e10cSrcweir if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT ) 2175cdf0e10cSrcweir nMergeTestEndX = MAXCOL; 2176cdf0e10cSrcweir if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP ) 2177cdf0e10cSrcweir nMergeTestEndY = MAXROW; 2178cdf0e10cSrcweir ScPatternAttr aPattern( pDoc->GetPool() ); 2179cdf0e10cSrcweir aPattern.GetItemSet().Put( ScMergeFlagAttr() ); 2180cdf0e10cSrcweir 2181cdf0e10cSrcweir pDoc->ApplyPatternArea( nExtendStartCol, nExtendStartRow, nMergeTestEndX, nMergeTestEndY, aMark, aPattern ); 2182cdf0e10cSrcweir 2183cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 2184cdf0e10cSrcweir { 2185cdf0e10cSrcweir if( aMark.GetTableSelect( i ) ) 2186cdf0e10cSrcweir { 2187cdf0e10cSrcweir SCTAB nScenarioCount = 0; 2188cdf0e10cSrcweir 2189cdf0e10cSrcweir for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) 2190cdf0e10cSrcweir nScenarioCount ++; 2191cdf0e10cSrcweir 2192cdf0e10cSrcweir ScRange aMergedRange( nExtendStartCol, nExtendStartRow, i, nMergeTestEndX, nMergeTestEndY, i+nScenarioCount ); 2193cdf0e10cSrcweir pDoc->ExtendMerge( aMergedRange, sal_True ); 2194cdf0e10cSrcweir } 2195cdf0e10cSrcweir } 2196cdf0e10cSrcweir } 2197cdf0e10cSrcweir 2198cdf0e10cSrcweir for( i=0; i<nTabCount; i++ ) 2199cdf0e10cSrcweir { 2200cdf0e10cSrcweir if( aMark.GetTableSelect( i ) ) 2201cdf0e10cSrcweir { 2202cdf0e10cSrcweir if ( eCmd == DEL_DELCOLS || eCmd == DEL_DELROWS ) 2203cdf0e10cSrcweir pDoc->UpdatePageBreaks( i ); 2204cdf0e10cSrcweir 2205cdf0e10cSrcweir rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i ); 2206cdf0e10cSrcweir 2207cdf0e10cSrcweir SCTAB nScenarioCount = 0; 2208cdf0e10cSrcweir 2209cdf0e10cSrcweir for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) 2210cdf0e10cSrcweir nScenarioCount ++; 2211cdf0e10cSrcweir 2212cdf0e10cSrcweir // ganze Zeilen loeschen: nichts anpassen 2213cdf0e10cSrcweir if ( eCmd == DEL_DELROWS || !AdjustRowHeight(ScRange( 0, nPaintStartY, i, MAXCOL, nPaintEndY, i+nScenarioCount )) ) 2214cdf0e10cSrcweir rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, nPaintFlags, nExtFlags ); 2215cdf0e10cSrcweir else 2216cdf0e10cSrcweir { 2217cdf0e10cSrcweir // paint only what is not done by AdjustRowHeight 2218cdf0e10cSrcweir if (nExtFlags & SC_PF_LINES) 2219cdf0e10cSrcweir lcl_PaintAbove( rDocShell, ScRange( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount) ); 2220cdf0e10cSrcweir if (nPaintFlags & PAINT_TOP) 2221cdf0e10cSrcweir rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, PAINT_TOP ); 2222cdf0e10cSrcweir } 2223cdf0e10cSrcweir } 2224cdf0e10cSrcweir } 2225cdf0e10cSrcweir aModificator.SetDocumentModified(); 2226cdf0e10cSrcweir 2227cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); 2228cdf0e10cSrcweir 2229cdf0e10cSrcweir return sal_True; 2230cdf0e10cSrcweir } 2231cdf0e10cSrcweir 2232cdf0e10cSrcweir sal_Bool ScDocFunc::MoveBlock( const ScRange& rSource, const ScAddress& rDestPos, 2233cdf0e10cSrcweir sal_Bool bCut, sal_Bool bRecord, sal_Bool bPaint, sal_Bool bApi ) 2234cdf0e10cSrcweir { 2235cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 2236cdf0e10cSrcweir 2237cdf0e10cSrcweir SCCOL nStartCol = rSource.aStart.Col(); 2238cdf0e10cSrcweir SCROW nStartRow = rSource.aStart.Row(); 2239cdf0e10cSrcweir SCTAB nStartTab = rSource.aStart.Tab(); 2240cdf0e10cSrcweir SCCOL nEndCol = rSource.aEnd.Col(); 2241cdf0e10cSrcweir SCROW nEndRow = rSource.aEnd.Row(); 2242cdf0e10cSrcweir SCTAB nEndTab = rSource.aEnd.Tab(); 2243cdf0e10cSrcweir SCCOL nDestCol = rDestPos.Col(); 2244cdf0e10cSrcweir SCROW nDestRow = rDestPos.Row(); 2245cdf0e10cSrcweir SCTAB nDestTab = rDestPos.Tab(); 2246cdf0e10cSrcweir 2247cdf0e10cSrcweir if ( !ValidRow(nStartRow) || !ValidRow(nEndRow) || !ValidRow(nDestRow) ) 2248cdf0e10cSrcweir { 2249cdf0e10cSrcweir DBG_ERROR("invalid row in MoveBlock"); 2250cdf0e10cSrcweir return sal_False; 2251cdf0e10cSrcweir } 2252cdf0e10cSrcweir 2253cdf0e10cSrcweir // zugehoerige Szenarien auch anpassen - nur wenn innerhalb einer Tabelle verschoben wird! 2254cdf0e10cSrcweir sal_Bool bScenariosAdded = sal_False; 2255cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 2256cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 2257cdf0e10cSrcweir bRecord = sal_False; 2258cdf0e10cSrcweir 2259cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 2260cdf0e10cSrcweir if ( nDestTab == nStartTab && !pDoc->IsScenario(nEndTab) ) 2261cdf0e10cSrcweir while ( nEndTab+1 < nTabCount && pDoc->IsScenario(nEndTab+1) ) 2262cdf0e10cSrcweir { 2263cdf0e10cSrcweir ++nEndTab; 2264cdf0e10cSrcweir bScenariosAdded = sal_True; 2265cdf0e10cSrcweir } 2266cdf0e10cSrcweir 2267cdf0e10cSrcweir SCTAB nSrcTabCount = nEndTab-nStartTab+1; 2268cdf0e10cSrcweir SCTAB nDestEndTab = nDestTab+nSrcTabCount-1; 2269cdf0e10cSrcweir SCTAB nTab; 2270cdf0e10cSrcweir 2271cdf0e10cSrcweir ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP ); 2272cdf0e10cSrcweir 2273cdf0e10cSrcweir ScMarkData aSourceMark; 2274cdf0e10cSrcweir for (nTab=nStartTab; nTab<=nEndTab; nTab++) 2275cdf0e10cSrcweir aSourceMark.SelectTable( nTab, sal_True ); // Source selektieren 2276cdf0e10cSrcweir aSourceMark.SetMarkArea( rSource ); 2277cdf0e10cSrcweir 2278cdf0e10cSrcweir ScDocShellRef aDragShellRef; 2279cdf0e10cSrcweir if ( pDoc->HasOLEObjectsInArea( rSource ) ) 2280cdf0e10cSrcweir { 2281cdf0e10cSrcweir aDragShellRef = new ScDocShell; // DocShell needs a Ref immediately 2282cdf0e10cSrcweir aDragShellRef->DoInitNew(NULL); 2283cdf0e10cSrcweir } 2284cdf0e10cSrcweir ScDrawLayer::SetGlobalDrawPersist(aDragShellRef); 2285cdf0e10cSrcweir 2286cdf0e10cSrcweir ScClipParam aClipParam(ScRange(nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nStartTab), bCut); 2287cdf0e10cSrcweir pDoc->CopyToClip(aClipParam, pClipDoc, &aSourceMark, false, bScenariosAdded, true); 2288cdf0e10cSrcweir 2289cdf0e10cSrcweir ScDrawLayer::SetGlobalDrawPersist(NULL); 2290cdf0e10cSrcweir 2291cdf0e10cSrcweir SCCOL nOldEndCol = nEndCol; 2292cdf0e10cSrcweir SCROW nOldEndRow = nEndRow; 2293cdf0e10cSrcweir sal_Bool bClipOver = sal_False; 2294cdf0e10cSrcweir for (nTab=nStartTab; nTab<=nEndTab; nTab++) 2295cdf0e10cSrcweir { 2296cdf0e10cSrcweir SCCOL nTmpEndCol = nOldEndCol; 2297cdf0e10cSrcweir SCROW nTmpEndRow = nOldEndRow; 2298cdf0e10cSrcweir if (pDoc->ExtendMerge( nStartCol, nStartRow, nTmpEndCol, nTmpEndRow, nTab )) 2299cdf0e10cSrcweir bClipOver = sal_True; 2300cdf0e10cSrcweir if ( nTmpEndCol > nEndCol ) nEndCol = nTmpEndCol; 2301cdf0e10cSrcweir if ( nTmpEndRow > nEndRow ) nEndRow = nTmpEndRow; 2302cdf0e10cSrcweir } 2303cdf0e10cSrcweir 2304cdf0e10cSrcweir SCCOL nDestEndCol = nDestCol + ( nOldEndCol-nStartCol ); 2305cdf0e10cSrcweir SCROW nDestEndRow = nDestRow + ( nOldEndRow-nStartRow ); 2306cdf0e10cSrcweir 2307cdf0e10cSrcweir SCCOL nUndoEndCol = nDestCol + ( nEndCol-nStartCol ); // erweitert im Zielblock 2308cdf0e10cSrcweir SCROW nUndoEndRow = nDestRow + ( nEndRow-nStartRow ); 2309cdf0e10cSrcweir 2310cdf0e10cSrcweir sal_Bool bIncludeFiltered = bCut; 2311cdf0e10cSrcweir if ( !bIncludeFiltered ) 2312cdf0e10cSrcweir { 2313cdf0e10cSrcweir // adjust sizes to include only non-filtered rows 2314cdf0e10cSrcweir 2315cdf0e10cSrcweir SCCOL nClipX; 2316cdf0e10cSrcweir SCROW nClipY; 2317cdf0e10cSrcweir pClipDoc->GetClipArea( nClipX, nClipY, sal_False ); 2318cdf0e10cSrcweir SCROW nUndoAdd = nUndoEndRow - nDestEndRow; 2319cdf0e10cSrcweir nDestEndRow = nDestRow + nClipY; 2320cdf0e10cSrcweir nUndoEndRow = nDestEndRow + nUndoAdd; 2321cdf0e10cSrcweir } 2322cdf0e10cSrcweir 2323cdf0e10cSrcweir if (!ValidCol(nUndoEndCol) || !ValidRow(nUndoEndRow)) 2324cdf0e10cSrcweir { 2325cdf0e10cSrcweir if (!bApi) 2326cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PASTE_FULL); 2327cdf0e10cSrcweir delete pClipDoc; 2328cdf0e10cSrcweir return sal_False; 2329cdf0e10cSrcweir } 2330cdf0e10cSrcweir 2331cdf0e10cSrcweir // Test auf Zellschutz 2332cdf0e10cSrcweir 2333cdf0e10cSrcweir ScEditableTester aTester; 2334cdf0e10cSrcweir for (nTab=nDestTab; nTab<=nDestEndTab; nTab++) 2335cdf0e10cSrcweir aTester.TestBlock( pDoc, nTab, nDestCol,nDestRow, nUndoEndCol,nUndoEndRow ); 2336cdf0e10cSrcweir if (bCut) 2337cdf0e10cSrcweir for (nTab=nStartTab; nTab<=nEndTab; nTab++) 2338cdf0e10cSrcweir aTester.TestBlock( pDoc, nTab, nStartCol,nStartRow, nEndCol,nEndRow ); 2339cdf0e10cSrcweir 2340cdf0e10cSrcweir if (!aTester.IsEditable()) 2341cdf0e10cSrcweir { 2342cdf0e10cSrcweir if (!bApi) 2343cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 2344cdf0e10cSrcweir delete pClipDoc; 2345cdf0e10cSrcweir return sal_False; 2346cdf0e10cSrcweir } 2347cdf0e10cSrcweir 2348cdf0e10cSrcweir // Test auf zusammengefasste - beim Verschieben erst nach dem Loeschen 2349cdf0e10cSrcweir 2350cdf0e10cSrcweir if (bClipOver && !bCut) 2351cdf0e10cSrcweir if (pDoc->HasAttrib( nDestCol,nDestRow,nDestTab, nUndoEndCol,nUndoEndRow,nDestEndTab, 2352cdf0e10cSrcweir HASATTR_MERGED | HASATTR_OVERLAPPED )) 2353cdf0e10cSrcweir { // "Zusammenfassen nicht verschachteln !" 2354cdf0e10cSrcweir if (!bApi) 2355cdf0e10cSrcweir rDocShell.ErrorMessage(STR_MSSG_MOVEBLOCKTO_0); 2356cdf0e10cSrcweir delete pClipDoc; 2357cdf0e10cSrcweir return sal_False; 2358cdf0e10cSrcweir } 2359cdf0e10cSrcweir 2360cdf0e10cSrcweir // Are there borders in the cells? (for painting) 2361cdf0e10cSrcweir 2362cdf0e10cSrcweir sal_uInt16 nSourceExt = 0; 2363cdf0e10cSrcweir rDocShell.UpdatePaintExt( nSourceExt, nStartCol,nStartRow,nStartTab, nEndCol,nEndRow,nEndTab ); 2364cdf0e10cSrcweir sal_uInt16 nDestExt = 0; 2365cdf0e10cSrcweir rDocShell.UpdatePaintExt( nDestExt, nDestCol,nDestRow,nDestTab, nDestEndCol,nDestEndRow,nDestEndTab ); 2366cdf0e10cSrcweir 2367cdf0e10cSrcweir // 2368cdf0e10cSrcweir // ausfuehren 2369cdf0e10cSrcweir // 2370cdf0e10cSrcweir 2371cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 2372cdf0e10cSrcweir ScDocument* pRefUndoDoc = NULL; 2373cdf0e10cSrcweir ScRefUndoData* pUndoData = NULL; 2374cdf0e10cSrcweir if (bRecord) 2375cdf0e10cSrcweir { 2376cdf0e10cSrcweir sal_Bool bWholeCols = ( nStartRow == 0 && nEndRow == MAXROW ); 2377cdf0e10cSrcweir sal_Bool bWholeRows = ( nStartCol == 0 && nEndCol == MAXCOL ); 2378cdf0e10cSrcweir sal_uInt16 nUndoFlags = (IDF_ALL & ~IDF_OBJECTS) | IDF_NOCAPTIONS; 2379cdf0e10cSrcweir 2380cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 2381cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab, bWholeCols, bWholeRows ); 2382cdf0e10cSrcweir 2383cdf0e10cSrcweir if (bCut) 2384cdf0e10cSrcweir { 2385cdf0e10cSrcweir pDoc->CopyToDocument( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab, 2386cdf0e10cSrcweir nUndoFlags, sal_False, pUndoDoc ); 2387cdf0e10cSrcweir pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 2388cdf0e10cSrcweir pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, sal_False, sal_False ); 2389cdf0e10cSrcweir } 2390cdf0e10cSrcweir 2391cdf0e10cSrcweir if ( nDestTab != nStartTab ) 2392cdf0e10cSrcweir pUndoDoc->AddUndoTab( nDestTab, nDestEndTab, bWholeCols, bWholeRows ); 2393cdf0e10cSrcweir pDoc->CopyToDocument( nDestCol, nDestRow, nDestTab, 2394cdf0e10cSrcweir nDestEndCol, nDestEndRow, nDestEndTab, 2395cdf0e10cSrcweir nUndoFlags, sal_False, pUndoDoc ); 2396cdf0e10cSrcweir 2397cdf0e10cSrcweir pUndoData = new ScRefUndoData( pDoc ); 2398cdf0e10cSrcweir 2399cdf0e10cSrcweir pDoc->BeginDrawUndo(); 2400cdf0e10cSrcweir } 2401cdf0e10cSrcweir 2402cdf0e10cSrcweir sal_Bool bSourceHeight = sal_False; // Hoehen angepasst? 2403cdf0e10cSrcweir if (bCut) 2404cdf0e10cSrcweir { 2405cdf0e10cSrcweir ScMarkData aDelMark; // only for tables 2406cdf0e10cSrcweir for (nTab=nStartTab; nTab<=nEndTab; nTab++) 2407cdf0e10cSrcweir { 2408cdf0e10cSrcweir pDoc->DeleteAreaTab( nStartCol,nStartRow, nOldEndCol,nOldEndRow, nTab, IDF_ALL ); 2409cdf0e10cSrcweir aDelMark.SelectTable( nTab, sal_True ); 2410cdf0e10cSrcweir } 2411cdf0e10cSrcweir pDoc->DeleteObjectsInArea( nStartCol,nStartRow, nOldEndCol,nOldEndRow, aDelMark ); 2412cdf0e10cSrcweir 2413cdf0e10cSrcweir // Test auf zusammengefasste 2414cdf0e10cSrcweir 2415cdf0e10cSrcweir if (bClipOver) 2416cdf0e10cSrcweir if (pDoc->HasAttrib( nDestCol,nDestRow,nDestTab, 2417cdf0e10cSrcweir nUndoEndCol,nUndoEndRow,nDestEndTab, 2418cdf0e10cSrcweir HASATTR_MERGED | HASATTR_OVERLAPPED )) 2419cdf0e10cSrcweir { 2420cdf0e10cSrcweir pDoc->CopyFromClip( rSource, aSourceMark, IDF_ALL, pRefUndoDoc, pClipDoc ); 2421cdf0e10cSrcweir for (nTab=nStartTab; nTab<=nEndTab; nTab++) 2422cdf0e10cSrcweir { 2423cdf0e10cSrcweir SCCOL nTmpEndCol = nEndCol; 2424cdf0e10cSrcweir SCROW nTmpEndRow = nEndRow; 2425cdf0e10cSrcweir pDoc->ExtendMerge( nStartCol, nStartRow, nTmpEndCol, nTmpEndRow, nTab, sal_True ); 2426cdf0e10cSrcweir } 2427cdf0e10cSrcweir 2428cdf0e10cSrcweir // Fehlermeldung erst nach dem Wiederherstellen des Inhalts 2429cdf0e10cSrcweir if (!bApi) // "Zusammenfassen nicht verschachteln !" 2430cdf0e10cSrcweir rDocShell.ErrorMessage(STR_MSSG_MOVEBLOCKTO_0); 2431cdf0e10cSrcweir 2432cdf0e10cSrcweir delete pUndoDoc; 2433cdf0e10cSrcweir delete pRefUndoDoc; 2434cdf0e10cSrcweir delete pUndoData; 2435cdf0e10cSrcweir delete pClipDoc; 2436cdf0e10cSrcweir return sal_False; 2437cdf0e10cSrcweir } 2438cdf0e10cSrcweir 2439cdf0e10cSrcweir bSourceHeight = AdjustRowHeight( rSource, sal_False ); 2440cdf0e10cSrcweir } 2441cdf0e10cSrcweir 2442cdf0e10cSrcweir ScRange aPasteDest( nDestCol, nDestRow, nDestTab, nDestEndCol, nDestEndRow, nDestEndTab ); 2443cdf0e10cSrcweir 2444cdf0e10cSrcweir ScMarkData aDestMark; 2445cdf0e10cSrcweir for (nTab=nDestTab; nTab<=nDestEndTab; nTab++) 2446cdf0e10cSrcweir aDestMark.SelectTable( nTab, sal_True ); // Destination selektieren 2447cdf0e10cSrcweir aDestMark.SetMarkArea( aPasteDest ); 2448cdf0e10cSrcweir 2449cdf0e10cSrcweir /* Do not copy cell notes and drawing objects here. While pasting, the 2450cdf0e10cSrcweir function ScDocument::UpdateReference() is called which calls 2451cdf0e10cSrcweir ScDrawLayer::MoveCells() which may move away inserted objects to wrong 2452cdf0e10cSrcweir positions (e.g. if source and destination range overlaps). Cell notes 2453cdf0e10cSrcweir and drawing objects are pasted below after doing all adjusting. */ 2454cdf0e10cSrcweir pDoc->CopyFromClip( aPasteDest, aDestMark, IDF_ALL & ~(IDF_NOTE | IDF_OBJECTS), 2455cdf0e10cSrcweir pRefUndoDoc, pClipDoc, sal_True, sal_False, bIncludeFiltered ); 2456cdf0e10cSrcweir 2457cdf0e10cSrcweir // skipped rows and merged cells don't mix 2458cdf0e10cSrcweir if ( !bIncludeFiltered && pClipDoc->HasClipFilteredRows() ) 2459cdf0e10cSrcweir UnmergeCells( aPasteDest, sal_False, sal_True ); 2460cdf0e10cSrcweir 2461cdf0e10cSrcweir VirtualDevice aVirtDev; 2462cdf0e10cSrcweir sal_Bool bDestHeight = AdjustRowHeight( 2463cdf0e10cSrcweir ScRange( 0,nDestRow,nDestTab, MAXCOL,nDestEndRow,nDestEndTab ), 2464cdf0e10cSrcweir sal_False ); 2465cdf0e10cSrcweir 2466cdf0e10cSrcweir /* Paste cell notes and drawing objects after adjusting formula references 2467cdf0e10cSrcweir and row heights. There are no cell notes or drawing objects, if the 2468cdf0e10cSrcweir clipdoc does not contain a drawing layer. 2469cdf0e10cSrcweir #i102056# Passing IDF_NOTE only would overwrite cell contents with 2470cdf0e10cSrcweir empty note cells, therefore the special modifier IDF_ADDNOTES is passed 2471*0ba51277Smseidel here too which changes the behavior of ScColumn::CopyFromClip() to not 2472cdf0e10cSrcweir touch existing cells. */ 2473cdf0e10cSrcweir if ( pClipDoc->GetDrawLayer() ) 2474cdf0e10cSrcweir pDoc->CopyFromClip( aPasteDest, aDestMark, IDF_NOTE | IDF_ADDNOTES | IDF_OBJECTS, 2475cdf0e10cSrcweir pRefUndoDoc, pClipDoc, sal_True, sal_False, bIncludeFiltered ); 2476cdf0e10cSrcweir 2477cdf0e10cSrcweir if (bRecord) 2478cdf0e10cSrcweir { 2479cdf0e10cSrcweir if (pRefUndoDoc) 2480cdf0e10cSrcweir { 2481cdf0e10cSrcweir // alle Tabellen anlegen, damit Formeln kopiert werden koennen: 2482cdf0e10cSrcweir pUndoDoc->AddUndoTab( 0, nTabCount-1, sal_False, sal_False ); 2483cdf0e10cSrcweir 2484cdf0e10cSrcweir pRefUndoDoc->DeleteArea( nDestCol, nDestRow, nDestEndCol, nDestEndRow, aSourceMark, IDF_ALL ); 2485cdf0e10cSrcweir // kopieren mit bColRowFlags=sal_False (#54194#) 2486cdf0e10cSrcweir pRefUndoDoc->CopyToDocument( 0, 0, 0, MAXCOL, MAXROW, MAXTAB, 2487cdf0e10cSrcweir IDF_FORMULA, sal_False, pUndoDoc, NULL, sal_False ); 2488cdf0e10cSrcweir delete pRefUndoDoc; 2489cdf0e10cSrcweir } 2490cdf0e10cSrcweir 2491cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 2492cdf0e10cSrcweir new ScUndoDragDrop( &rDocShell, ScRange( 2493cdf0e10cSrcweir nStartCol, nStartRow, nStartTab, 2494cdf0e10cSrcweir nOldEndCol, nOldEndRow, nEndTab ), 2495cdf0e10cSrcweir ScAddress( nDestCol, nDestRow, nDestTab ), 2496cdf0e10cSrcweir bCut, pUndoDoc, pUndoData, bScenariosAdded ) ); 2497cdf0e10cSrcweir } 2498cdf0e10cSrcweir 2499cdf0e10cSrcweir SCCOL nDestPaintEndCol = nDestEndCol; 2500cdf0e10cSrcweir SCROW nDestPaintEndRow = nDestEndRow; 2501cdf0e10cSrcweir for (nTab=nDestTab; nTab<=nDestEndTab; nTab++) 2502cdf0e10cSrcweir { 2503cdf0e10cSrcweir SCCOL nTmpEndCol = nDestEndCol; 2504cdf0e10cSrcweir SCROW nTmpEndRow = nDestEndRow; 2505cdf0e10cSrcweir pDoc->ExtendMerge( nDestCol, nDestRow, nTmpEndCol, nTmpEndRow, nTab, sal_True ); 2506cdf0e10cSrcweir if (nTmpEndCol > nDestPaintEndCol) nDestPaintEndCol = nTmpEndCol; 2507cdf0e10cSrcweir if (nTmpEndRow > nDestPaintEndRow) nDestPaintEndRow = nTmpEndRow; 2508cdf0e10cSrcweir } 2509cdf0e10cSrcweir 2510cdf0e10cSrcweir if (bCut) 2511cdf0e10cSrcweir for (nTab=nStartTab; nTab<=nEndTab; nTab++) 2512cdf0e10cSrcweir pDoc->RefreshAutoFilter( nStartCol, nStartRow, nEndCol, nEndRow, nTab ); 2513cdf0e10cSrcweir 2514cdf0e10cSrcweir if (bPaint) 2515cdf0e10cSrcweir { 2516cdf0e10cSrcweir // Zielbereich: 2517cdf0e10cSrcweir 2518cdf0e10cSrcweir SCCOL nPaintStartX = nDestCol; 2519cdf0e10cSrcweir SCROW nPaintStartY = nDestRow; 2520cdf0e10cSrcweir SCCOL nPaintEndX = nDestPaintEndCol; 2521cdf0e10cSrcweir SCROW nPaintEndY = nDestPaintEndRow; 2522cdf0e10cSrcweir sal_uInt16 nFlags = PAINT_GRID; 2523cdf0e10cSrcweir 2524cdf0e10cSrcweir if ( nStartRow==0 && nEndRow==MAXROW ) // Breiten mitkopiert? 2525cdf0e10cSrcweir { 2526cdf0e10cSrcweir nPaintEndX = MAXCOL; 2527cdf0e10cSrcweir nPaintStartY = 0; 2528cdf0e10cSrcweir nPaintEndY = MAXROW; 2529cdf0e10cSrcweir nFlags |= PAINT_TOP; 2530cdf0e10cSrcweir } 2531cdf0e10cSrcweir if ( bDestHeight || ( nStartCol == 0 && nEndCol == MAXCOL ) ) 2532cdf0e10cSrcweir { 2533cdf0e10cSrcweir nPaintEndY = MAXROW; 2534cdf0e10cSrcweir nPaintStartX = 0; 2535cdf0e10cSrcweir nPaintEndX = MAXCOL; 2536cdf0e10cSrcweir nFlags |= PAINT_LEFT; 2537cdf0e10cSrcweir } 2538cdf0e10cSrcweir if ( bScenariosAdded ) 2539cdf0e10cSrcweir { 2540cdf0e10cSrcweir nPaintStartX = 0; 2541cdf0e10cSrcweir nPaintStartY = 0; 2542cdf0e10cSrcweir nPaintEndX = MAXCOL; 2543cdf0e10cSrcweir nPaintEndY = MAXROW; 2544cdf0e10cSrcweir } 2545cdf0e10cSrcweir 2546cdf0e10cSrcweir rDocShell.PostPaint( nPaintStartX,nPaintStartY,nDestTab, 2547cdf0e10cSrcweir nPaintEndX,nPaintEndY,nDestEndTab, nFlags, nSourceExt | nDestExt ); 2548cdf0e10cSrcweir 2549cdf0e10cSrcweir if ( bCut ) 2550cdf0e10cSrcweir { 2551cdf0e10cSrcweir // Quellbereich: 2552cdf0e10cSrcweir 2553cdf0e10cSrcweir nPaintStartX = nStartCol; 2554cdf0e10cSrcweir nPaintStartY = nStartRow; 2555cdf0e10cSrcweir nPaintEndX = nEndCol; 2556cdf0e10cSrcweir nPaintEndY = nEndRow; 2557cdf0e10cSrcweir nFlags = PAINT_GRID; 2558cdf0e10cSrcweir 2559cdf0e10cSrcweir if ( bSourceHeight ) 2560cdf0e10cSrcweir { 2561cdf0e10cSrcweir nPaintEndY = MAXROW; 2562cdf0e10cSrcweir nPaintStartX = 0; 2563cdf0e10cSrcweir nPaintEndX = MAXCOL; 2564cdf0e10cSrcweir nFlags |= PAINT_LEFT; 2565cdf0e10cSrcweir } 2566cdf0e10cSrcweir if ( bScenariosAdded ) 2567cdf0e10cSrcweir { 2568cdf0e10cSrcweir nPaintStartX = 0; 2569cdf0e10cSrcweir nPaintStartY = 0; 2570cdf0e10cSrcweir nPaintEndX = MAXCOL; 2571cdf0e10cSrcweir nPaintEndY = MAXROW; 2572cdf0e10cSrcweir } 2573cdf0e10cSrcweir 2574cdf0e10cSrcweir rDocShell.PostPaint( nPaintStartX,nPaintStartY,nStartTab, 2575cdf0e10cSrcweir nPaintEndX,nPaintEndY,nEndTab, nFlags, nSourceExt ); 2576cdf0e10cSrcweir } 2577cdf0e10cSrcweir } 2578cdf0e10cSrcweir 2579cdf0e10cSrcweir aModificator.SetDocumentModified(); 2580cdf0e10cSrcweir 2581cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); 2582cdf0e10cSrcweir 2583cdf0e10cSrcweir delete pClipDoc; 2584cdf0e10cSrcweir return sal_True; 2585cdf0e10cSrcweir } 2586cdf0e10cSrcweir 2587cdf0e10cSrcweir //------------------------------------------------------------------------ 2588cdf0e10cSrcweir uno::Reference< uno::XInterface > GetDocModuleObject( SfxObjectShell& rDocSh, String& sCodeName ) 2589cdf0e10cSrcweir { 2590cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory> xSF(rDocSh.GetModel(), uno::UNO_QUERY); 2591cdf0e10cSrcweir uno::Reference< container::XNameAccess > xVBACodeNamedObjectAccess; 2592cdf0e10cSrcweir uno::Reference< uno::XInterface > xDocModuleApiObject; 2593cdf0e10cSrcweir if ( xSF.is() ) 2594cdf0e10cSrcweir { 2595cdf0e10cSrcweir xVBACodeNamedObjectAccess.set( xSF->createInstance( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.VBAObjectModuleObjectProvider"))), uno::UNO_QUERY ); 2596cdf0e10cSrcweir xDocModuleApiObject.set( xVBACodeNamedObjectAccess->getByName( sCodeName ), uno::UNO_QUERY ); 2597cdf0e10cSrcweir } 2598cdf0e10cSrcweir return xDocModuleApiObject; 2599cdf0e10cSrcweir 2600cdf0e10cSrcweir } 2601cdf0e10cSrcweir 2602cdf0e10cSrcweir script::ModuleInfo lcl_InitModuleInfo( SfxObjectShell& rDocSh, String& sModule ) 2603cdf0e10cSrcweir { 2604cdf0e10cSrcweir script::ModuleInfo sModuleInfo; 2605cdf0e10cSrcweir sModuleInfo.ModuleType = script::ModuleType::DOCUMENT; 2606cdf0e10cSrcweir sModuleInfo.ModuleObject = GetDocModuleObject( rDocSh, sModule ); 2607cdf0e10cSrcweir return sModuleInfo; 2608cdf0e10cSrcweir } 2609cdf0e10cSrcweir 2610cdf0e10cSrcweir void VBA_InsertModule( ScDocument& rDoc, SCTAB nTab, String& sModuleName, String& sSource ) 2611cdf0e10cSrcweir { 2612cdf0e10cSrcweir SfxObjectShell& rDocSh = *rDoc.GetDocumentShell(); 2613cdf0e10cSrcweir uno::Reference< script::XLibraryContainer > xLibContainer = rDocSh.GetBasicContainer(); 2614cdf0e10cSrcweir DBG_ASSERT( xLibContainer.is(), "No BasicContainer!" ); 2615cdf0e10cSrcweir 2616cdf0e10cSrcweir uno::Reference< container::XNameContainer > xLib; 2617cdf0e10cSrcweir if( xLibContainer.is() ) 2618cdf0e10cSrcweir { 2619cdf0e10cSrcweir String aLibName( RTL_CONSTASCII_USTRINGPARAM( "Standard" ) ); 2620cdf0e10cSrcweir if ( rDocSh.GetBasicManager() && rDocSh.GetBasicManager()->GetName().Len() ) 2621cdf0e10cSrcweir aLibName = rDocSh.GetBasicManager()->GetName(); 2622cdf0e10cSrcweir uno::Any aLibAny = xLibContainer->getByName( aLibName ); 2623cdf0e10cSrcweir aLibAny >>= xLib; 2624cdf0e10cSrcweir } 2625cdf0e10cSrcweir if( xLib.is() ) 2626cdf0e10cSrcweir { 2627cdf0e10cSrcweir // if the Module with codename exists then find a new name 2628cdf0e10cSrcweir sal_Int32 nNum = 0; 2629cdf0e10cSrcweir String genModuleName; 2630cdf0e10cSrcweir if ( sModuleName.Len() ) 2631cdf0e10cSrcweir sModuleName = sModuleName; 2632cdf0e10cSrcweir else 2633cdf0e10cSrcweir { 2634cdf0e10cSrcweir genModuleName = String::CreateFromAscii( "Sheet1" ); 2635cdf0e10cSrcweir nNum = 1; 2636cdf0e10cSrcweir } 2637cdf0e10cSrcweir while( xLib->hasByName( genModuleName ) ) 2638cdf0e10cSrcweir genModuleName = rtl::OUString::createFromAscii( "Sheet" ) + rtl::OUString::valueOf( ++nNum ); 2639cdf0e10cSrcweir 2640cdf0e10cSrcweir uno::Any aSourceAny; 2641cdf0e10cSrcweir rtl::OUString sTmpSource = sSource; 2642cdf0e10cSrcweir if ( sTmpSource.getLength() == 0 ) 2643cdf0e10cSrcweir sTmpSource = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Rem Attribute VBA_ModuleType=VBADocumentModule\nOption VBASupport 1\n" )); 2644cdf0e10cSrcweir aSourceAny <<= sTmpSource; 2645cdf0e10cSrcweir uno::Reference< script::vba::XVBAModuleInfo > xVBAModuleInfo( xLib, uno::UNO_QUERY ); 2646cdf0e10cSrcweir if ( xVBAModuleInfo.is() ) 2647cdf0e10cSrcweir { 2648cdf0e10cSrcweir rDoc.SetCodeName( nTab, genModuleName ); 2649cdf0e10cSrcweir script::ModuleInfo sModuleInfo = lcl_InitModuleInfo( rDocSh, genModuleName ); 2650cdf0e10cSrcweir xVBAModuleInfo->insertModuleInfo( genModuleName, sModuleInfo ); 2651cdf0e10cSrcweir xLib->insertByName( genModuleName, aSourceAny ); 2652cdf0e10cSrcweir } 2653cdf0e10cSrcweir 2654cdf0e10cSrcweir } 2655cdf0e10cSrcweir } 2656cdf0e10cSrcweir 2657cdf0e10cSrcweir void VBA_DeleteModule( ScDocShell& rDocSh, String& sModuleName ) 2658cdf0e10cSrcweir { 2659cdf0e10cSrcweir uno::Reference< script::XLibraryContainer > xLibContainer = rDocSh.GetBasicContainer(); 2660cdf0e10cSrcweir DBG_ASSERT( xLibContainer.is(), "No BasicContainer!" ); 2661cdf0e10cSrcweir 2662cdf0e10cSrcweir uno::Reference< container::XNameContainer > xLib; 2663cdf0e10cSrcweir if( xLibContainer.is() ) 2664cdf0e10cSrcweir { 2665cdf0e10cSrcweir String aLibName( RTL_CONSTASCII_USTRINGPARAM( "Standard" ) ); 2666cdf0e10cSrcweir if ( rDocSh.GetBasicManager() && rDocSh.GetBasicManager()->GetName().Len() ) 2667cdf0e10cSrcweir aLibName = rDocSh.GetBasicManager()->GetName(); 2668cdf0e10cSrcweir uno::Any aLibAny = xLibContainer->getByName( aLibName ); 2669cdf0e10cSrcweir aLibAny >>= xLib; 2670cdf0e10cSrcweir } 2671cdf0e10cSrcweir if( xLib.is() ) 2672cdf0e10cSrcweir { 2673cdf0e10cSrcweir uno::Reference< script::vba::XVBAModuleInfo > xVBAModuleInfo( xLib, uno::UNO_QUERY ); 2674cdf0e10cSrcweir if( xLib->hasByName( sModuleName ) ) 2675cdf0e10cSrcweir xLib->removeByName( sModuleName ); 2676cdf0e10cSrcweir if ( xVBAModuleInfo.is() ) 2677cdf0e10cSrcweir xVBAModuleInfo->removeModuleInfo( sModuleName ); 2678cdf0e10cSrcweir 2679cdf0e10cSrcweir } 2680cdf0e10cSrcweir } 2681cdf0e10cSrcweir 2682cdf0e10cSrcweir 2683cdf0e10cSrcweir sal_Bool ScDocFunc::InsertTable( SCTAB nTab, const String& rName, sal_Bool bRecord, sal_Bool bApi ) 2684cdf0e10cSrcweir { 2685cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 2686cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); 2687cdf0e10cSrcweir 2688cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 2689cdf0e10cSrcweir 2690cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 2691cdf0e10cSrcweir 2692cdf0e10cSrcweir 2693cdf0e10cSrcweir // Strange loop, also basic is loaded too early ( InsertTable ) 2694cdf0e10cSrcweir // is called via the xml import for sheets in described in odf 2695cdf0e10cSrcweir sal_Bool bInsertDocModule = false; 2696cdf0e10cSrcweir 2697cdf0e10cSrcweir if( !rDocShell.GetDocument()->IsImportingXML() ) 2698cdf0e10cSrcweir { 2699cdf0e10cSrcweir bInsertDocModule = pDoc ? pDoc->IsInVBAMode() : false; 2700cdf0e10cSrcweir } 2701cdf0e10cSrcweir if ( bInsertDocModule || ( bRecord && !pDoc->IsUndoEnabled() ) ) 2702cdf0e10cSrcweir bRecord = sal_False; 2703cdf0e10cSrcweir 2704cdf0e10cSrcweir if (bRecord) 2705cdf0e10cSrcweir pDoc->BeginDrawUndo(); // InsertTab erzeugt ein SdrUndoNewPage 2706cdf0e10cSrcweir 2707cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 2708cdf0e10cSrcweir sal_Bool bAppend = ( nTab >= nTabCount ); 2709cdf0e10cSrcweir if ( bAppend ) 2710cdf0e10cSrcweir nTab = nTabCount; // wichtig fuer Undo 2711cdf0e10cSrcweir 2712cdf0e10cSrcweir if (pDoc->InsertTab( nTab, rName )) 2713cdf0e10cSrcweir { 2714cdf0e10cSrcweir String sCodeName; 2715cdf0e10cSrcweir if (bRecord) 2716cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 2717cdf0e10cSrcweir new ScUndoInsertTab( &rDocShell, nTab, bAppend, rName)); 2718cdf0e10cSrcweir // Views updaten: 2719cdf0e10cSrcweir // Only insert vba modules if vba mode ( and not currently importing XML ) 2720cdf0e10cSrcweir if( bInsertDocModule ) 2721cdf0e10cSrcweir { 2722cdf0e10cSrcweir String sSource; 2723cdf0e10cSrcweir VBA_InsertModule( *pDoc, nTab, sCodeName, sSource ); 2724cdf0e10cSrcweir } 2725cdf0e10cSrcweir rDocShell.Broadcast( ScTablesHint( SC_TAB_INSERTED, nTab ) ); 2726cdf0e10cSrcweir 2727cdf0e10cSrcweir rDocShell.PostPaintExtras(); 2728cdf0e10cSrcweir aModificator.SetDocumentModified(); 2729cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); 2730cdf0e10cSrcweir bSuccess = sal_True; 2731cdf0e10cSrcweir } 2732cdf0e10cSrcweir else if (!bApi) 2733cdf0e10cSrcweir rDocShell.ErrorMessage(STR_TABINSERT_ERROR); 2734cdf0e10cSrcweir 2735cdf0e10cSrcweir return bSuccess; 2736cdf0e10cSrcweir } 2737cdf0e10cSrcweir 2738cdf0e10cSrcweir sal_Bool ScDocFunc::DeleteTable( SCTAB nTab, sal_Bool bRecord, sal_Bool /* bApi */ ) 2739cdf0e10cSrcweir { 2740cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); 2741cdf0e10cSrcweir 2742cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 2743cdf0e10cSrcweir 2744cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 2745cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 2746cdf0e10cSrcweir sal_Bool bVbaEnabled = pDoc ? pDoc->IsInVBAMode() : false; 2747cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 2748cdf0e10cSrcweir bRecord = sal_False; 2749cdf0e10cSrcweir if ( bVbaEnabled ) 2750cdf0e10cSrcweir bRecord = sal_False; 2751cdf0e10cSrcweir sal_Bool bWasLinked = pDoc->IsLinked(nTab); 2752cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 2753cdf0e10cSrcweir ScRefUndoData* pUndoData = NULL; 2754cdf0e10cSrcweir if (bRecord) 2755cdf0e10cSrcweir { 2756cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 2757cdf0e10cSrcweir SCTAB nCount = pDoc->GetTableCount(); 2758cdf0e10cSrcweir 2759cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True ); // nur nTab mit Flags 2760cdf0e10cSrcweir pUndoDoc->AddUndoTab( 0, nCount-1 ); // alle Tabs fuer Referenzen 2761cdf0e10cSrcweir 2762cdf0e10cSrcweir pDoc->CopyToDocument(0,0,nTab, MAXCOL,MAXROW,nTab, IDF_ALL,sal_False, pUndoDoc ); 2763cdf0e10cSrcweir String aOldName; 2764cdf0e10cSrcweir pDoc->GetName( nTab, aOldName ); 2765cdf0e10cSrcweir pUndoDoc->RenameTab( nTab, aOldName, sal_False ); 2766cdf0e10cSrcweir if (bWasLinked) 2767cdf0e10cSrcweir pUndoDoc->SetLink( nTab, pDoc->GetLinkMode(nTab), pDoc->GetLinkDoc(nTab), 2768cdf0e10cSrcweir pDoc->GetLinkFlt(nTab), pDoc->GetLinkOpt(nTab), 2769cdf0e10cSrcweir pDoc->GetLinkTab(nTab), 2770cdf0e10cSrcweir pDoc->GetLinkRefreshDelay(nTab) ); 2771cdf0e10cSrcweir 2772cdf0e10cSrcweir if ( pDoc->IsScenario(nTab) ) 2773cdf0e10cSrcweir { 2774cdf0e10cSrcweir pUndoDoc->SetScenario( nTab, sal_True ); 2775cdf0e10cSrcweir String aComment; 2776cdf0e10cSrcweir Color aColor; 2777cdf0e10cSrcweir sal_uInt16 nScenFlags; 2778cdf0e10cSrcweir pDoc->GetScenarioData( nTab, aComment, aColor, nScenFlags ); 2779cdf0e10cSrcweir pUndoDoc->SetScenarioData( nTab, aComment, aColor, nScenFlags ); 2780cdf0e10cSrcweir sal_Bool bActive = pDoc->IsActiveScenario( nTab ); 2781cdf0e10cSrcweir pUndoDoc->SetActiveScenario( nTab, bActive ); 2782cdf0e10cSrcweir } 2783cdf0e10cSrcweir pUndoDoc->SetVisible( nTab, pDoc->IsVisible( nTab ) ); 2784cdf0e10cSrcweir pUndoDoc->SetTabBgColor( nTab, pDoc->GetTabBgColor(nTab) ); 2785cdf0e10cSrcweir pUndoDoc->SetSheetEvents( nTab, pDoc->GetSheetEvents( nTab ) ); 2786cdf0e10cSrcweir 2787cdf0e10cSrcweir // Drawing-Layer muss sein Undo selbst in der Hand behalten !!! 2788cdf0e10cSrcweir pDoc->BeginDrawUndo(); // DeleteTab erzeugt ein SdrUndoDelPage 2789cdf0e10cSrcweir 2790cdf0e10cSrcweir pUndoData = new ScRefUndoData( pDoc ); 2791cdf0e10cSrcweir } 2792cdf0e10cSrcweir 2793cdf0e10cSrcweir String sCodeName; 2794cdf0e10cSrcweir sal_Bool bHasCodeName = pDoc->GetCodeName( nTab, sCodeName ); 2795cdf0e10cSrcweir if (pDoc->DeleteTab( nTab, pUndoDoc )) 2796cdf0e10cSrcweir { 2797cdf0e10cSrcweir if (bRecord) 2798cdf0e10cSrcweir { 2799cdf0e10cSrcweir SvShorts theTabs; 2800cdf0e10cSrcweir theTabs.push_back(nTab); 2801cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 2802cdf0e10cSrcweir new ScUndoDeleteTab( &rDocShell, theTabs, pUndoDoc, pUndoData )); 2803cdf0e10cSrcweir } 2804cdf0e10cSrcweir // Views updaten: 2805cdf0e10cSrcweir if( bVbaEnabled ) 2806cdf0e10cSrcweir { 2807cdf0e10cSrcweir if( bHasCodeName ) 2808cdf0e10cSrcweir { 2809cdf0e10cSrcweir VBA_DeleteModule( rDocShell, sCodeName ); 2810cdf0e10cSrcweir } 2811cdf0e10cSrcweir } 2812cdf0e10cSrcweir rDocShell.Broadcast( ScTablesHint( SC_TAB_DELETED, nTab ) ); 2813cdf0e10cSrcweir 2814cdf0e10cSrcweir if (bWasLinked) 2815cdf0e10cSrcweir { 2816cdf0e10cSrcweir rDocShell.UpdateLinks(); // Link-Manager updaten 2817cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 2818cdf0e10cSrcweir if (pBindings) 2819cdf0e10cSrcweir pBindings->Invalidate(SID_LINKS); 2820cdf0e10cSrcweir } 2821cdf0e10cSrcweir 2822cdf0e10cSrcweir rDocShell.PostPaintExtras(); 2823cdf0e10cSrcweir aModificator.SetDocumentModified(); 2824cdf0e10cSrcweir 2825cdf0e10cSrcweir SfxApplication* pSfxApp = SFX_APP(); // Navigator 2826cdf0e10cSrcweir pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); 2827cdf0e10cSrcweir pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) ); 2828cdf0e10cSrcweir pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); 2829cdf0e10cSrcweir 2830cdf0e10cSrcweir bSuccess = sal_True; 2831cdf0e10cSrcweir } 2832cdf0e10cSrcweir else 2833cdf0e10cSrcweir { 2834cdf0e10cSrcweir delete pUndoDoc; 2835cdf0e10cSrcweir delete pUndoData; 2836cdf0e10cSrcweir } 2837cdf0e10cSrcweir return bSuccess; 2838cdf0e10cSrcweir } 2839cdf0e10cSrcweir 2840cdf0e10cSrcweir sal_Bool ScDocFunc::SetTableVisible( SCTAB nTab, sal_Bool bVisible, sal_Bool bApi ) 2841cdf0e10cSrcweir { 2842cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 2843cdf0e10cSrcweir sal_Bool bUndo(pDoc->IsUndoEnabled()); 2844cdf0e10cSrcweir if ( pDoc->IsVisible( nTab ) == bVisible ) 2845cdf0e10cSrcweir return sal_True; // nichts zu tun - ok 2846cdf0e10cSrcweir 2847cdf0e10cSrcweir if ( !pDoc->IsDocEditable() ) 2848cdf0e10cSrcweir { 2849cdf0e10cSrcweir if (!bApi) 2850cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PROTECTIONERR); 2851cdf0e10cSrcweir return sal_False; 2852cdf0e10cSrcweir } 2853cdf0e10cSrcweir 2854cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 2855cdf0e10cSrcweir 2856cdf0e10cSrcweir if ( !bVisible && !pDoc->IsImportingXML() ) // #i57869# allow hiding in any order for loading 2857cdf0e10cSrcweir { 2858cdf0e10cSrcweir // nicht alle Tabellen ausblenden 2859cdf0e10cSrcweir 2860cdf0e10cSrcweir sal_uInt16 nVisCount = 0; 2861cdf0e10cSrcweir SCTAB nCount = pDoc->GetTableCount(); 2862cdf0e10cSrcweir for (SCTAB i=0; i<nCount; i++) 2863cdf0e10cSrcweir if (pDoc->IsVisible(i)) 2864cdf0e10cSrcweir ++nVisCount; 2865cdf0e10cSrcweir 2866cdf0e10cSrcweir if (nVisCount <= 1) 2867cdf0e10cSrcweir { 2868cdf0e10cSrcweir if (!bApi) 2869cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PROTECTIONERR); //! eigene Meldung? 2870cdf0e10cSrcweir return sal_False; 2871cdf0e10cSrcweir } 2872cdf0e10cSrcweir } 2873cdf0e10cSrcweir 2874cdf0e10cSrcweir pDoc->SetVisible( nTab, bVisible ); 2875cdf0e10cSrcweir if (bUndo) 2876cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( &rDocShell, nTab, bVisible ) ); 2877cdf0e10cSrcweir 2878cdf0e10cSrcweir // Views updaten: 2879cdf0e10cSrcweir if (!bVisible) 2880cdf0e10cSrcweir rDocShell.Broadcast( ScTablesHint( SC_TAB_HIDDEN, nTab ) ); 2881cdf0e10cSrcweir 2882cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); 2883cdf0e10cSrcweir rDocShell.PostPaint(0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_EXTRAS); 2884cdf0e10cSrcweir aModificator.SetDocumentModified(); 2885cdf0e10cSrcweir 2886cdf0e10cSrcweir return sal_True; 2887cdf0e10cSrcweir } 2888cdf0e10cSrcweir 2889cdf0e10cSrcweir sal_Bool ScDocFunc::SetLayoutRTL( SCTAB nTab, sal_Bool bRTL, sal_Bool /* bApi */ ) 2890cdf0e10cSrcweir { 2891cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 2892cdf0e10cSrcweir sal_Bool bUndo(pDoc->IsUndoEnabled()); 2893cdf0e10cSrcweir if ( pDoc->IsLayoutRTL( nTab ) == bRTL ) 2894cdf0e10cSrcweir return sal_True; // nothing to do - ok 2895cdf0e10cSrcweir 2896cdf0e10cSrcweir //! protection (sheet or document?) 2897cdf0e10cSrcweir 2898cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 2899cdf0e10cSrcweir 2900cdf0e10cSrcweir pDoc->SetLayoutRTL( nTab, bRTL ); 2901cdf0e10cSrcweir 2902cdf0e10cSrcweir if (bUndo) 2903cdf0e10cSrcweir { 2904cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( new ScUndoLayoutRTL( &rDocShell, nTab, bRTL ) ); 2905cdf0e10cSrcweir } 2906cdf0e10cSrcweir 2907cdf0e10cSrcweir rDocShell.PostPaint( 0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_ALL ); 2908cdf0e10cSrcweir aModificator.SetDocumentModified(); 2909cdf0e10cSrcweir 2910cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 2911cdf0e10cSrcweir if (pBindings) 2912cdf0e10cSrcweir { 2913cdf0e10cSrcweir pBindings->Invalidate( FID_TAB_RTL ); 2914cdf0e10cSrcweir pBindings->Invalidate( SID_ATTR_SIZE ); 2915cdf0e10cSrcweir } 2916cdf0e10cSrcweir 2917cdf0e10cSrcweir return sal_True; 2918cdf0e10cSrcweir } 2919cdf0e10cSrcweir 2920cdf0e10cSrcweir //UNUSED2009-05 sal_Bool ScDocFunc::SetGrammar( formula::FormulaGrammar::Grammar eGrammar ) 2921cdf0e10cSrcweir //UNUSED2009-05 { 2922cdf0e10cSrcweir //UNUSED2009-05 ScDocument* pDoc = rDocShell.GetDocument(); 2923cdf0e10cSrcweir //UNUSED2009-05 2924cdf0e10cSrcweir //UNUSED2009-05 if ( pDoc->GetGrammar() == eGrammar ) 2925cdf0e10cSrcweir //UNUSED2009-05 return sal_True; 2926cdf0e10cSrcweir //UNUSED2009-05 2927cdf0e10cSrcweir //UNUSED2009-05 sal_Bool bUndo(pDoc->IsUndoEnabled()); 2928cdf0e10cSrcweir //UNUSED2009-05 ScDocShellModificator aModificator( rDocShell ); 2929cdf0e10cSrcweir //UNUSED2009-05 2930cdf0e10cSrcweir //UNUSED2009-05 pDoc->SetGrammar( eGrammar ); 2931cdf0e10cSrcweir //UNUSED2009-05 2932cdf0e10cSrcweir //UNUSED2009-05 if (bUndo) 2933cdf0e10cSrcweir //UNUSED2009-05 { 2934cdf0e10cSrcweir //UNUSED2009-05 rDocShell.GetUndoManager()->AddUndoAction( new ScUndoSetGrammar( &rDocShell, eGrammar ) ); 2935cdf0e10cSrcweir //UNUSED2009-05 } 2936cdf0e10cSrcweir //UNUSED2009-05 2937cdf0e10cSrcweir //UNUSED2009-05 rDocShell.PostPaint( 0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_ALL ); 2938cdf0e10cSrcweir //UNUSED2009-05 2939cdf0e10cSrcweir //UNUSED2009-05 ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell(); 2940cdf0e10cSrcweir //UNUSED2009-05 if (NULL != pViewSh) 2941cdf0e10cSrcweir //UNUSED2009-05 { 2942cdf0e10cSrcweir //UNUSED2009-05 pViewSh->UpdateInputHandler( sal_False, sal_False ); 2943cdf0e10cSrcweir //UNUSED2009-05 } 2944cdf0e10cSrcweir //UNUSED2009-05 2945cdf0e10cSrcweir //UNUSED2009-05 aModificator.SetDocumentModified(); 2946cdf0e10cSrcweir //UNUSED2009-05 2947cdf0e10cSrcweir //UNUSED2009-05 SfxBindings* pBindings = rDocShell.GetViewBindings(); 2948cdf0e10cSrcweir //UNUSED2009-05 if (pBindings) 2949cdf0e10cSrcweir //UNUSED2009-05 { 2950cdf0e10cSrcweir //UNUSED2009-05 // erAck: 2006-09-07T22:19+0200 commented out in CWS scr1c1 2951cdf0e10cSrcweir //UNUSED2009-05 //pBindings->Invalidate( FID_TAB_USE_R1C1 ); 2952cdf0e10cSrcweir //UNUSED2009-05 } 2953cdf0e10cSrcweir //UNUSED2009-05 2954cdf0e10cSrcweir //UNUSED2009-05 return sal_True; 2955cdf0e10cSrcweir //UNUSED2009-05 } 2956cdf0e10cSrcweir 2957cdf0e10cSrcweir sal_Bool ScDocFunc::RenameTable( SCTAB nTab, const String& rName, sal_Bool bRecord, sal_Bool bApi ) 2958cdf0e10cSrcweir { 2959cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 2960cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 2961cdf0e10cSrcweir bRecord = sal_False; 2962cdf0e10cSrcweir if ( !pDoc->IsDocEditable() ) 2963cdf0e10cSrcweir { 2964cdf0e10cSrcweir if (!bApi) 2965cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PROTECTIONERR); 2966cdf0e10cSrcweir return sal_False; 2967cdf0e10cSrcweir } 2968cdf0e10cSrcweir 2969cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 2970cdf0e10cSrcweir 2971cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 2972cdf0e10cSrcweir String sOldName; 2973cdf0e10cSrcweir pDoc->GetName(nTab, sOldName); 2974cdf0e10cSrcweir if (pDoc->RenameTab( nTab, rName )) 2975cdf0e10cSrcweir { 2976cdf0e10cSrcweir if (bRecord) 2977cdf0e10cSrcweir { 2978cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 2979cdf0e10cSrcweir new ScUndoRenameTab( &rDocShell, nTab, sOldName, rName)); 2980cdf0e10cSrcweir } 2981cdf0e10cSrcweir rDocShell.PostPaintExtras(); 2982cdf0e10cSrcweir aModificator.SetDocumentModified(); 2983cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); 2984cdf0e10cSrcweir 2985cdf0e10cSrcweir bSuccess = sal_True; 2986cdf0e10cSrcweir } 2987cdf0e10cSrcweir return bSuccess; 2988cdf0e10cSrcweir } 2989cdf0e10cSrcweir 2990cdf0e10cSrcweir bool ScDocFunc::SetTabBgColor( SCTAB nTab, const Color& rColor, bool bRecord, bool bApi ) 2991cdf0e10cSrcweir { 2992cdf0e10cSrcweir 2993cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 2994cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 2995cdf0e10cSrcweir bRecord = false; 2996cdf0e10cSrcweir if ( !pDoc->IsDocEditable() || pDoc->IsTabProtected(nTab) ) 2997cdf0e10cSrcweir { 2998cdf0e10cSrcweir if (!bApi) 2999cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PROTECTIONERR); //TODO Check to see what this string is... 3000cdf0e10cSrcweir return false; 3001cdf0e10cSrcweir } 3002cdf0e10cSrcweir 3003cdf0e10cSrcweir Color aOldTabBgColor; 3004cdf0e10cSrcweir aOldTabBgColor = pDoc->GetTabBgColor(nTab); 3005cdf0e10cSrcweir 3006cdf0e10cSrcweir bool bSuccess = false; 3007cdf0e10cSrcweir pDoc->SetTabBgColor(nTab, rColor); 3008cdf0e10cSrcweir if ( pDoc->GetTabBgColor(nTab) == rColor) 3009cdf0e10cSrcweir bSuccess = true; 3010cdf0e10cSrcweir if (bSuccess) 3011cdf0e10cSrcweir { 3012cdf0e10cSrcweir if (bRecord) 3013cdf0e10cSrcweir { 3014cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3015cdf0e10cSrcweir new ScUndoTabColor( &rDocShell, nTab, aOldTabBgColor, rColor)); 3016cdf0e10cSrcweir } 3017cdf0e10cSrcweir rDocShell.PostPaintExtras(); 3018cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3019cdf0e10cSrcweir aModificator.SetDocumentModified(); 3020cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); 3021cdf0e10cSrcweir 3022cdf0e10cSrcweir bSuccess = true; 3023cdf0e10cSrcweir } 3024cdf0e10cSrcweir return bSuccess; 3025cdf0e10cSrcweir } 3026cdf0e10cSrcweir 3027cdf0e10cSrcweir bool ScDocFunc::SetTabBgColor( 3028cdf0e10cSrcweir ScUndoTabColorInfo::List& rUndoTabColorList, bool bRecord, bool bApi ) 3029cdf0e10cSrcweir { 3030cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3031cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 3032cdf0e10cSrcweir bRecord = false; 3033cdf0e10cSrcweir 3034cdf0e10cSrcweir if ( !pDoc->IsDocEditable() ) 3035cdf0e10cSrcweir { 3036cdf0e10cSrcweir if (!bApi) 3037cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PROTECTIONERR); //TODO Get a better String Error... 3038cdf0e10cSrcweir return false; 3039cdf0e10cSrcweir } 3040cdf0e10cSrcweir 3041cdf0e10cSrcweir sal_uInt16 nTab; 3042cdf0e10cSrcweir Color aNewTabBgColor; 3043cdf0e10cSrcweir bool bSuccess = true; 3044cdf0e10cSrcweir size_t nTabProtectCount = 0; 3045cdf0e10cSrcweir size_t nTabListCount = rUndoTabColorList.size(); 3046cdf0e10cSrcweir for ( size_t i = 0; i < nTabListCount; ++i ) 3047cdf0e10cSrcweir { 3048cdf0e10cSrcweir ScUndoTabColorInfo& rInfo = rUndoTabColorList[i]; 3049cdf0e10cSrcweir nTab = rInfo.mnTabId; 3050cdf0e10cSrcweir if ( !pDoc->IsTabProtected(nTab) ) 3051cdf0e10cSrcweir { 3052cdf0e10cSrcweir aNewTabBgColor = rInfo.maNewTabBgColor; 3053cdf0e10cSrcweir rInfo.maOldTabBgColor = pDoc->GetTabBgColor(nTab); 3054cdf0e10cSrcweir pDoc->SetTabBgColor(nTab, aNewTabBgColor); 3055cdf0e10cSrcweir if ( pDoc->GetTabBgColor(nTab) != aNewTabBgColor) 3056cdf0e10cSrcweir { 3057cdf0e10cSrcweir bSuccess = false; 3058cdf0e10cSrcweir break; 3059cdf0e10cSrcweir } 3060cdf0e10cSrcweir } 3061cdf0e10cSrcweir else 3062cdf0e10cSrcweir { 3063cdf0e10cSrcweir nTabProtectCount++; 3064cdf0e10cSrcweir } 3065cdf0e10cSrcweir } 3066cdf0e10cSrcweir 3067cdf0e10cSrcweir if ( nTabProtectCount == nTabListCount ) 3068cdf0e10cSrcweir { 3069cdf0e10cSrcweir if (!bApi) 3070cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PROTECTIONERR); //TODO Get a better String Error... 3071cdf0e10cSrcweir return false; 3072cdf0e10cSrcweir } 3073cdf0e10cSrcweir 3074cdf0e10cSrcweir if (bSuccess) 3075cdf0e10cSrcweir { 3076cdf0e10cSrcweir if (bRecord) 3077cdf0e10cSrcweir { 3078cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3079cdf0e10cSrcweir new ScUndoTabColor( &rDocShell, rUndoTabColorList)); 3080cdf0e10cSrcweir } 3081cdf0e10cSrcweir rDocShell.PostPaintExtras(); 3082cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3083cdf0e10cSrcweir aModificator.SetDocumentModified(); 3084cdf0e10cSrcweir } 3085cdf0e10cSrcweir return bSuccess; 3086cdf0e10cSrcweir } 3087cdf0e10cSrcweir 3088cdf0e10cSrcweir //------------------------------------------------------------------------ 3089cdf0e10cSrcweir 3090cdf0e10cSrcweir //! SetWidthOrHeight - noch doppelt zu ViewFunc !!!!!! 3091cdf0e10cSrcweir //! Probleme: 3092cdf0e10cSrcweir //! - Optimale Hoehe fuer Edit-Zellen ist unterschiedlich zwischen Drucker und Bildschirm 3093cdf0e10cSrcweir //! - Optimale Breite braucht Selektion, um evtl. nur selektierte Zellen zu beruecksichtigen 3094cdf0e10cSrcweir 3095cdf0e10cSrcweir sal_uInt16 lcl_GetOptimalColWidth( ScDocShell& rDocShell, SCCOL nCol, SCTAB nTab, sal_Bool bFormula ) 3096cdf0e10cSrcweir { 3097cdf0e10cSrcweir sal_uInt16 nTwips = 0; 3098cdf0e10cSrcweir 3099cdf0e10cSrcweir ScSizeDeviceProvider aProv(&rDocShell); 3100cdf0e10cSrcweir OutputDevice* pDev = aProv.GetDevice(); // has pixel MapMode 3101cdf0e10cSrcweir double nPPTX = aProv.GetPPTX(); 3102cdf0e10cSrcweir double nPPTY = aProv.GetPPTY(); 3103cdf0e10cSrcweir 3104cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3105cdf0e10cSrcweir Fraction aOne(1,1); 3106cdf0e10cSrcweir nTwips = pDoc->GetOptimalColWidth( nCol, nTab, pDev, nPPTX, nPPTY, aOne, aOne, 3107cdf0e10cSrcweir bFormula, NULL ); 3108cdf0e10cSrcweir 3109cdf0e10cSrcweir return nTwips; 3110cdf0e10cSrcweir } 3111cdf0e10cSrcweir 3112cdf0e10cSrcweir sal_Bool ScDocFunc::SetWidthOrHeight( sal_Bool bWidth, SCCOLROW nRangeCnt, SCCOLROW* pRanges, SCTAB nTab, 3113cdf0e10cSrcweir ScSizeMode eMode, sal_uInt16 nSizeTwips, 3114cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bApi ) 3115cdf0e10cSrcweir { 3116cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3117cdf0e10cSrcweir 3118cdf0e10cSrcweir if (!nRangeCnt) 3119cdf0e10cSrcweir return sal_True; 3120cdf0e10cSrcweir 3121cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3122cdf0e10cSrcweir if ( bRecord && !pDoc->IsUndoEnabled() ) 3123cdf0e10cSrcweir bRecord = sal_False; 3124cdf0e10cSrcweir 3125cdf0e10cSrcweir // import into read-only document is possible 3126cdf0e10cSrcweir if ( !pDoc->IsChangeReadOnlyEnabled() && !rDocShell.IsEditable() ) 3127cdf0e10cSrcweir { 3128cdf0e10cSrcweir if (!bApi) 3129cdf0e10cSrcweir rDocShell.ErrorMessage(STR_PROTECTIONERR); //! eigene Meldung? 3130cdf0e10cSrcweir return sal_False; 3131cdf0e10cSrcweir } 3132cdf0e10cSrcweir 3133cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 3134cdf0e10cSrcweir SCCOLROW nStart = pRanges[0]; 3135cdf0e10cSrcweir SCCOLROW nEnd = pRanges[2*nRangeCnt-1]; 3136cdf0e10cSrcweir 3137cdf0e10cSrcweir sal_Bool bFormula = sal_False; 3138cdf0e10cSrcweir if ( eMode == SC_SIZE_OPTIMAL ) 3139cdf0e10cSrcweir { 3140cdf0e10cSrcweir //! Option "Formeln anzeigen" - woher nehmen? 3141cdf0e10cSrcweir } 3142cdf0e10cSrcweir 3143cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 3144cdf0e10cSrcweir ScOutlineTable* pUndoTab = NULL; 3145cdf0e10cSrcweir SCCOLROW* pUndoRanges = NULL; 3146cdf0e10cSrcweir 3147cdf0e10cSrcweir if ( bRecord ) 3148cdf0e10cSrcweir { 3149cdf0e10cSrcweir pDoc->BeginDrawUndo(); // Drawing Updates 3150cdf0e10cSrcweir 3151cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 3152cdf0e10cSrcweir if (bWidth) 3153cdf0e10cSrcweir { 3154cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_False ); 3155cdf0e10cSrcweir pDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab, static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, sal_False, pUndoDoc ); 3156cdf0e10cSrcweir } 3157cdf0e10cSrcweir else 3158cdf0e10cSrcweir { 3159cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_False, sal_True ); 3160cdf0e10cSrcweir pDoc->CopyToDocument( 0, static_cast<SCROW>(nStart), nTab, MAXCOL, static_cast<SCROW>(nEnd), nTab, IDF_NONE, sal_False, pUndoDoc ); 3161cdf0e10cSrcweir } 3162cdf0e10cSrcweir 3163cdf0e10cSrcweir pUndoRanges = new SCCOLROW[ 2*nRangeCnt ]; 3164cdf0e10cSrcweir memmove( pUndoRanges, pRanges, 2*nRangeCnt*sizeof(SCCOLROW) ); 3165cdf0e10cSrcweir 3166cdf0e10cSrcweir ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab ); 3167cdf0e10cSrcweir if (pTable) 3168cdf0e10cSrcweir pUndoTab = new ScOutlineTable( *pTable ); 3169cdf0e10cSrcweir } 3170cdf0e10cSrcweir 3171cdf0e10cSrcweir sal_Bool bShow = nSizeTwips > 0 || eMode != SC_SIZE_DIRECT; 3172cdf0e10cSrcweir sal_Bool bOutline = sal_False; 3173cdf0e10cSrcweir 3174cdf0e10cSrcweir pDoc->IncSizeRecalcLevel( nTab ); // nicht fuer jede Spalte einzeln 3175cdf0e10cSrcweir for (SCCOLROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++) 3176cdf0e10cSrcweir { 3177cdf0e10cSrcweir SCCOLROW nStartNo = *(pRanges++); 3178cdf0e10cSrcweir SCCOLROW nEndNo = *(pRanges++); 3179cdf0e10cSrcweir 3180cdf0e10cSrcweir if ( !bWidth ) // Hoehen immer blockweise 3181cdf0e10cSrcweir { 3182cdf0e10cSrcweir if ( eMode==SC_SIZE_OPTIMAL || eMode==SC_SIZE_VISOPT ) 3183cdf0e10cSrcweir { 3184cdf0e10cSrcweir sal_Bool bAll = ( eMode==SC_SIZE_OPTIMAL ); 3185cdf0e10cSrcweir if (!bAll) 3186cdf0e10cSrcweir { 3187cdf0e10cSrcweir // fuer alle eingeblendeten CR_MANUALSIZE loeschen, 3188cdf0e10cSrcweir // dann SetOptimalHeight mit bShrink = FALSE 3189cdf0e10cSrcweir for (SCROW nRow=nStartNo; nRow<=nEndNo; nRow++) 3190cdf0e10cSrcweir { 3191cdf0e10cSrcweir sal_uInt8 nOld = pDoc->GetRowFlags(nRow,nTab); 3192cdf0e10cSrcweir SCROW nLastRow = -1; 3193cdf0e10cSrcweir bool bHidden = pDoc->RowHidden(nRow, nTab, nLastRow); 3194cdf0e10cSrcweir if ( !bHidden && ( nOld & CR_MANUALSIZE ) ) 3195cdf0e10cSrcweir pDoc->SetRowFlags( nRow, nTab, nOld & ~CR_MANUALSIZE ); 3196cdf0e10cSrcweir } 3197cdf0e10cSrcweir } 3198cdf0e10cSrcweir 3199cdf0e10cSrcweir ScSizeDeviceProvider aProv( &rDocShell ); 3200cdf0e10cSrcweir Fraction aOne(1,1); 3201cdf0e10cSrcweir pDoc->SetOptimalHeight( nStartNo, nEndNo, nTab, 0, aProv.GetDevice(), 3202cdf0e10cSrcweir aProv.GetPPTX(), aProv.GetPPTY(), aOne, aOne, bAll ); 3203cdf0e10cSrcweir 3204cdf0e10cSrcweir if (bAll) 3205cdf0e10cSrcweir pDoc->ShowRows( nStartNo, nEndNo, nTab, sal_True ); 3206cdf0e10cSrcweir 3207cdf0e10cSrcweir // Manual-Flag wird bei bAll=sal_True schon in SetOptimalHeight gesetzt 3208cdf0e10cSrcweir // (an bei Extra-Height, sonst aus). 3209cdf0e10cSrcweir } 3210cdf0e10cSrcweir else if ( eMode==SC_SIZE_DIRECT || eMode==SC_SIZE_ORIGINAL ) 3211cdf0e10cSrcweir { 3212cdf0e10cSrcweir if (nSizeTwips) 3213cdf0e10cSrcweir { 3214cdf0e10cSrcweir pDoc->SetRowHeightRange( nStartNo, nEndNo, nTab, nSizeTwips ); 3215cdf0e10cSrcweir pDoc->SetManualHeight( nStartNo, nEndNo, nTab, sal_True ); // height was set manually 3216cdf0e10cSrcweir } 3217cdf0e10cSrcweir if ( eMode != SC_SIZE_ORIGINAL ) 3218cdf0e10cSrcweir pDoc->ShowRows( nStartNo, nEndNo, nTab, nSizeTwips != 0 ); 3219cdf0e10cSrcweir } 3220cdf0e10cSrcweir else if ( eMode==SC_SIZE_SHOW ) 3221cdf0e10cSrcweir { 3222cdf0e10cSrcweir pDoc->ShowRows( nStartNo, nEndNo, nTab, sal_True ); 3223cdf0e10cSrcweir } 3224cdf0e10cSrcweir } 3225cdf0e10cSrcweir else // Spaltenbreiten 3226cdf0e10cSrcweir { 3227cdf0e10cSrcweir for (SCCOL nCol=static_cast<SCCOL>(nStartNo); nCol<=static_cast<SCCOL>(nEndNo); nCol++) 3228cdf0e10cSrcweir { 3229cdf0e10cSrcweir SCCOL nLastCol = -1; 3230cdf0e10cSrcweir if ( eMode != SC_SIZE_VISOPT || !pDoc->ColHidden(nCol, nTab, nLastCol) ) 3231cdf0e10cSrcweir { 3232cdf0e10cSrcweir sal_uInt16 nThisSize = nSizeTwips; 3233cdf0e10cSrcweir 3234cdf0e10cSrcweir if ( eMode==SC_SIZE_OPTIMAL || eMode==SC_SIZE_VISOPT ) 3235cdf0e10cSrcweir nThisSize = nSizeTwips + 3236cdf0e10cSrcweir lcl_GetOptimalColWidth( rDocShell, nCol, nTab, bFormula ); 3237cdf0e10cSrcweir if ( nThisSize ) 3238cdf0e10cSrcweir pDoc->SetColWidth( nCol, nTab, nThisSize ); 3239cdf0e10cSrcweir 3240cdf0e10cSrcweir if ( eMode != SC_SIZE_ORIGINAL ) 3241cdf0e10cSrcweir pDoc->ShowCol( nCol, nTab, bShow ); 3242cdf0e10cSrcweir } 3243cdf0e10cSrcweir } 3244cdf0e10cSrcweir } 3245cdf0e10cSrcweir 3246cdf0e10cSrcweir // adjust outlines 3247cdf0e10cSrcweir 3248cdf0e10cSrcweir if ( eMode != SC_SIZE_ORIGINAL ) 3249cdf0e10cSrcweir { 3250cdf0e10cSrcweir if (bWidth) 3251cdf0e10cSrcweir bOutline = bOutline || pDoc->UpdateOutlineCol( 3252cdf0e10cSrcweir static_cast<SCCOL>(nStartNo), 3253cdf0e10cSrcweir static_cast<SCCOL>(nEndNo), nTab, bShow ); 3254cdf0e10cSrcweir else 3255cdf0e10cSrcweir bOutline = bOutline || pDoc->UpdateOutlineRow( 3256cdf0e10cSrcweir static_cast<SCROW>(nStartNo), 3257cdf0e10cSrcweir static_cast<SCROW>(nEndNo), nTab, bShow ); 3258cdf0e10cSrcweir } 3259cdf0e10cSrcweir } 3260cdf0e10cSrcweir pDoc->DecSizeRecalcLevel( nTab ); // nicht fuer jede Spalte einzeln 3261cdf0e10cSrcweir 3262cdf0e10cSrcweir if (!bOutline) 3263cdf0e10cSrcweir DELETEZ(pUndoTab); 3264cdf0e10cSrcweir 3265cdf0e10cSrcweir if (bRecord) 3266cdf0e10cSrcweir { 3267cdf0e10cSrcweir ScMarkData aMark; 3268cdf0e10cSrcweir aMark.SelectOneTable( nTab ); 3269cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3270cdf0e10cSrcweir new ScUndoWidthOrHeight( &rDocShell, aMark, 3271cdf0e10cSrcweir nStart, nTab, nEnd, nTab, 3272cdf0e10cSrcweir pUndoDoc, nRangeCnt, pUndoRanges, 3273cdf0e10cSrcweir pUndoTab, eMode, nSizeTwips, bWidth ) ); 3274cdf0e10cSrcweir } 3275cdf0e10cSrcweir 3276cdf0e10cSrcweir pDoc->UpdatePageBreaks( nTab ); 3277cdf0e10cSrcweir 3278cdf0e10cSrcweir rDocShell.PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_ALL); 3279cdf0e10cSrcweir aModificator.SetDocumentModified(); 3280cdf0e10cSrcweir 3281cdf0e10cSrcweir return bSuccess; 3282cdf0e10cSrcweir } 3283cdf0e10cSrcweir 3284cdf0e10cSrcweir 3285cdf0e10cSrcweir sal_Bool ScDocFunc::InsertPageBreak( sal_Bool bColumn, const ScAddress& rPos, 3286cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bSetModified, sal_Bool /* bApi */ ) 3287cdf0e10cSrcweir { 3288cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3289cdf0e10cSrcweir 3290cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3291cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 3292cdf0e10cSrcweir bRecord = sal_False; 3293cdf0e10cSrcweir SCTAB nTab = rPos.Tab(); 3294cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 3295cdf0e10cSrcweir 3296cdf0e10cSrcweir SCCOLROW nPos = bColumn ? static_cast<SCCOLROW>(rPos.Col()) : 3297cdf0e10cSrcweir static_cast<SCCOLROW>(rPos.Row()); 3298cdf0e10cSrcweir if (nPos == 0) 3299cdf0e10cSrcweir return sal_False; // erste Spalte / Zeile 3300cdf0e10cSrcweir 3301cdf0e10cSrcweir ScBreakType nBreak = bColumn ? 3302cdf0e10cSrcweir pDoc->HasColBreak(static_cast<SCCOL>(nPos), nTab) : 3303cdf0e10cSrcweir pDoc->HasRowBreak(static_cast<SCROW>(nPos), nTab); 3304cdf0e10cSrcweir if (nBreak & BREAK_MANUAL) 3305cdf0e10cSrcweir return true; 3306cdf0e10cSrcweir 3307cdf0e10cSrcweir if (bRecord) 3308cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3309cdf0e10cSrcweir new ScUndoPageBreak( &rDocShell, rPos.Col(), rPos.Row(), nTab, bColumn, sal_True ) ); 3310cdf0e10cSrcweir 3311cdf0e10cSrcweir if (bColumn) 3312cdf0e10cSrcweir pDoc->SetColBreak(static_cast<SCCOL>(nPos), nTab, false, true); 3313cdf0e10cSrcweir else 3314cdf0e10cSrcweir pDoc->SetRowBreak(static_cast<SCROW>(nPos), nTab, false, true); 3315cdf0e10cSrcweir 3316cdf0e10cSrcweir pDoc->InvalidatePageBreaks(nTab); 3317cdf0e10cSrcweir pDoc->UpdatePageBreaks( nTab ); 3318cdf0e10cSrcweir 3319cdf0e10cSrcweir if (pDoc->IsStreamValid(nTab)) 3320cdf0e10cSrcweir pDoc->SetStreamValid(nTab, sal_False); 3321cdf0e10cSrcweir 3322cdf0e10cSrcweir if (bColumn) 3323cdf0e10cSrcweir { 3324cdf0e10cSrcweir rDocShell.PostPaint( static_cast<SCCOL>(nPos)-1, 0, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID ); 3325cdf0e10cSrcweir if (pBindings) 3326cdf0e10cSrcweir { 3327cdf0e10cSrcweir pBindings->Invalidate( FID_INS_COLBRK ); 3328cdf0e10cSrcweir pBindings->Invalidate( FID_DEL_COLBRK ); 3329cdf0e10cSrcweir } 3330cdf0e10cSrcweir } 3331cdf0e10cSrcweir else 3332cdf0e10cSrcweir { 3333cdf0e10cSrcweir rDocShell.PostPaint( 0, static_cast<SCROW>(nPos)-1, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID ); 3334cdf0e10cSrcweir if (pBindings) 3335cdf0e10cSrcweir { 3336cdf0e10cSrcweir pBindings->Invalidate( FID_INS_ROWBRK ); 3337cdf0e10cSrcweir pBindings->Invalidate( FID_DEL_ROWBRK ); 3338cdf0e10cSrcweir } 3339cdf0e10cSrcweir } 3340cdf0e10cSrcweir if (pBindings) 3341cdf0e10cSrcweir pBindings->Invalidate( FID_DEL_MANUALBREAKS ); 3342cdf0e10cSrcweir 3343cdf0e10cSrcweir if (bSetModified) 3344cdf0e10cSrcweir aModificator.SetDocumentModified(); 3345cdf0e10cSrcweir 3346cdf0e10cSrcweir return sal_True; 3347cdf0e10cSrcweir } 3348cdf0e10cSrcweir 3349cdf0e10cSrcweir sal_Bool ScDocFunc::RemovePageBreak( sal_Bool bColumn, const ScAddress& rPos, 3350cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bSetModified, sal_Bool /* bApi */ ) 3351cdf0e10cSrcweir { 3352cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3353cdf0e10cSrcweir 3354cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3355cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 3356cdf0e10cSrcweir bRecord = sal_False; 3357cdf0e10cSrcweir SCTAB nTab = rPos.Tab(); 3358cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 3359cdf0e10cSrcweir 3360cdf0e10cSrcweir SCCOLROW nPos = bColumn ? static_cast<SCCOLROW>(rPos.Col()) : 3361cdf0e10cSrcweir static_cast<SCCOLROW>(rPos.Row()); 3362cdf0e10cSrcweir 3363cdf0e10cSrcweir ScBreakType nBreak; 3364cdf0e10cSrcweir if (bColumn) 3365cdf0e10cSrcweir nBreak = pDoc->HasColBreak(static_cast<SCCOL>(nPos), nTab); 3366cdf0e10cSrcweir else 3367cdf0e10cSrcweir nBreak = pDoc->HasRowBreak(static_cast<SCROW>(nPos), nTab); 3368cdf0e10cSrcweir if ((nBreak & BREAK_MANUAL) == 0) 3369cdf0e10cSrcweir // There is no manual break. 3370cdf0e10cSrcweir return false; 3371cdf0e10cSrcweir 3372cdf0e10cSrcweir if (bRecord) 3373cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3374cdf0e10cSrcweir new ScUndoPageBreak( &rDocShell, rPos.Col(), rPos.Row(), nTab, bColumn, sal_False ) ); 3375cdf0e10cSrcweir 3376cdf0e10cSrcweir if (bColumn) 3377cdf0e10cSrcweir pDoc->RemoveColBreak(static_cast<SCCOL>(nPos), nTab, false, true); 3378cdf0e10cSrcweir else 3379cdf0e10cSrcweir pDoc->RemoveRowBreak(static_cast<SCROW>(nPos), nTab, false, true); 3380cdf0e10cSrcweir 3381cdf0e10cSrcweir pDoc->UpdatePageBreaks( nTab ); 3382cdf0e10cSrcweir 3383cdf0e10cSrcweir if (pDoc->IsStreamValid(nTab)) 3384cdf0e10cSrcweir pDoc->SetStreamValid(nTab, sal_False); 3385cdf0e10cSrcweir 3386cdf0e10cSrcweir if (bColumn) 3387cdf0e10cSrcweir { 3388cdf0e10cSrcweir rDocShell.PostPaint( static_cast<SCCOL>(nPos)-1, 0, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID ); 3389cdf0e10cSrcweir if (pBindings) 3390cdf0e10cSrcweir { 3391cdf0e10cSrcweir pBindings->Invalidate( FID_INS_COLBRK ); 3392cdf0e10cSrcweir pBindings->Invalidate( FID_DEL_COLBRK ); 3393cdf0e10cSrcweir } 3394cdf0e10cSrcweir } 3395cdf0e10cSrcweir else 3396cdf0e10cSrcweir { 3397cdf0e10cSrcweir rDocShell.PostPaint( 0, nPos-1, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID ); 3398cdf0e10cSrcweir if (pBindings) 3399cdf0e10cSrcweir { 3400cdf0e10cSrcweir pBindings->Invalidate( FID_INS_ROWBRK ); 3401cdf0e10cSrcweir pBindings->Invalidate( FID_DEL_ROWBRK ); 3402cdf0e10cSrcweir } 3403cdf0e10cSrcweir } 3404cdf0e10cSrcweir if (pBindings) 3405cdf0e10cSrcweir pBindings->Invalidate( FID_DEL_MANUALBREAKS ); 3406cdf0e10cSrcweir 3407cdf0e10cSrcweir if (bSetModified) 3408cdf0e10cSrcweir aModificator.SetDocumentModified(); 3409cdf0e10cSrcweir 3410cdf0e10cSrcweir return sal_True; 3411cdf0e10cSrcweir } 3412cdf0e10cSrcweir 3413cdf0e10cSrcweir //------------------------------------------------------------------------ 3414cdf0e10cSrcweir 3415cdf0e10cSrcweir void ScDocFunc::ProtectSheet( SCTAB nTab, const ScTableProtection& rProtect ) 3416cdf0e10cSrcweir { 3417cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3418cdf0e10cSrcweir 3419cdf0e10cSrcweir pDoc->SetTabProtection(nTab, &rProtect); 3420cdf0e10cSrcweir if (pDoc->IsUndoEnabled()) 3421cdf0e10cSrcweir { 3422cdf0e10cSrcweir ScTableProtection* pProtect = pDoc->GetTabProtection(nTab); 3423cdf0e10cSrcweir DBG_ASSERT(pProtect, "ScDocFunc::Unprotect: ScTableProtection pointer is NULL!"); 3424cdf0e10cSrcweir if (pProtect) 3425cdf0e10cSrcweir { 3426cdf0e10cSrcweir ::std::auto_ptr<ScTableProtection> p(new ScTableProtection(*pProtect)); 3427cdf0e10cSrcweir p->setProtected(true); // just in case ... 3428cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3429cdf0e10cSrcweir new ScUndoTabProtect(&rDocShell, nTab, p) ); 3430cdf0e10cSrcweir 3431cdf0e10cSrcweir // ownership of auto_ptr now transferred to ScUndoTabProtect. 3432cdf0e10cSrcweir } 3433cdf0e10cSrcweir } 3434cdf0e10cSrcweir 3435cdf0e10cSrcweir rDocShell.PostPaintGridAll(); 3436cdf0e10cSrcweir ScDocShellModificator aModificator(rDocShell); 3437cdf0e10cSrcweir aModificator.SetDocumentModified(); 3438cdf0e10cSrcweir } 3439cdf0e10cSrcweir 3440cdf0e10cSrcweir sal_Bool ScDocFunc::Protect( SCTAB nTab, const String& rPassword, sal_Bool /*bApi*/ ) 3441cdf0e10cSrcweir { 3442cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3443cdf0e10cSrcweir if (nTab == TABLEID_DOC) 3444cdf0e10cSrcweir { 3445cdf0e10cSrcweir // document protection 3446cdf0e10cSrcweir ScDocProtection aProtection; 3447cdf0e10cSrcweir aProtection.setProtected(true); 3448cdf0e10cSrcweir aProtection.setPassword(rPassword); 3449cdf0e10cSrcweir pDoc->SetDocProtection(&aProtection); 3450cdf0e10cSrcweir if (pDoc->IsUndoEnabled()) 3451cdf0e10cSrcweir { 3452cdf0e10cSrcweir ScDocProtection* pProtect = pDoc->GetDocProtection(); 3453cdf0e10cSrcweir DBG_ASSERT(pProtect, "ScDocFunc::Unprotect: ScDocProtection pointer is NULL!"); 3454cdf0e10cSrcweir if (pProtect) 3455cdf0e10cSrcweir { 3456cdf0e10cSrcweir ::std::auto_ptr<ScDocProtection> p(new ScDocProtection(*pProtect)); 3457cdf0e10cSrcweir p->setProtected(true); // just in case ... 3458cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3459cdf0e10cSrcweir new ScUndoDocProtect(&rDocShell, p) ); 3460cdf0e10cSrcweir // ownership of auto_ptr is transferred to ScUndoDocProtect. 3461cdf0e10cSrcweir } 3462cdf0e10cSrcweir } 3463cdf0e10cSrcweir } 3464cdf0e10cSrcweir else 3465cdf0e10cSrcweir { 3466cdf0e10cSrcweir // sheet protection 3467cdf0e10cSrcweir 3468cdf0e10cSrcweir ScTableProtection aProtection; 3469cdf0e10cSrcweir aProtection.setProtected(true); 3470cdf0e10cSrcweir aProtection.setPassword(rPassword); 3471cdf0e10cSrcweir pDoc->SetTabProtection(nTab, &aProtection); 3472cdf0e10cSrcweir if (pDoc->IsUndoEnabled()) 3473cdf0e10cSrcweir { 3474cdf0e10cSrcweir ScTableProtection* pProtect = pDoc->GetTabProtection(nTab); 3475cdf0e10cSrcweir DBG_ASSERT(pProtect, "ScDocFunc::Unprotect: ScTableProtection pointer is NULL!"); 3476cdf0e10cSrcweir if (pProtect) 3477cdf0e10cSrcweir { 3478cdf0e10cSrcweir ::std::auto_ptr<ScTableProtection> p(new ScTableProtection(*pProtect)); 3479cdf0e10cSrcweir p->setProtected(true); // just in case ... 3480cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3481cdf0e10cSrcweir new ScUndoTabProtect(&rDocShell, nTab, p) ); 3482cdf0e10cSrcweir // ownership of auto_ptr now transferred to ScUndoTabProtect. 3483cdf0e10cSrcweir } 3484cdf0e10cSrcweir } 3485cdf0e10cSrcweir } 3486cdf0e10cSrcweir 3487cdf0e10cSrcweir rDocShell.PostPaintGridAll(); 3488cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3489cdf0e10cSrcweir aModificator.SetDocumentModified(); 3490cdf0e10cSrcweir 3491cdf0e10cSrcweir return true; 3492cdf0e10cSrcweir } 3493cdf0e10cSrcweir 3494cdf0e10cSrcweir sal_Bool ScDocFunc::Unprotect( SCTAB nTab, const String& rPassword, sal_Bool bApi ) 3495cdf0e10cSrcweir { 3496cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3497cdf0e10cSrcweir 3498cdf0e10cSrcweir if (nTab == TABLEID_DOC) 3499cdf0e10cSrcweir { 3500cdf0e10cSrcweir // document protection 3501cdf0e10cSrcweir 3502cdf0e10cSrcweir ScDocProtection* pDocProtect = pDoc->GetDocProtection(); 3503cdf0e10cSrcweir if (!pDocProtect || !pDocProtect->isProtected()) 3504cdf0e10cSrcweir // already unprotected (should not happen)! 3505cdf0e10cSrcweir return true; 3506cdf0e10cSrcweir 3507cdf0e10cSrcweir // save the protection state before unprotect (for undo). 3508cdf0e10cSrcweir ::std::auto_ptr<ScDocProtection> pProtectCopy(new ScDocProtection(*pDocProtect)); 3509cdf0e10cSrcweir 3510cdf0e10cSrcweir if (!pDocProtect->verifyPassword(rPassword)) 3511cdf0e10cSrcweir { 3512cdf0e10cSrcweir if (!bApi) 3513cdf0e10cSrcweir { 3514cdf0e10cSrcweir InfoBox aBox( rDocShell.GetActiveDialogParent(), String( ScResId( SCSTR_WRONGPASSWORD ) ) ); 3515cdf0e10cSrcweir aBox.Execute(); 3516cdf0e10cSrcweir } 3517cdf0e10cSrcweir return false; 3518cdf0e10cSrcweir } 3519cdf0e10cSrcweir 3520cdf0e10cSrcweir pDoc->SetDocProtection(NULL); 3521cdf0e10cSrcweir if (pDoc->IsUndoEnabled()) 3522cdf0e10cSrcweir { 3523cdf0e10cSrcweir pProtectCopy->setProtected(false); 3524cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3525cdf0e10cSrcweir new ScUndoDocProtect(&rDocShell, pProtectCopy) ); 3526cdf0e10cSrcweir // ownership of auto_ptr now transferred to ScUndoDocProtect. 3527cdf0e10cSrcweir } 3528cdf0e10cSrcweir } 3529cdf0e10cSrcweir else 3530cdf0e10cSrcweir { 3531cdf0e10cSrcweir // sheet protection 3532cdf0e10cSrcweir 3533cdf0e10cSrcweir ScTableProtection* pTabProtect = pDoc->GetTabProtection(nTab); 3534cdf0e10cSrcweir if (!pTabProtect || !pTabProtect->isProtected()) 3535cdf0e10cSrcweir // already unprotected (should not happen)! 3536cdf0e10cSrcweir return true; 3537cdf0e10cSrcweir 3538cdf0e10cSrcweir // save the protection state before unprotect (for undo). 3539cdf0e10cSrcweir ::std::auto_ptr<ScTableProtection> pProtectCopy(new ScTableProtection(*pTabProtect)); 3540cdf0e10cSrcweir if (!pTabProtect->verifyPassword(rPassword)) 3541cdf0e10cSrcweir { 3542cdf0e10cSrcweir if (!bApi) 3543cdf0e10cSrcweir { 3544cdf0e10cSrcweir InfoBox aBox( rDocShell.GetActiveDialogParent(), String( ScResId( SCSTR_WRONGPASSWORD ) ) ); 3545cdf0e10cSrcweir aBox.Execute(); 3546cdf0e10cSrcweir } 3547cdf0e10cSrcweir return false; 3548cdf0e10cSrcweir } 3549cdf0e10cSrcweir 3550cdf0e10cSrcweir pDoc->SetTabProtection(nTab, NULL); 3551cdf0e10cSrcweir if (pDoc->IsUndoEnabled()) 3552cdf0e10cSrcweir { 3553cdf0e10cSrcweir pProtectCopy->setProtected(false); 3554cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3555cdf0e10cSrcweir new ScUndoTabProtect(&rDocShell, nTab, pProtectCopy) ); 3556cdf0e10cSrcweir // ownership of auto_ptr now transferred to ScUndoTabProtect. 3557cdf0e10cSrcweir } 3558cdf0e10cSrcweir } 3559cdf0e10cSrcweir 3560cdf0e10cSrcweir rDocShell.PostPaintGridAll(); 3561cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3562cdf0e10cSrcweir aModificator.SetDocumentModified(); 3563cdf0e10cSrcweir 3564cdf0e10cSrcweir return true; 3565cdf0e10cSrcweir } 3566cdf0e10cSrcweir 3567cdf0e10cSrcweir //------------------------------------------------------------------------ 3568cdf0e10cSrcweir 3569cdf0e10cSrcweir sal_Bool ScDocFunc::ClearItems( const ScMarkData& rMark, const sal_uInt16* pWhich, sal_Bool bApi ) 3570cdf0e10cSrcweir { 3571cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3572cdf0e10cSrcweir 3573cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3574cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 3575cdf0e10cSrcweir ScEditableTester aTester( pDoc, rMark ); 3576cdf0e10cSrcweir if (!aTester.IsEditable()) 3577cdf0e10cSrcweir { 3578cdf0e10cSrcweir if (!bApi) 3579cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 3580cdf0e10cSrcweir return sal_False; 3581cdf0e10cSrcweir } 3582cdf0e10cSrcweir 3583cdf0e10cSrcweir // #i12940# ClearItems is called (from setPropertyToDefault) directly with uno object's cached 3584cdf0e10cSrcweir // MarkData (GetMarkData), so rMark must be changed to multi selection for ClearSelectionItems 3585cdf0e10cSrcweir // here. 3586cdf0e10cSrcweir 3587cdf0e10cSrcweir ScRange aMarkRange; 3588cdf0e10cSrcweir ScMarkData aMultiMark = rMark; 3589cdf0e10cSrcweir aMultiMark.SetMarking(sal_False); // for MarkToMulti 3590cdf0e10cSrcweir aMultiMark.MarkToMulti(); 3591cdf0e10cSrcweir aMultiMark.GetMultiMarkArea( aMarkRange ); 3592cdf0e10cSrcweir 3593cdf0e10cSrcweir // if (bRecord) 3594cdf0e10cSrcweir if (bUndo) 3595cdf0e10cSrcweir { 3596cdf0e10cSrcweir SCTAB nStartTab = aMarkRange.aStart.Tab(); 3597cdf0e10cSrcweir SCTAB nEndTab = aMarkRange.aEnd.Tab(); 3598cdf0e10cSrcweir 3599cdf0e10cSrcweir ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 3600cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab ); 3601cdf0e10cSrcweir pDoc->CopyToDocument( aMarkRange, IDF_ATTRIB, sal_True, pUndoDoc, (ScMarkData*)&aMultiMark ); 3602cdf0e10cSrcweir 3603cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3604cdf0e10cSrcweir new ScUndoClearItems( &rDocShell, aMultiMark, pUndoDoc, pWhich ) ); 3605cdf0e10cSrcweir } 3606cdf0e10cSrcweir 3607cdf0e10cSrcweir pDoc->ClearSelectionItems( pWhich, aMultiMark ); 3608cdf0e10cSrcweir 3609cdf0e10cSrcweir rDocShell.PostPaint( aMarkRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE ); 3610cdf0e10cSrcweir aModificator.SetDocumentModified(); 3611cdf0e10cSrcweir 3612cdf0e10cSrcweir //! Bindings-Invalidate etc.? 3613cdf0e10cSrcweir 3614cdf0e10cSrcweir return sal_True; 3615cdf0e10cSrcweir } 3616cdf0e10cSrcweir 3617cdf0e10cSrcweir sal_Bool ScDocFunc::ChangeIndent( const ScMarkData& rMark, sal_Bool bIncrement, sal_Bool bApi ) 3618cdf0e10cSrcweir { 3619cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3620cdf0e10cSrcweir 3621cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3622cdf0e10cSrcweir sal_Bool bUndo(pDoc->IsUndoEnabled()); 3623cdf0e10cSrcweir ScEditableTester aTester( pDoc, rMark ); 3624cdf0e10cSrcweir if (!aTester.IsEditable()) 3625cdf0e10cSrcweir { 3626cdf0e10cSrcweir if (!bApi) 3627cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 3628cdf0e10cSrcweir return sal_False; 3629cdf0e10cSrcweir } 3630cdf0e10cSrcweir 3631cdf0e10cSrcweir ScRange aMarkRange; 3632cdf0e10cSrcweir rMark.GetMultiMarkArea( aMarkRange ); 3633cdf0e10cSrcweir 3634cdf0e10cSrcweir // if (bRecord) 3635cdf0e10cSrcweir if (bUndo) 3636cdf0e10cSrcweir { 3637cdf0e10cSrcweir SCTAB nStartTab = aMarkRange.aStart.Tab(); 3638cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 3639cdf0e10cSrcweir 3640cdf0e10cSrcweir ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 3641cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab ); 3642cdf0e10cSrcweir for (SCTAB i=0; i<nTabCount; i++) 3643cdf0e10cSrcweir if (i != nStartTab && rMark.GetTableSelect(i)) 3644cdf0e10cSrcweir pUndoDoc->AddUndoTab( i, i ); 3645cdf0e10cSrcweir 3646cdf0e10cSrcweir ScRange aCopyRange = aMarkRange; 3647cdf0e10cSrcweir aCopyRange.aStart.SetTab(0); 3648cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1); 3649cdf0e10cSrcweir pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_True, pUndoDoc, (ScMarkData*)&rMark ); 3650cdf0e10cSrcweir 3651cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3652cdf0e10cSrcweir new ScUndoIndent( &rDocShell, rMark, pUndoDoc, bIncrement ) ); 3653cdf0e10cSrcweir } 3654cdf0e10cSrcweir 3655cdf0e10cSrcweir pDoc->ChangeSelectionIndent( bIncrement, rMark ); 3656cdf0e10cSrcweir 3657cdf0e10cSrcweir rDocShell.PostPaint( aMarkRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE ); 3658cdf0e10cSrcweir aModificator.SetDocumentModified(); 3659cdf0e10cSrcweir 3660cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 3661cdf0e10cSrcweir if (pBindings) 3662cdf0e10cSrcweir { 3663cdf0e10cSrcweir pBindings->Invalidate( SID_ALIGNLEFT ); // ChangeIndent setzt auf links 3664cdf0e10cSrcweir pBindings->Invalidate( SID_ALIGNRIGHT ); 3665cdf0e10cSrcweir pBindings->Invalidate( SID_ALIGNBLOCK ); 3666cdf0e10cSrcweir pBindings->Invalidate( SID_ALIGNCENTERHOR ); 3667512ec161SZheng Fan pBindings->Invalidate( SID_ATTR_LRSPACE ); 3668766ce4d0SZheng Fan pBindings->Invalidate( SID_ATTR_PARA_ADJUST_LEFT ); 3669766ce4d0SZheng Fan pBindings->Invalidate( SID_ATTR_PARA_ADJUST_RIGHT ); 3670766ce4d0SZheng Fan pBindings->Invalidate( SID_ATTR_PARA_ADJUST_BLOCK ); 3671766ce4d0SZheng Fan pBindings->Invalidate( SID_ATTR_PARA_ADJUST_CENTER); 3672cdf0e10cSrcweir // pseudo slots for Format menu 3673cdf0e10cSrcweir pBindings->Invalidate( SID_ALIGN_ANY_HDEFAULT ); 3674cdf0e10cSrcweir pBindings->Invalidate( SID_ALIGN_ANY_LEFT ); 3675cdf0e10cSrcweir pBindings->Invalidate( SID_ALIGN_ANY_HCENTER ); 3676cdf0e10cSrcweir pBindings->Invalidate( SID_ALIGN_ANY_RIGHT ); 3677cdf0e10cSrcweir pBindings->Invalidate( SID_ALIGN_ANY_JUSTIFIED ); 3678cdf0e10cSrcweir } 3679cdf0e10cSrcweir 3680cdf0e10cSrcweir return sal_True; 3681cdf0e10cSrcweir } 3682cdf0e10cSrcweir 3683cdf0e10cSrcweir sal_Bool ScDocFunc::AutoFormat( const ScRange& rRange, const ScMarkData* pTabMark, 3684cdf0e10cSrcweir sal_uInt16 nFormatNo, sal_Bool bRecord, sal_Bool bApi ) 3685cdf0e10cSrcweir { 3686cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3687cdf0e10cSrcweir 3688cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 3689cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3690cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 3691cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 3692cdf0e10cSrcweir SCTAB nStartTab = rRange.aStart.Tab(); 3693cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 3694cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 3695cdf0e10cSrcweir SCTAB nEndTab = rRange.aEnd.Tab(); 3696cdf0e10cSrcweir 3697cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 3698cdf0e10cSrcweir bRecord = sal_False; 3699cdf0e10cSrcweir ScMarkData aMark; 3700cdf0e10cSrcweir if (pTabMark) 3701cdf0e10cSrcweir aMark = *pTabMark; 3702cdf0e10cSrcweir else 3703cdf0e10cSrcweir { 3704cdf0e10cSrcweir for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++) 3705cdf0e10cSrcweir aMark.SelectTable( nTab, sal_True ); 3706cdf0e10cSrcweir } 3707cdf0e10cSrcweir 3708cdf0e10cSrcweir ScAutoFormat* pAutoFormat = ScGlobal::GetAutoFormat(); 3709cdf0e10cSrcweir ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark ); 3710cdf0e10cSrcweir if ( pAutoFormat && nFormatNo < pAutoFormat->GetCount() && aTester.IsEditable() ) 3711cdf0e10cSrcweir { 3712cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); 3713cdf0e10cSrcweir 3714cdf0e10cSrcweir sal_Bool bSize = (*pAutoFormat)[nFormatNo]->GetIncludeWidthHeight(); 3715cdf0e10cSrcweir 3716cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 3717cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 3718cdf0e10cSrcweir if ( bRecord ) 3719cdf0e10cSrcweir { 3720cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 3721cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab, bSize, bSize ); 3722cdf0e10cSrcweir for (SCTAB i=0; i<nTabCount; i++) 3723cdf0e10cSrcweir if (i != nStartTab && aMark.GetTableSelect(i)) 3724cdf0e10cSrcweir pUndoDoc->AddUndoTab( i, i, bSize, bSize ); 3725cdf0e10cSrcweir 3726cdf0e10cSrcweir ScRange aCopyRange = rRange; 3727cdf0e10cSrcweir aCopyRange.aStart.SetTab(0); 3728cdf0e10cSrcweir aCopyRange.aStart.SetTab(nTabCount-1); 3729cdf0e10cSrcweir pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_False, pUndoDoc, &aMark ); 3730cdf0e10cSrcweir if (bSize) 3731cdf0e10cSrcweir { 3732cdf0e10cSrcweir pDoc->CopyToDocument( nStartCol,0,0, nEndCol,MAXROW,nTabCount-1, 3733cdf0e10cSrcweir IDF_NONE, sal_False, pUndoDoc, &aMark ); 3734cdf0e10cSrcweir pDoc->CopyToDocument( 0,nStartRow,0, MAXCOL,nEndRow,nTabCount-1, 3735cdf0e10cSrcweir IDF_NONE, sal_False, pUndoDoc, &aMark ); 3736cdf0e10cSrcweir } 3737cdf0e10cSrcweir pDoc->BeginDrawUndo(); 3738cdf0e10cSrcweir } 3739cdf0e10cSrcweir 3740cdf0e10cSrcweir pDoc->AutoFormat( nStartCol, nStartRow, nEndCol, nEndRow, nFormatNo, aMark ); 3741cdf0e10cSrcweir 3742cdf0e10cSrcweir if (bSize) 3743cdf0e10cSrcweir { 3744cdf0e10cSrcweir /* SCCOL nCols[2]; 3745cdf0e10cSrcweir nCols[0] = nStartCol; 3746cdf0e10cSrcweir nCols[1] = nEndCol; 3747cdf0e10cSrcweir SCROW nRows[2]; 3748cdf0e10cSrcweir nRows[0] = nStartRow; 3749cdf0e10cSrcweir nRows[1] = nEndRow; 3750cdf0e10cSrcweir */ 3751cdf0e10cSrcweir SCCOLROW nCols[2] = { nStartCol, nEndCol }; 3752cdf0e10cSrcweir SCCOLROW nRows[2] = { nStartRow, nEndRow }; 3753cdf0e10cSrcweir 3754cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nTabCount; nTab++) 3755cdf0e10cSrcweir if (aMark.GetTableSelect(nTab)) 3756cdf0e10cSrcweir { 3757cdf0e10cSrcweir SetWidthOrHeight( sal_True, 1,nCols, nTab, SC_SIZE_VISOPT, STD_EXTRA_WIDTH, sal_False, sal_True); 3758cdf0e10cSrcweir SetWidthOrHeight( sal_False,1,nRows, nTab, SC_SIZE_VISOPT, 0, sal_False, sal_False); 3759cdf0e10cSrcweir rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, 3760cdf0e10cSrcweir PAINT_GRID | PAINT_LEFT | PAINT_TOP ); 3761cdf0e10cSrcweir } 3762cdf0e10cSrcweir } 3763cdf0e10cSrcweir else 3764cdf0e10cSrcweir { 3765cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nTabCount; nTab++) 3766cdf0e10cSrcweir if (aMark.GetTableSelect(nTab)) 3767cdf0e10cSrcweir { 3768cdf0e10cSrcweir sal_Bool bAdj = AdjustRowHeight( ScRange(nStartCol, nStartRow, nTab, 3769cdf0e10cSrcweir nEndCol, nEndRow, nTab), sal_False ); 3770cdf0e10cSrcweir if (bAdj) 3771cdf0e10cSrcweir rDocShell.PostPaint( 0,nStartRow,nTab, MAXCOL,MAXROW,nTab, 3772cdf0e10cSrcweir PAINT_GRID | PAINT_LEFT ); 3773cdf0e10cSrcweir else 3774cdf0e10cSrcweir rDocShell.PostPaint( nStartCol, nStartRow, nTab, 3775cdf0e10cSrcweir nEndCol, nEndRow, nTab, PAINT_GRID ); 3776cdf0e10cSrcweir } 3777cdf0e10cSrcweir } 3778cdf0e10cSrcweir 3779cdf0e10cSrcweir if ( bRecord ) // Draw-Undo erst jetzt verfuegbar 3780cdf0e10cSrcweir { 3781cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3782cdf0e10cSrcweir new ScUndoAutoFormat( &rDocShell, rRange, pUndoDoc, aMark, bSize, nFormatNo ) ); 3783cdf0e10cSrcweir } 3784cdf0e10cSrcweir 3785cdf0e10cSrcweir aModificator.SetDocumentModified(); 3786cdf0e10cSrcweir } 3787cdf0e10cSrcweir else if (!bApi) 3788cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 3789cdf0e10cSrcweir 3790cdf0e10cSrcweir return bSuccess; 3791cdf0e10cSrcweir } 3792cdf0e10cSrcweir 3793cdf0e10cSrcweir //------------------------------------------------------------------------ 3794cdf0e10cSrcweir 3795cdf0e10cSrcweir sal_Bool ScDocFunc::EnterMatrix( const ScRange& rRange, const ScMarkData* pTabMark, 3796cdf0e10cSrcweir const ScTokenArray* pTokenArray, const String& rString, sal_Bool bApi, sal_Bool bEnglish, 3797cdf0e10cSrcweir const String& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) 3798cdf0e10cSrcweir { 3799cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3800cdf0e10cSrcweir 3801cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 3802cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3803cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 3804cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 3805cdf0e10cSrcweir SCTAB nStartTab = rRange.aStart.Tab(); 3806cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 3807cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 3808cdf0e10cSrcweir SCTAB nEndTab = rRange.aEnd.Tab(); 3809cdf0e10cSrcweir 3810cdf0e10cSrcweir sal_Bool bUndo(pDoc->IsUndoEnabled()); 3811cdf0e10cSrcweir 3812cdf0e10cSrcweir ScMarkData aMark; 3813cdf0e10cSrcweir if (pTabMark) 3814cdf0e10cSrcweir aMark = *pTabMark; 3815cdf0e10cSrcweir else 3816cdf0e10cSrcweir { 3817cdf0e10cSrcweir for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++) 3818cdf0e10cSrcweir aMark.SelectTable( nTab, sal_True ); 3819cdf0e10cSrcweir } 3820cdf0e10cSrcweir 3821cdf0e10cSrcweir ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark ); 3822cdf0e10cSrcweir if ( aTester.IsEditable() ) 3823cdf0e10cSrcweir { 3824cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); 3825cdf0e10cSrcweir 3826cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 3827cdf0e10cSrcweir // if (bRecord) // immer 3828cdf0e10cSrcweir if (bUndo) 3829cdf0e10cSrcweir { 3830cdf0e10cSrcweir //! auch bei Undo selektierte Tabellen beruecksichtigen 3831cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 3832cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab ); 3833cdf0e10cSrcweir pDoc->CopyToDocument( rRange, IDF_ALL & ~IDF_NOTE, sal_False, pUndoDoc ); 3834cdf0e10cSrcweir } 3835cdf0e10cSrcweir 3836cdf0e10cSrcweir // use TokenArray if given, string (and flags) otherwise 3837cdf0e10cSrcweir if ( pTokenArray ) 3838cdf0e10cSrcweir { 3839cdf0e10cSrcweir pDoc->InsertMatrixFormula( nStartCol, nStartRow, nEndCol, nEndRow, 3840cdf0e10cSrcweir aMark, EMPTY_STRING, pTokenArray, eGrammar); 3841cdf0e10cSrcweir } 3842cdf0e10cSrcweir else if ( pDoc->IsImportingXML() ) 3843cdf0e10cSrcweir { 3844cdf0e10cSrcweir ScTokenArray* pCode = lcl_ScDocFunc_CreateTokenArrayXML( rString, rFormulaNmsp, eGrammar ); 3845cdf0e10cSrcweir pDoc->InsertMatrixFormula( nStartCol, nStartRow, nEndCol, nEndRow, 3846cdf0e10cSrcweir aMark, EMPTY_STRING, pCode, eGrammar); 3847cdf0e10cSrcweir delete pCode; 3848cdf0e10cSrcweir pDoc->IncXMLImportedFormulaCount( rString.Len() ); 3849cdf0e10cSrcweir } 3850cdf0e10cSrcweir else if (bEnglish) 3851cdf0e10cSrcweir { 3852cdf0e10cSrcweir ScCompiler aComp( pDoc, rRange.aStart); 3853cdf0e10cSrcweir aComp.SetGrammar(eGrammar); 3854cdf0e10cSrcweir ScTokenArray* pCode = aComp.CompileString( rString ); 3855cdf0e10cSrcweir pDoc->InsertMatrixFormula( nStartCol, nStartRow, nEndCol, nEndRow, 3856cdf0e10cSrcweir aMark, EMPTY_STRING, pCode, eGrammar); 3857cdf0e10cSrcweir delete pCode; 3858cdf0e10cSrcweir } 3859cdf0e10cSrcweir else 3860cdf0e10cSrcweir pDoc->InsertMatrixFormula( nStartCol, nStartRow, nEndCol, nEndRow, 3861cdf0e10cSrcweir aMark, rString, NULL, eGrammar); 3862cdf0e10cSrcweir 3863cdf0e10cSrcweir // if (bRecord) // immer 3864cdf0e10cSrcweir if (bUndo) 3865cdf0e10cSrcweir { 3866cdf0e10cSrcweir //! auch bei Undo selektierte Tabellen beruecksichtigen 3867cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3868cdf0e10cSrcweir new ScUndoEnterMatrix( &rDocShell, rRange, pUndoDoc, rString ) ); 3869cdf0e10cSrcweir } 3870cdf0e10cSrcweir 3871cdf0e10cSrcweir // Err522 beim Paint von DDE-Formeln werden jetzt beim Interpretieren abgefangen 3872cdf0e10cSrcweir rDocShell.PostPaint( nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab, PAINT_GRID ); 3873cdf0e10cSrcweir aModificator.SetDocumentModified(); 3874cdf0e10cSrcweir 3875cdf0e10cSrcweir bSuccess = sal_True; 3876cdf0e10cSrcweir } 3877cdf0e10cSrcweir else if (!bApi) 3878cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 3879cdf0e10cSrcweir 3880cdf0e10cSrcweir return bSuccess; 3881cdf0e10cSrcweir } 3882cdf0e10cSrcweir 3883cdf0e10cSrcweir //------------------------------------------------------------------------ 3884cdf0e10cSrcweir 3885cdf0e10cSrcweir sal_Bool ScDocFunc::TabOp( const ScRange& rRange, const ScMarkData* pTabMark, 3886cdf0e10cSrcweir const ScTabOpParam& rParam, sal_Bool bRecord, sal_Bool bApi ) 3887cdf0e10cSrcweir { 3888cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3889cdf0e10cSrcweir 3890cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 3891cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3892cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 3893cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 3894cdf0e10cSrcweir SCTAB nStartTab = rRange.aStart.Tab(); 3895cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 3896cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 3897cdf0e10cSrcweir SCTAB nEndTab = rRange.aEnd.Tab(); 3898cdf0e10cSrcweir 3899cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 3900cdf0e10cSrcweir bRecord = sal_False; 3901cdf0e10cSrcweir 3902cdf0e10cSrcweir ScMarkData aMark; 3903cdf0e10cSrcweir if (pTabMark) 3904cdf0e10cSrcweir aMark = *pTabMark; 3905cdf0e10cSrcweir else 3906cdf0e10cSrcweir { 3907cdf0e10cSrcweir for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++) 3908cdf0e10cSrcweir aMark.SelectTable( nTab, sal_True ); 3909cdf0e10cSrcweir } 3910cdf0e10cSrcweir 3911cdf0e10cSrcweir ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark ); 3912cdf0e10cSrcweir if ( aTester.IsEditable() ) 3913cdf0e10cSrcweir { 3914cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); 3915cdf0e10cSrcweir pDoc->SetDirty( rRange ); 3916cdf0e10cSrcweir if ( bRecord ) 3917cdf0e10cSrcweir { 3918cdf0e10cSrcweir //! auch bei Undo selektierte Tabellen beruecksichtigen 3919cdf0e10cSrcweir ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 3920cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab ); 3921cdf0e10cSrcweir pDoc->CopyToDocument( rRange, IDF_ALL & ~IDF_NOTE, sal_False, pUndoDoc ); 3922cdf0e10cSrcweir 3923cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 3924cdf0e10cSrcweir new ScUndoTabOp( &rDocShell, 3925cdf0e10cSrcweir nStartCol, nStartRow, nStartTab, 3926cdf0e10cSrcweir nEndCol, nEndRow, nEndTab, pUndoDoc, 3927cdf0e10cSrcweir rParam.aRefFormulaCell, 3928cdf0e10cSrcweir rParam.aRefFormulaEnd, 3929cdf0e10cSrcweir rParam.aRefRowCell, 3930cdf0e10cSrcweir rParam.aRefColCell, 3931cdf0e10cSrcweir rParam.nMode) ); 3932cdf0e10cSrcweir } 3933cdf0e10cSrcweir pDoc->InsertTableOp(rParam, nStartCol, nStartRow, nEndCol, nEndRow, aMark); 3934cdf0e10cSrcweir rDocShell.PostPaintGridAll(); 3935cdf0e10cSrcweir aModificator.SetDocumentModified(); 3936cdf0e10cSrcweir bSuccess = sal_True; 3937cdf0e10cSrcweir } 3938cdf0e10cSrcweir else if (!bApi) 3939cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 3940cdf0e10cSrcweir 3941cdf0e10cSrcweir return bSuccess; 3942cdf0e10cSrcweir } 3943cdf0e10cSrcweir 3944cdf0e10cSrcweir //------------------------------------------------------------------------ 3945cdf0e10cSrcweir 3946cdf0e10cSrcweir inline ScDirection DirFromFillDir( FillDir eDir ) 3947cdf0e10cSrcweir { 3948cdf0e10cSrcweir if (eDir==FILL_TO_BOTTOM) 3949cdf0e10cSrcweir return DIR_BOTTOM; 3950cdf0e10cSrcweir else if (eDir==FILL_TO_RIGHT) 3951cdf0e10cSrcweir return DIR_RIGHT; 3952cdf0e10cSrcweir else if (eDir==FILL_TO_TOP) 3953cdf0e10cSrcweir return DIR_TOP; 3954cdf0e10cSrcweir else // if (eDir==FILL_TO_LEFT) 3955cdf0e10cSrcweir return DIR_LEFT; 3956cdf0e10cSrcweir } 3957cdf0e10cSrcweir 3958cdf0e10cSrcweir sal_Bool ScDocFunc::FillSimple( const ScRange& rRange, const ScMarkData* pTabMark, 3959cdf0e10cSrcweir FillDir eDir, sal_Bool bRecord, sal_Bool bApi ) 3960cdf0e10cSrcweir { 3961cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 3962cdf0e10cSrcweir 3963cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 3964cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 3965cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 3966cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 3967cdf0e10cSrcweir SCTAB nStartTab = rRange.aStart.Tab(); 3968cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 3969cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 3970cdf0e10cSrcweir SCTAB nEndTab = rRange.aEnd.Tab(); 3971cdf0e10cSrcweir 3972cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 3973cdf0e10cSrcweir bRecord = sal_False; 3974cdf0e10cSrcweir 3975cdf0e10cSrcweir ScMarkData aMark; 3976cdf0e10cSrcweir if (pTabMark) 3977cdf0e10cSrcweir aMark = *pTabMark; 3978cdf0e10cSrcweir else 3979cdf0e10cSrcweir { 3980cdf0e10cSrcweir for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++) 3981cdf0e10cSrcweir aMark.SelectTable( nTab, sal_True ); 3982cdf0e10cSrcweir } 3983cdf0e10cSrcweir 3984cdf0e10cSrcweir ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark ); 3985cdf0e10cSrcweir if ( aTester.IsEditable() ) 3986cdf0e10cSrcweir { 3987cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); 3988cdf0e10cSrcweir 3989cdf0e10cSrcweir ScRange aSourceArea = rRange; 3990cdf0e10cSrcweir ScRange aDestArea = rRange; 3991cdf0e10cSrcweir 3992cdf0e10cSrcweir SCCOLROW nCount = 0; 3993cdf0e10cSrcweir switch (eDir) 3994cdf0e10cSrcweir { 3995cdf0e10cSrcweir case FILL_TO_BOTTOM: 3996cdf0e10cSrcweir nCount = aSourceArea.aEnd.Row()-aSourceArea.aStart.Row(); 3997cdf0e10cSrcweir aSourceArea.aEnd.SetRow( aSourceArea.aStart.Row() ); 3998cdf0e10cSrcweir break; 3999cdf0e10cSrcweir case FILL_TO_RIGHT: 4000cdf0e10cSrcweir nCount = aSourceArea.aEnd.Col()-aSourceArea.aStart.Col(); 4001cdf0e10cSrcweir aSourceArea.aEnd.SetCol( aSourceArea.aStart.Col() ); 4002cdf0e10cSrcweir break; 4003cdf0e10cSrcweir case FILL_TO_TOP: 4004cdf0e10cSrcweir nCount = aSourceArea.aEnd.Row()-aSourceArea.aStart.Row(); 4005cdf0e10cSrcweir aSourceArea.aStart.SetRow( aSourceArea.aEnd.Row() ); 4006cdf0e10cSrcweir break; 4007cdf0e10cSrcweir case FILL_TO_LEFT: 4008cdf0e10cSrcweir nCount = aSourceArea.aEnd.Col()-aSourceArea.aStart.Col(); 4009cdf0e10cSrcweir aSourceArea.aStart.SetCol( aSourceArea.aEnd.Col() ); 4010cdf0e10cSrcweir break; 4011cdf0e10cSrcweir } 4012cdf0e10cSrcweir 4013cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 4014cdf0e10cSrcweir if ( bRecord ) 4015cdf0e10cSrcweir { 4016cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 4017cdf0e10cSrcweir SCTAB nDestStartTab = aDestArea.aStart.Tab(); 4018cdf0e10cSrcweir 4019cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 4020cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nDestStartTab, nDestStartTab ); 4021cdf0e10cSrcweir for (SCTAB i=0; i<nTabCount; i++) 4022cdf0e10cSrcweir if (i != nDestStartTab && aMark.GetTableSelect(i)) 4023cdf0e10cSrcweir pUndoDoc->AddUndoTab( i, i ); 4024cdf0e10cSrcweir 4025cdf0e10cSrcweir ScRange aCopyRange = aDestArea; 4026cdf0e10cSrcweir aCopyRange.aStart.SetTab(0); 4027cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1); 4028cdf0e10cSrcweir pDoc->CopyToDocument( aCopyRange, IDF_AUTOFILL, sal_False, pUndoDoc, &aMark ); 4029cdf0e10cSrcweir } 4030cdf0e10cSrcweir 4031cdf0e10cSrcweir pDoc->Fill( aSourceArea.aStart.Col(), aSourceArea.aStart.Row(), 4032cdf0e10cSrcweir aSourceArea.aEnd.Col(), aSourceArea.aEnd.Row(), aMark, 4033cdf0e10cSrcweir nCount, eDir, FILL_SIMPLE ); 4034cdf0e10cSrcweir AdjustRowHeight(rRange); 4035cdf0e10cSrcweir 4036cdf0e10cSrcweir if ( bRecord ) // Draw-Undo erst jetzt verfuegbar 4037cdf0e10cSrcweir { 4038cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 4039cdf0e10cSrcweir new ScUndoAutoFill( &rDocShell, aDestArea, aSourceArea, pUndoDoc, aMark, 4040cdf0e10cSrcweir eDir, FILL_SIMPLE, FILL_DAY, MAXDOUBLE, 1.0, 1e307, 4041cdf0e10cSrcweir pDoc->GetRangeName()->GetSharedMaxIndex()+1 ) ); 4042cdf0e10cSrcweir } 4043cdf0e10cSrcweir 4044cdf0e10cSrcweir rDocShell.PostPaintGridAll(); 4045cdf0e10cSrcweir // rDocShell.PostPaintDataChanged(); 4046cdf0e10cSrcweir aModificator.SetDocumentModified(); 4047cdf0e10cSrcweir 4048cdf0e10cSrcweir bSuccess = sal_True; 4049cdf0e10cSrcweir } 4050cdf0e10cSrcweir else if (!bApi) 4051cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 4052cdf0e10cSrcweir 4053cdf0e10cSrcweir return bSuccess; 4054cdf0e10cSrcweir } 4055cdf0e10cSrcweir 4056cdf0e10cSrcweir sal_Bool ScDocFunc::FillSeries( const ScRange& rRange, const ScMarkData* pTabMark, 4057cdf0e10cSrcweir FillDir eDir, FillCmd eCmd, FillDateCmd eDateCmd, 4058cdf0e10cSrcweir double fStart, double fStep, double fMax, 4059cdf0e10cSrcweir sal_Bool bRecord, sal_Bool bApi ) 4060cdf0e10cSrcweir { 4061cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 4062cdf0e10cSrcweir 4063cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 4064cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4065cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 4066cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 4067cdf0e10cSrcweir SCTAB nStartTab = rRange.aStart.Tab(); 4068cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 4069cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 4070cdf0e10cSrcweir SCTAB nEndTab = rRange.aEnd.Tab(); 4071cdf0e10cSrcweir 4072cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 4073cdf0e10cSrcweir bRecord = sal_False; 4074cdf0e10cSrcweir 4075cdf0e10cSrcweir ScMarkData aMark; 4076cdf0e10cSrcweir if (pTabMark) 4077cdf0e10cSrcweir aMark = *pTabMark; 4078cdf0e10cSrcweir else 4079cdf0e10cSrcweir { 4080cdf0e10cSrcweir for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++) 4081cdf0e10cSrcweir aMark.SelectTable( nTab, sal_True ); 4082cdf0e10cSrcweir } 4083cdf0e10cSrcweir 4084cdf0e10cSrcweir ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark ); 4085cdf0e10cSrcweir if ( aTester.IsEditable() ) 4086cdf0e10cSrcweir { 4087cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); 4088cdf0e10cSrcweir 4089cdf0e10cSrcweir ScRange aSourceArea = rRange; 4090cdf0e10cSrcweir ScRange aDestArea = rRange; 4091cdf0e10cSrcweir 4092cdf0e10cSrcweir SCSIZE nCount = pDoc->GetEmptyLinesInBlock( 4093cdf0e10cSrcweir aSourceArea.aStart.Col(), aSourceArea.aStart.Row(), aSourceArea.aStart.Tab(), 4094cdf0e10cSrcweir aSourceArea.aEnd.Col(), aSourceArea.aEnd.Row(), aSourceArea.aEnd.Tab(), 4095cdf0e10cSrcweir DirFromFillDir(eDir) ); 4096cdf0e10cSrcweir 4097cdf0e10cSrcweir // #27665# mindestens eine Zeile/Spalte als Quellbereich behalten: 4098cdf0e10cSrcweir SCSIZE nTotLines = ( eDir == FILL_TO_BOTTOM || eDir == FILL_TO_TOP ) ? 4099cdf0e10cSrcweir static_cast<SCSIZE>( aSourceArea.aEnd.Row() - aSourceArea.aStart.Row() + 1 ) : 4100cdf0e10cSrcweir static_cast<SCSIZE>( aSourceArea.aEnd.Col() - aSourceArea.aStart.Col() + 1 ); 4101cdf0e10cSrcweir if ( nCount >= nTotLines ) 4102cdf0e10cSrcweir nCount = nTotLines - 1; 4103cdf0e10cSrcweir 4104cdf0e10cSrcweir switch (eDir) 4105cdf0e10cSrcweir { 4106cdf0e10cSrcweir case FILL_TO_BOTTOM: 4107cdf0e10cSrcweir aSourceArea.aEnd.SetRow( sal::static_int_cast<SCROW>( aSourceArea.aEnd.Row() - nCount ) ); 4108cdf0e10cSrcweir break; 4109cdf0e10cSrcweir case FILL_TO_RIGHT: 4110cdf0e10cSrcweir aSourceArea.aEnd.SetCol( sal::static_int_cast<SCCOL>( aSourceArea.aEnd.Col() - nCount ) ); 4111cdf0e10cSrcweir break; 4112cdf0e10cSrcweir case FILL_TO_TOP: 4113cdf0e10cSrcweir aSourceArea.aStart.SetRow( sal::static_int_cast<SCROW>( aSourceArea.aStart.Row() + nCount ) ); 4114cdf0e10cSrcweir break; 4115cdf0e10cSrcweir case FILL_TO_LEFT: 4116cdf0e10cSrcweir aSourceArea.aStart.SetCol( sal::static_int_cast<SCCOL>( aSourceArea.aStart.Col() + nCount ) ); 4117cdf0e10cSrcweir break; 4118cdf0e10cSrcweir } 4119cdf0e10cSrcweir 4120cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 4121cdf0e10cSrcweir if ( bRecord ) 4122cdf0e10cSrcweir { 4123cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 4124cdf0e10cSrcweir SCTAB nDestStartTab = aDestArea.aStart.Tab(); 4125cdf0e10cSrcweir 4126cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 4127cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nDestStartTab, nDestStartTab ); 4128cdf0e10cSrcweir for (SCTAB i=0; i<nTabCount; i++) 4129cdf0e10cSrcweir if (i != nDestStartTab && aMark.GetTableSelect(i)) 4130cdf0e10cSrcweir pUndoDoc->AddUndoTab( i, i ); 4131cdf0e10cSrcweir 4132cdf0e10cSrcweir pDoc->CopyToDocument( 4133cdf0e10cSrcweir aDestArea.aStart.Col(), aDestArea.aStart.Row(), 0, 4134cdf0e10cSrcweir aDestArea.aEnd.Col(), aDestArea.aEnd.Row(), nTabCount-1, 4135cdf0e10cSrcweir IDF_AUTOFILL, sal_False, pUndoDoc, &aMark ); 4136cdf0e10cSrcweir } 4137cdf0e10cSrcweir 4138cdf0e10cSrcweir if (aDestArea.aStart.Col() <= aDestArea.aEnd.Col() && 4139cdf0e10cSrcweir aDestArea.aStart.Row() <= aDestArea.aEnd.Row()) 4140cdf0e10cSrcweir { 4141cdf0e10cSrcweir if ( fStart != MAXDOUBLE ) 4142cdf0e10cSrcweir { 4143cdf0e10cSrcweir SCCOL nValX = (eDir == FILL_TO_LEFT) ? aDestArea.aEnd.Col() : aDestArea.aStart.Col(); 4144cdf0e10cSrcweir SCROW nValY = (eDir == FILL_TO_TOP ) ? aDestArea.aEnd.Row() : aDestArea.aStart.Row(); 4145cdf0e10cSrcweir SCTAB nTab = aDestArea.aStart.Tab(); 4146cdf0e10cSrcweir pDoc->SetValue( nValX, nValY, nTab, fStart ); 4147cdf0e10cSrcweir } 4148cdf0e10cSrcweir pDoc->Fill( aSourceArea.aStart.Col(), aSourceArea.aStart.Row(), 4149cdf0e10cSrcweir aSourceArea.aEnd.Col(), aSourceArea.aEnd.Row(), aMark, 4150cdf0e10cSrcweir nCount, eDir, eCmd, eDateCmd, fStep, fMax ); 4151cdf0e10cSrcweir AdjustRowHeight(rRange); 4152cdf0e10cSrcweir 4153cdf0e10cSrcweir rDocShell.PostPaintGridAll(); 4154cdf0e10cSrcweir // rDocShell.PostPaintDataChanged(); 4155cdf0e10cSrcweir aModificator.SetDocumentModified(); 4156cdf0e10cSrcweir } 4157cdf0e10cSrcweir 4158cdf0e10cSrcweir if ( bRecord ) // Draw-Undo erst jetzt verfuegbar 4159cdf0e10cSrcweir { 4160cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 4161cdf0e10cSrcweir new ScUndoAutoFill( &rDocShell, aDestArea, aSourceArea, pUndoDoc, aMark, 4162cdf0e10cSrcweir eDir, eCmd, eDateCmd, fStart, fStep, fMax, 4163cdf0e10cSrcweir pDoc->GetRangeName()->GetSharedMaxIndex()+1 ) ); 4164cdf0e10cSrcweir } 4165cdf0e10cSrcweir 4166cdf0e10cSrcweir bSuccess = sal_True; 4167cdf0e10cSrcweir } 4168cdf0e10cSrcweir else if (!bApi) 4169cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 4170cdf0e10cSrcweir 4171cdf0e10cSrcweir return bSuccess; 4172cdf0e10cSrcweir } 4173cdf0e10cSrcweir 4174cdf0e10cSrcweir sal_Bool ScDocFunc::FillAuto( ScRange& rRange, const ScMarkData* pTabMark, 4175cdf0e10cSrcweir FillDir eDir, sal_uLong nCount, sal_Bool bRecord, sal_Bool bApi ) 4176cdf0e10cSrcweir { 4177cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 4178cdf0e10cSrcweir 4179cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4180cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 4181cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 4182cdf0e10cSrcweir SCTAB nStartTab = rRange.aStart.Tab(); 4183cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 4184cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 4185cdf0e10cSrcweir SCTAB nEndTab = rRange.aEnd.Tab(); 4186cdf0e10cSrcweir 4187cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 4188cdf0e10cSrcweir bRecord = sal_False; 4189cdf0e10cSrcweir 4190cdf0e10cSrcweir ScMarkData aMark; 4191cdf0e10cSrcweir if (pTabMark) 4192cdf0e10cSrcweir aMark = *pTabMark; 4193cdf0e10cSrcweir else 4194cdf0e10cSrcweir { 4195cdf0e10cSrcweir for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++) 4196cdf0e10cSrcweir aMark.SelectTable( nTab, sal_True ); 4197cdf0e10cSrcweir } 4198cdf0e10cSrcweir 4199cdf0e10cSrcweir ScRange aSourceArea = rRange; 4200cdf0e10cSrcweir ScRange aDestArea = rRange; 4201cdf0e10cSrcweir 4202cdf0e10cSrcweir FillCmd eCmd = FILL_AUTO; 4203cdf0e10cSrcweir FillDateCmd eDateCmd = FILL_DAY; 4204cdf0e10cSrcweir double fStep = 1.0; 4205cdf0e10cSrcweir double fMax = MAXDOUBLE; 4206cdf0e10cSrcweir 4207cdf0e10cSrcweir switch (eDir) 4208cdf0e10cSrcweir { 4209cdf0e10cSrcweir case FILL_TO_BOTTOM: 4210cdf0e10cSrcweir aDestArea.aEnd.SetRow( sal::static_int_cast<SCROW>( aSourceArea.aEnd.Row() + nCount ) ); 4211cdf0e10cSrcweir break; 4212cdf0e10cSrcweir case FILL_TO_TOP: 4213cdf0e10cSrcweir if (nCount > sal::static_int_cast<sal_uLong>( aSourceArea.aStart.Row() )) 4214cdf0e10cSrcweir { 4215cdf0e10cSrcweir DBG_ERROR("FillAuto: Row < 0"); 4216cdf0e10cSrcweir nCount = aSourceArea.aStart.Row(); 4217cdf0e10cSrcweir } 4218cdf0e10cSrcweir aDestArea.aStart.SetRow( sal::static_int_cast<SCROW>( aSourceArea.aStart.Row() - nCount ) ); 4219cdf0e10cSrcweir break; 4220cdf0e10cSrcweir case FILL_TO_RIGHT: 4221cdf0e10cSrcweir aDestArea.aEnd.SetCol( sal::static_int_cast<SCCOL>( aSourceArea.aEnd.Col() + nCount ) ); 4222cdf0e10cSrcweir break; 4223cdf0e10cSrcweir case FILL_TO_LEFT: 4224cdf0e10cSrcweir if (nCount > sal::static_int_cast<sal_uLong>( aSourceArea.aStart.Col() )) 4225cdf0e10cSrcweir { 4226cdf0e10cSrcweir DBG_ERROR("FillAuto: Col < 0"); 4227cdf0e10cSrcweir nCount = aSourceArea.aStart.Col(); 4228cdf0e10cSrcweir } 4229cdf0e10cSrcweir aDestArea.aStart.SetCol( sal::static_int_cast<SCCOL>( aSourceArea.aStart.Col() - nCount ) ); 4230cdf0e10cSrcweir break; 4231cdf0e10cSrcweir default: 4232cdf0e10cSrcweir DBG_ERROR("Falsche Richtung bei FillAuto"); 4233cdf0e10cSrcweir break; 4234cdf0e10cSrcweir } 4235cdf0e10cSrcweir 4236cdf0e10cSrcweir // Zellschutz testen 4237cdf0e10cSrcweir //! Quellbereich darf geschuetzt sein !!! 4238cdf0e10cSrcweir //! aber kein Matrixfragment enthalten !!! 4239cdf0e10cSrcweir 4240cdf0e10cSrcweir ScEditableTester aTester( pDoc, aDestArea ); 4241cdf0e10cSrcweir if ( !aTester.IsEditable() ) 4242cdf0e10cSrcweir { 4243cdf0e10cSrcweir if (!bApi) 4244cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 4245cdf0e10cSrcweir return sal_False; 4246cdf0e10cSrcweir } 4247cdf0e10cSrcweir 4248cdf0e10cSrcweir if ( pDoc->HasSelectedBlockMatrixFragment( nStartCol, nStartRow, 4249cdf0e10cSrcweir nEndCol, nEndRow, aMark ) ) 4250cdf0e10cSrcweir { 4251cdf0e10cSrcweir if (!bApi) 4252cdf0e10cSrcweir rDocShell.ErrorMessage(STR_MATRIXFRAGMENTERR); 4253cdf0e10cSrcweir return sal_False; 4254cdf0e10cSrcweir } 4255cdf0e10cSrcweir 4256cdf0e10cSrcweir WaitObject aWait( rDocShell.GetActiveDialogParent() ); 4257cdf0e10cSrcweir 4258cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 4259cdf0e10cSrcweir if ( bRecord ) 4260cdf0e10cSrcweir { 4261cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 4262cdf0e10cSrcweir SCTAB nDestStartTab = aDestArea.aStart.Tab(); 4263cdf0e10cSrcweir 4264cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 4265cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nDestStartTab, nDestStartTab ); 4266cdf0e10cSrcweir for (SCTAB i=0; i<nTabCount; i++) 4267cdf0e10cSrcweir if (i != nDestStartTab && aMark.GetTableSelect(i)) 4268cdf0e10cSrcweir pUndoDoc->AddUndoTab( i, i ); 4269cdf0e10cSrcweir 4270cdf0e10cSrcweir // do not clone note captions in undo document 4271cdf0e10cSrcweir pDoc->CopyToDocument( 4272cdf0e10cSrcweir aDestArea.aStart.Col(), aDestArea.aStart.Row(), 0, 4273cdf0e10cSrcweir aDestArea.aEnd.Col(), aDestArea.aEnd.Row(), nTabCount-1, 4274cdf0e10cSrcweir IDF_AUTOFILL, sal_False, pUndoDoc, &aMark ); 4275cdf0e10cSrcweir } 4276cdf0e10cSrcweir 4277cdf0e10cSrcweir pDoc->Fill( aSourceArea.aStart.Col(), aSourceArea.aStart.Row(), 4278cdf0e10cSrcweir aSourceArea.aEnd.Col(), aSourceArea.aEnd.Row(), aMark, 4279cdf0e10cSrcweir nCount, eDir, eCmd, eDateCmd, fStep, fMax ); 4280cdf0e10cSrcweir 4281cdf0e10cSrcweir AdjustRowHeight(aDestArea); 4282cdf0e10cSrcweir 4283cdf0e10cSrcweir if ( bRecord ) // Draw-Undo erst jetzt verfuegbar 4284cdf0e10cSrcweir { 4285cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 4286cdf0e10cSrcweir new ScUndoAutoFill( &rDocShell, aDestArea, aSourceArea, pUndoDoc, aMark, 4287cdf0e10cSrcweir eDir, eCmd, eDateCmd, MAXDOUBLE, fStep, fMax, 4288cdf0e10cSrcweir pDoc->GetRangeName()->GetSharedMaxIndex()+1 ) ); 4289cdf0e10cSrcweir } 4290cdf0e10cSrcweir 4291cdf0e10cSrcweir rDocShell.PostPaintGridAll(); 4292cdf0e10cSrcweir // rDocShell.PostPaintDataChanged(); 4293cdf0e10cSrcweir aModificator.SetDocumentModified(); 4294cdf0e10cSrcweir 4295cdf0e10cSrcweir rRange = aDestArea; // Zielbereich zurueckgeben (zum Markieren) 4296cdf0e10cSrcweir return sal_True; 4297cdf0e10cSrcweir } 4298cdf0e10cSrcweir 4299cdf0e10cSrcweir //------------------------------------------------------------------------ 4300cdf0e10cSrcweir 4301cdf0e10cSrcweir sal_Bool ScDocFunc::MergeCells( const ScRange& rRange, sal_Bool bContents, sal_Bool bRecord, sal_Bool bApi ) 4302cdf0e10cSrcweir { 4303cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 4304cdf0e10cSrcweir 4305cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4306cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 4307cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 4308cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 4309cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 4310cdf0e10cSrcweir SCTAB nTab = rRange.aStart.Tab(); 4311cdf0e10cSrcweir 4312cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 4313cdf0e10cSrcweir bRecord = sal_False; 4314cdf0e10cSrcweir 4315cdf0e10cSrcweir ScEditableTester aTester( pDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow ); 4316cdf0e10cSrcweir if (!aTester.IsEditable()) 4317cdf0e10cSrcweir { 4318cdf0e10cSrcweir if (!bApi) 4319cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 4320cdf0e10cSrcweir return sal_False; 4321cdf0e10cSrcweir } 4322cdf0e10cSrcweir 4323cdf0e10cSrcweir if ( nStartCol == nEndCol && nStartRow == nEndRow ) 4324cdf0e10cSrcweir { 4325cdf0e10cSrcweir // nichts zu tun 4326cdf0e10cSrcweir return sal_True; 4327cdf0e10cSrcweir } 4328cdf0e10cSrcweir 4329cdf0e10cSrcweir if ( pDoc->HasAttrib( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab, 4330cdf0e10cSrcweir HASATTR_MERGED | HASATTR_OVERLAPPED ) ) 4331cdf0e10cSrcweir { 4332cdf0e10cSrcweir // "Zusammenfassen nicht verschachteln !" 4333cdf0e10cSrcweir if (!bApi) 4334cdf0e10cSrcweir rDocShell.ErrorMessage(STR_MSSG_MERGECELLS_0); 4335cdf0e10cSrcweir return sal_False; 4336cdf0e10cSrcweir } 4337cdf0e10cSrcweir 4338cdf0e10cSrcweir sal_Bool bNeedContents = bContents && 4339cdf0e10cSrcweir ( !pDoc->IsBlockEmpty( nTab, nStartCol,nStartRow+1, nStartCol,nEndRow, true ) || 4340cdf0e10cSrcweir !pDoc->IsBlockEmpty( nTab, nStartCol+1,nStartRow, nEndCol,nEndRow, true ) ); 4341cdf0e10cSrcweir 4342cdf0e10cSrcweir ScDocument* pUndoDoc = 0; 4343cdf0e10cSrcweir if (bRecord) 4344cdf0e10cSrcweir { 4345cdf0e10cSrcweir // test if the range contains other notes which also implies that we need an undo document 4346cdf0e10cSrcweir bool bHasNotes = false; 4347cdf0e10cSrcweir for( ScAddress aPos( nStartCol, nStartRow, nTab ); !bHasNotes && (aPos.Col() <= nEndCol); aPos.IncCol() ) 4348cdf0e10cSrcweir for( aPos.SetRow( nStartRow ); !bHasNotes && (aPos.Row() <= nEndRow); aPos.IncRow() ) 4349cdf0e10cSrcweir bHasNotes = ((aPos.Col() != nStartCol) || (aPos.Row() != nStartRow)) && (pDoc->GetNote( aPos ) != 0); 4350cdf0e10cSrcweir 4351cdf0e10cSrcweir if (bNeedContents || bHasNotes) 4352cdf0e10cSrcweir { 4353cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 4354cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nTab, nTab ); 4355cdf0e10cSrcweir // note captions are collected by drawing undo 4356cdf0e10cSrcweir pDoc->CopyToDocument( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab, 4357cdf0e10cSrcweir IDF_ALL|IDF_NOCAPTIONS, sal_False, pUndoDoc ); 4358cdf0e10cSrcweir } 4359cdf0e10cSrcweir if( bHasNotes ) 4360cdf0e10cSrcweir pDoc->BeginDrawUndo(); 4361cdf0e10cSrcweir } 4362cdf0e10cSrcweir 4363cdf0e10cSrcweir if (bNeedContents) 4364cdf0e10cSrcweir pDoc->DoMergeContents( nTab, nStartCol,nStartRow, nEndCol,nEndRow ); 4365cdf0e10cSrcweir pDoc->DoMerge( nTab, nStartCol,nStartRow, nEndCol,nEndRow ); 4366cdf0e10cSrcweir 4367cdf0e10cSrcweir if( bRecord ) 4368cdf0e10cSrcweir { 4369cdf0e10cSrcweir SdrUndoGroup* pDrawUndo = pDoc->GetDrawLayer() ? pDoc->GetDrawLayer()->GetCalcUndo() : 0; 4370cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 4371cdf0e10cSrcweir new ScUndoMerge( &rDocShell, 4372cdf0e10cSrcweir nStartCol, nStartRow, nTab, 4373cdf0e10cSrcweir nEndCol, nEndRow, nTab, bNeedContents, pUndoDoc, pDrawUndo ) ); 4374cdf0e10cSrcweir } 4375cdf0e10cSrcweir 4376cdf0e10cSrcweir if ( !AdjustRowHeight( ScRange( 0,nStartRow,nTab, MAXCOL,nEndRow,nTab ) ) ) 4377cdf0e10cSrcweir rDocShell.PostPaint( nStartCol, nStartRow, nTab, 4378cdf0e10cSrcweir nEndCol, nEndRow, nTab, PAINT_GRID ); 4379cdf0e10cSrcweir if (bNeedContents) 4380cdf0e10cSrcweir pDoc->SetDirty( rRange ); 4381cdf0e10cSrcweir aModificator.SetDocumentModified(); 4382cdf0e10cSrcweir 4383cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 4384cdf0e10cSrcweir if (pBindings) 4385cdf0e10cSrcweir { 4386cdf0e10cSrcweir pBindings->Invalidate( FID_MERGE_ON ); 4387cdf0e10cSrcweir pBindings->Invalidate( FID_MERGE_OFF ); 4388cdf0e10cSrcweir pBindings->Invalidate( FID_MERGE_TOGGLE ); 4389cdf0e10cSrcweir } 4390cdf0e10cSrcweir 4391cdf0e10cSrcweir return sal_True; 4392cdf0e10cSrcweir } 4393cdf0e10cSrcweir 4394cdf0e10cSrcweir sal_Bool ScDocFunc::UnmergeCells( const ScRange& rRange, sal_Bool bRecord, sal_Bool bApi ) 4395cdf0e10cSrcweir { 4396cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 4397cdf0e10cSrcweir 4398cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4399cdf0e10cSrcweir SCTAB nTab = rRange.aStart.Tab(); 4400cdf0e10cSrcweir 4401cdf0e10cSrcweir if (bRecord && !pDoc->IsUndoEnabled()) 4402cdf0e10cSrcweir bRecord = sal_False; 4403cdf0e10cSrcweir 4404cdf0e10cSrcweir if ( pDoc->HasAttrib( rRange, HASATTR_MERGED ) ) 4405cdf0e10cSrcweir { 4406cdf0e10cSrcweir ScRange aExtended = rRange; 4407cdf0e10cSrcweir pDoc->ExtendMerge( aExtended ); 4408cdf0e10cSrcweir ScRange aRefresh = aExtended; 4409cdf0e10cSrcweir pDoc->ExtendOverlapped( aRefresh ); 4410cdf0e10cSrcweir 4411cdf0e10cSrcweir if (bRecord) 4412cdf0e10cSrcweir { 4413cdf0e10cSrcweir ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 4414cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nTab, nTab ); 4415cdf0e10cSrcweir pDoc->CopyToDocument( aExtended, IDF_ATTRIB, sal_False, pUndoDoc ); 4416cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 4417cdf0e10cSrcweir new ScUndoRemoveMerge( &rDocShell, rRange, pUndoDoc ) ); 4418cdf0e10cSrcweir } 4419cdf0e10cSrcweir 4420cdf0e10cSrcweir const SfxPoolItem& rDefAttr = pDoc->GetPool()->GetDefaultItem( ATTR_MERGE ); 4421cdf0e10cSrcweir ScPatternAttr aPattern( pDoc->GetPool() ); 4422cdf0e10cSrcweir aPattern.GetItemSet().Put( rDefAttr ); 4423cdf0e10cSrcweir pDoc->ApplyPatternAreaTab( rRange.aStart.Col(), rRange.aStart.Row(), 4424cdf0e10cSrcweir rRange.aEnd.Col(), rRange.aEnd.Row(), nTab, 4425cdf0e10cSrcweir aPattern ); 4426cdf0e10cSrcweir 4427cdf0e10cSrcweir pDoc->RemoveFlagsTab( aExtended.aStart.Col(), aExtended.aStart.Row(), 4428cdf0e10cSrcweir aExtended.aEnd.Col(), aExtended.aEnd.Row(), nTab, 4429cdf0e10cSrcweir SC_MF_HOR | SC_MF_VER ); 4430cdf0e10cSrcweir 4431cdf0e10cSrcweir pDoc->ExtendMerge( aRefresh, sal_True, sal_False ); 4432cdf0e10cSrcweir 4433cdf0e10cSrcweir if ( !AdjustRowHeight( aExtended ) ) 4434cdf0e10cSrcweir rDocShell.PostPaint( aExtended, PAINT_GRID ); 4435cdf0e10cSrcweir aModificator.SetDocumentModified(); 4436cdf0e10cSrcweir } 4437cdf0e10cSrcweir else if (!bApi) 4438cdf0e10cSrcweir Sound::Beep(); //! sal_False zurueck??? 4439cdf0e10cSrcweir 4440cdf0e10cSrcweir return sal_True; 4441cdf0e10cSrcweir } 4442cdf0e10cSrcweir 4443cdf0e10cSrcweir //------------------------------------------------------------------------ 4444cdf0e10cSrcweir 4445cdf0e10cSrcweir sal_Bool ScDocFunc::ModifyRangeNames( const ScRangeName& rNewRanges, sal_Bool bApi ) 4446cdf0e10cSrcweir { 4447cdf0e10cSrcweir return SetNewRangeNames( new ScRangeName( rNewRanges ), bApi ); 4448cdf0e10cSrcweir } 4449cdf0e10cSrcweir 4450cdf0e10cSrcweir sal_Bool ScDocFunc::SetNewRangeNames( ScRangeName* pNewRanges, sal_Bool /* bApi */ ) // takes ownership of pNewRanges 4451cdf0e10cSrcweir { 4452cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 4453cdf0e10cSrcweir 4454cdf0e10cSrcweir DBG_ASSERT( pNewRanges, "pNewRanges is 0" ); 4455cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4456cdf0e10cSrcweir sal_Bool bUndo(pDoc->IsUndoEnabled()); 4457cdf0e10cSrcweir 4458cdf0e10cSrcweir if (bUndo) 4459cdf0e10cSrcweir { 4460cdf0e10cSrcweir ScRangeName* pOld = pDoc->GetRangeName(); 4461cdf0e10cSrcweir ScRangeName* pUndoRanges = new ScRangeName(*pOld); 4462cdf0e10cSrcweir ScRangeName* pRedoRanges = new ScRangeName(*pNewRanges); 4463cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 4464cdf0e10cSrcweir new ScUndoRangeNames( &rDocShell, pUndoRanges, pRedoRanges ) ); 4465cdf0e10cSrcweir } 4466cdf0e10cSrcweir 4467cdf0e10cSrcweir // #i55926# While loading XML, formula cells only have a single string token, 4468cdf0e10cSrcweir // so CompileNameFormula would never find any name (index) tokens, and would 4469cdf0e10cSrcweir // unnecessarily loop through all cells. 4470cdf0e10cSrcweir sal_Bool bCompile = ( !pDoc->IsImportingXML() && pDoc->GetNamedRangesLockCount() == 0 ); 4471cdf0e10cSrcweir 4472cdf0e10cSrcweir if ( bCompile ) 4473cdf0e10cSrcweir pDoc->CompileNameFormula( sal_True ); // CreateFormulaString 4474cdf0e10cSrcweir pDoc->SetRangeName( pNewRanges ); // takes ownership 4475cdf0e10cSrcweir if ( bCompile ) 4476cdf0e10cSrcweir pDoc->CompileNameFormula( sal_False ); // CompileFormulaString 4477cdf0e10cSrcweir 4478cdf0e10cSrcweir aModificator.SetDocumentModified(); 4479cdf0e10cSrcweir 4480cdf0e10cSrcweir // #i114072# don't broadcast while loading a file 4481cdf0e10cSrcweir // (navigator and input line for other open documents would be notified) 4482cdf0e10cSrcweir if ( bCompile ) 4483cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) ); 4484cdf0e10cSrcweir 4485cdf0e10cSrcweir return sal_True; 4486cdf0e10cSrcweir } 4487cdf0e10cSrcweir 4488cdf0e10cSrcweir //------------------------------------------------------------------------ 4489cdf0e10cSrcweir 4490cdf0e10cSrcweir void ScDocFunc::CreateOneName( ScRangeName& rList, 4491cdf0e10cSrcweir SCCOL nPosX, SCROW nPosY, SCTAB nTab, 4492cdf0e10cSrcweir SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, 4493cdf0e10cSrcweir sal_Bool& rCancel, sal_Bool bApi ) 4494cdf0e10cSrcweir { 4495cdf0e10cSrcweir if (rCancel) 4496cdf0e10cSrcweir return; 4497cdf0e10cSrcweir 4498cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4499cdf0e10cSrcweir if (!pDoc->HasValueData( nPosX, nPosY, nTab )) 4500cdf0e10cSrcweir { 4501cdf0e10cSrcweir String aName; 4502cdf0e10cSrcweir pDoc->GetString( nPosX, nPosY, nTab, aName ); 4503cdf0e10cSrcweir ScRangeData::MakeValidName(aName); 4504cdf0e10cSrcweir if (aName.Len()) 4505cdf0e10cSrcweir { 4506cdf0e10cSrcweir String aContent; 4507cdf0e10cSrcweir ScRange( nX1, nY1, nTab, nX2, nY2, nTab ).Format( aContent, SCR_ABS_3D, pDoc ); 4508cdf0e10cSrcweir 4509cdf0e10cSrcweir sal_Bool bInsert = sal_False; 4510cdf0e10cSrcweir sal_uInt16 nOldPos; 4511cdf0e10cSrcweir if (rList.SearchName( aName, nOldPos )) // vorhanden ? 4512cdf0e10cSrcweir { 4513cdf0e10cSrcweir ScRangeData* pOld = rList[nOldPos]; 4514cdf0e10cSrcweir String aOldStr; 4515cdf0e10cSrcweir pOld->GetSymbol( aOldStr ); 4516cdf0e10cSrcweir if (aOldStr != aContent) 4517cdf0e10cSrcweir { 4518cdf0e10cSrcweir if (bApi) 4519cdf0e10cSrcweir bInsert = sal_True; // per API nicht nachfragen 4520cdf0e10cSrcweir else 4521cdf0e10cSrcweir { 4522cdf0e10cSrcweir String aTemplate = ScGlobal::GetRscString( STR_CREATENAME_REPLACE ); 4523cdf0e10cSrcweir 4524cdf0e10cSrcweir String aMessage = aTemplate.GetToken( 0, '#' ); 4525cdf0e10cSrcweir aMessage += aName; 4526cdf0e10cSrcweir aMessage += aTemplate.GetToken( 1, '#' ); 4527cdf0e10cSrcweir 4528cdf0e10cSrcweir short nResult = QueryBox( rDocShell.GetActiveDialogParent(), 4529cdf0e10cSrcweir WinBits(WB_YES_NO_CANCEL | WB_DEF_YES), 4530cdf0e10cSrcweir aMessage ).Execute(); 4531cdf0e10cSrcweir if ( nResult == RET_YES ) 4532cdf0e10cSrcweir { 4533cdf0e10cSrcweir rList.AtFree(nOldPos); 4534cdf0e10cSrcweir bInsert = sal_True; 4535cdf0e10cSrcweir } 4536cdf0e10cSrcweir else if ( nResult == RET_CANCEL ) 4537cdf0e10cSrcweir rCancel = sal_True; 4538cdf0e10cSrcweir } 4539cdf0e10cSrcweir } 4540cdf0e10cSrcweir } 4541cdf0e10cSrcweir else 4542cdf0e10cSrcweir bInsert = sal_True; 4543cdf0e10cSrcweir 4544cdf0e10cSrcweir if (bInsert) 4545cdf0e10cSrcweir { 4546cdf0e10cSrcweir ScRangeData* pData = new ScRangeData( pDoc, aName, aContent, 4547cdf0e10cSrcweir ScAddress( nPosX, nPosY, nTab)); 4548cdf0e10cSrcweir if (!rList.Insert(pData)) 4549cdf0e10cSrcweir { 4550cdf0e10cSrcweir DBG_ERROR("nanu?"); 4551cdf0e10cSrcweir delete pData; 4552cdf0e10cSrcweir } 4553cdf0e10cSrcweir } 4554cdf0e10cSrcweir } 4555cdf0e10cSrcweir } 4556cdf0e10cSrcweir } 4557cdf0e10cSrcweir 4558cdf0e10cSrcweir sal_Bool ScDocFunc::CreateNames( const ScRange& rRange, sal_uInt16 nFlags, sal_Bool bApi ) 4559cdf0e10cSrcweir { 4560cdf0e10cSrcweir if (!nFlags) 4561cdf0e10cSrcweir return sal_False; // war nix 4562cdf0e10cSrcweir 4563cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 4564cdf0e10cSrcweir 4565cdf0e10cSrcweir sal_Bool bDone = sal_False; 4566cdf0e10cSrcweir SCCOL nStartCol = rRange.aStart.Col(); 4567cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 4568cdf0e10cSrcweir SCCOL nEndCol = rRange.aEnd.Col(); 4569cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 4570cdf0e10cSrcweir SCTAB nTab = rRange.aStart.Tab(); 4571cdf0e10cSrcweir DBG_ASSERT(rRange.aEnd.Tab() == nTab, "CreateNames: mehrere Tabellen geht nicht"); 4572cdf0e10cSrcweir 4573cdf0e10cSrcweir sal_Bool bValid = sal_True; 4574cdf0e10cSrcweir if ( nFlags & ( NAME_TOP | NAME_BOTTOM ) ) 4575cdf0e10cSrcweir if ( nStartRow == nEndRow ) 4576cdf0e10cSrcweir bValid = sal_False; 4577cdf0e10cSrcweir if ( nFlags & ( NAME_LEFT | NAME_RIGHT ) ) 4578cdf0e10cSrcweir if ( nStartCol == nEndCol ) 4579cdf0e10cSrcweir bValid = sal_False; 4580cdf0e10cSrcweir 4581cdf0e10cSrcweir if (bValid) 4582cdf0e10cSrcweir { 4583cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4584cdf0e10cSrcweir ScRangeName* pNames = pDoc->GetRangeName(); 4585cdf0e10cSrcweir if (!pNames) 4586cdf0e10cSrcweir return sal_False; // soll nicht sein 4587cdf0e10cSrcweir ScRangeName aNewRanges( *pNames ); 4588cdf0e10cSrcweir 4589cdf0e10cSrcweir sal_Bool bTop = ( ( nFlags & NAME_TOP ) != 0 ); 4590cdf0e10cSrcweir sal_Bool bLeft = ( ( nFlags & NAME_LEFT ) != 0 ); 4591cdf0e10cSrcweir sal_Bool bBottom = ( ( nFlags & NAME_BOTTOM ) != 0 ); 4592cdf0e10cSrcweir sal_Bool bRight = ( ( nFlags & NAME_RIGHT ) != 0 ); 4593cdf0e10cSrcweir 4594cdf0e10cSrcweir SCCOL nContX1 = nStartCol; 4595cdf0e10cSrcweir SCROW nContY1 = nStartRow; 4596cdf0e10cSrcweir SCCOL nContX2 = nEndCol; 4597cdf0e10cSrcweir SCROW nContY2 = nEndRow; 4598cdf0e10cSrcweir 4599cdf0e10cSrcweir if ( bTop ) 4600cdf0e10cSrcweir ++nContY1; 4601cdf0e10cSrcweir if ( bLeft ) 4602cdf0e10cSrcweir ++nContX1; 4603cdf0e10cSrcweir if ( bBottom ) 4604cdf0e10cSrcweir --nContY2; 4605cdf0e10cSrcweir if ( bRight ) 4606cdf0e10cSrcweir --nContX2; 4607cdf0e10cSrcweir 4608cdf0e10cSrcweir sal_Bool bCancel = sal_False; 4609cdf0e10cSrcweir SCCOL i; 4610cdf0e10cSrcweir SCROW j; 4611cdf0e10cSrcweir 4612cdf0e10cSrcweir if ( bTop ) 4613cdf0e10cSrcweir for (i=nContX1; i<=nContX2; i++) 4614cdf0e10cSrcweir CreateOneName( aNewRanges, i,nStartRow,nTab, i,nContY1,i,nContY2, bCancel, bApi ); 4615cdf0e10cSrcweir if ( bLeft ) 4616cdf0e10cSrcweir for (j=nContY1; j<=nContY2; j++) 4617cdf0e10cSrcweir CreateOneName( aNewRanges, nStartCol,j,nTab, nContX1,j,nContX2,j, bCancel, bApi ); 4618cdf0e10cSrcweir if ( bBottom ) 4619cdf0e10cSrcweir for (i=nContX1; i<=nContX2; i++) 4620cdf0e10cSrcweir CreateOneName( aNewRanges, i,nEndRow,nTab, i,nContY1,i,nContY2, bCancel, bApi ); 4621cdf0e10cSrcweir if ( bRight ) 4622cdf0e10cSrcweir for (j=nContY1; j<=nContY2; j++) 4623cdf0e10cSrcweir CreateOneName( aNewRanges, nEndCol,j,nTab, nContX1,j,nContX2,j, bCancel, bApi ); 4624cdf0e10cSrcweir 4625cdf0e10cSrcweir if ( bTop && bLeft ) 4626cdf0e10cSrcweir CreateOneName( aNewRanges, nStartCol,nStartRow,nTab, nContX1,nContY1,nContX2,nContY2, bCancel, bApi ); 4627cdf0e10cSrcweir if ( bTop && bRight ) 4628cdf0e10cSrcweir CreateOneName( aNewRanges, nEndCol,nStartRow,nTab, nContX1,nContY1,nContX2,nContY2, bCancel, bApi ); 4629cdf0e10cSrcweir if ( bBottom && bLeft ) 4630cdf0e10cSrcweir CreateOneName( aNewRanges, nStartCol,nEndRow,nTab, nContX1,nContY1,nContX2,nContY2, bCancel, bApi ); 4631cdf0e10cSrcweir if ( bBottom && bRight ) 4632cdf0e10cSrcweir CreateOneName( aNewRanges, nEndCol,nEndRow,nTab, nContX1,nContY1,nContX2,nContY2, bCancel, bApi ); 4633cdf0e10cSrcweir 4634cdf0e10cSrcweir bDone = ModifyRangeNames( aNewRanges, bApi ); 4635cdf0e10cSrcweir 4636cdf0e10cSrcweir aModificator.SetDocumentModified(); 4637cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) ); 4638cdf0e10cSrcweir } 4639cdf0e10cSrcweir 4640cdf0e10cSrcweir return bDone; 4641cdf0e10cSrcweir } 4642cdf0e10cSrcweir 4643cdf0e10cSrcweir //------------------------------------------------------------------------ 4644cdf0e10cSrcweir 4645cdf0e10cSrcweir sal_Bool ScDocFunc::InsertNameList( const ScAddress& rStartPos, sal_Bool bApi ) 4646cdf0e10cSrcweir { 4647cdf0e10cSrcweir ScDocShellModificator aModificator( rDocShell ); 4648cdf0e10cSrcweir 4649cdf0e10cSrcweir 4650cdf0e10cSrcweir sal_Bool bDone = sal_False; 4651cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4652cdf0e10cSrcweir const sal_Bool bRecord = pDoc->IsUndoEnabled(); 4653cdf0e10cSrcweir SCTAB nTab = rStartPos.Tab(); 4654cdf0e10cSrcweir ScDocument* pUndoDoc = NULL; 4655cdf0e10cSrcweir 4656cdf0e10cSrcweir ScRangeName* pList = pDoc->GetRangeName(); 4657cdf0e10cSrcweir sal_uInt16 nCount = pList->GetCount(); 4658cdf0e10cSrcweir sal_uInt16 nValidCount = 0; 4659cdf0e10cSrcweir sal_uInt16 i; 4660cdf0e10cSrcweir for (i=0; i<nCount; i++) 4661cdf0e10cSrcweir { 4662cdf0e10cSrcweir ScRangeData* pData = (*pList)[i]; 4663cdf0e10cSrcweir if ( !pData->HasType( RT_DATABASE ) && !pData->HasType( RT_SHARED ) ) 4664cdf0e10cSrcweir ++nValidCount; 4665cdf0e10cSrcweir } 4666cdf0e10cSrcweir 4667cdf0e10cSrcweir if (nValidCount) 4668cdf0e10cSrcweir { 4669cdf0e10cSrcweir SCCOL nStartCol = rStartPos.Col(); 4670cdf0e10cSrcweir SCROW nStartRow = rStartPos.Row(); 4671cdf0e10cSrcweir SCCOL nEndCol = nStartCol + 1; 4672cdf0e10cSrcweir SCROW nEndRow = nStartRow + static_cast<SCROW>(nValidCount) - 1; 4673cdf0e10cSrcweir 4674cdf0e10cSrcweir ScEditableTester aTester( pDoc, nTab, nStartCol,nStartRow, nEndCol,nEndRow ); 4675cdf0e10cSrcweir if (aTester.IsEditable()) 4676cdf0e10cSrcweir { 4677cdf0e10cSrcweir if (bRecord) 4678cdf0e10cSrcweir { 4679cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); 4680cdf0e10cSrcweir pUndoDoc->InitUndo( pDoc, nTab, nTab ); 4681cdf0e10cSrcweir pDoc->CopyToDocument( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab, 4682cdf0e10cSrcweir IDF_ALL, sal_False, pUndoDoc ); 4683cdf0e10cSrcweir 4684cdf0e10cSrcweir pDoc->BeginDrawUndo(); // wegen Hoehenanpassung 4685cdf0e10cSrcweir } 4686cdf0e10cSrcweir 4687cdf0e10cSrcweir ScRangeData** ppSortArray = new ScRangeData* [ nValidCount ]; 4688cdf0e10cSrcweir sal_uInt16 j = 0; 4689cdf0e10cSrcweir for (i=0; i<nCount; i++) 4690cdf0e10cSrcweir { 4691cdf0e10cSrcweir ScRangeData* pData = (*pList)[i]; 4692cdf0e10cSrcweir if ( !pData->HasType( RT_DATABASE ) && !pData->HasType( RT_SHARED ) ) 4693cdf0e10cSrcweir ppSortArray[j++] = pData; 4694cdf0e10cSrcweir } 4695cdf0e10cSrcweir #ifndef ICC 4696cdf0e10cSrcweir qsort( (void*)ppSortArray, nValidCount, sizeof(ScRangeData*), 4697cdf0e10cSrcweir &ScRangeData_QsortNameCompare ); 4698cdf0e10cSrcweir #else 4699cdf0e10cSrcweir qsort( (void*)ppSortArray, nValidCount, sizeof(ScRangeData*), 4700cdf0e10cSrcweir ICCQsortNameCompare ); 4701cdf0e10cSrcweir #endif 4702cdf0e10cSrcweir String aName; 4703cdf0e10cSrcweir rtl::OUStringBuffer aContent; 4704cdf0e10cSrcweir String aFormula; 4705cdf0e10cSrcweir SCROW nOutRow = nStartRow; 4706cdf0e10cSrcweir for (j=0; j<nValidCount; j++) 4707cdf0e10cSrcweir { 4708cdf0e10cSrcweir ScRangeData* pData = ppSortArray[j]; 4709cdf0e10cSrcweir pData->GetName(aName); 4710cdf0e10cSrcweir // relative Referenzen Excel-konform auf die linke Spalte anpassen: 4711cdf0e10cSrcweir pData->UpdateSymbol(aContent, ScAddress( nStartCol, nOutRow, nTab )); 4712cdf0e10cSrcweir aFormula = '='; 4713cdf0e10cSrcweir aFormula += aContent; 4714cdf0e10cSrcweir pDoc->PutCell( nStartCol,nOutRow,nTab, new ScStringCell( aName ) ); 4715cdf0e10cSrcweir pDoc->PutCell( nEndCol ,nOutRow,nTab, new ScStringCell( aFormula ) ); 4716cdf0e10cSrcweir ++nOutRow; 4717cdf0e10cSrcweir } 4718cdf0e10cSrcweir 4719cdf0e10cSrcweir delete [] ppSortArray; 4720cdf0e10cSrcweir 4721cdf0e10cSrcweir if (bRecord) 4722cdf0e10cSrcweir { 4723cdf0e10cSrcweir ScDocument* pRedoDoc = new ScDocument( SCDOCMODE_UNDO ); 4724cdf0e10cSrcweir pRedoDoc->InitUndo( pDoc, nTab, nTab ); 4725cdf0e10cSrcweir pDoc->CopyToDocument( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab, 4726cdf0e10cSrcweir IDF_ALL, sal_False, pRedoDoc ); 4727cdf0e10cSrcweir 4728cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 4729cdf0e10cSrcweir new ScUndoListNames( &rDocShell, 4730cdf0e10cSrcweir ScRange( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab ), 4731cdf0e10cSrcweir pUndoDoc, pRedoDoc ) ); 4732cdf0e10cSrcweir } 4733cdf0e10cSrcweir 4734cdf0e10cSrcweir if (!AdjustRowHeight(ScRange(0,nStartRow,nTab,MAXCOL,nEndRow,nTab))) 4735cdf0e10cSrcweir rDocShell.PostPaint( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab, PAINT_GRID ); 4736cdf0e10cSrcweir //! rDocShell.UpdateOle(GetViewData()); 4737cdf0e10cSrcweir aModificator.SetDocumentModified(); 4738cdf0e10cSrcweir bDone = sal_True; 4739cdf0e10cSrcweir } 4740cdf0e10cSrcweir else if (!bApi) 4741cdf0e10cSrcweir rDocShell.ErrorMessage(aTester.GetMessageId()); 4742cdf0e10cSrcweir } 4743cdf0e10cSrcweir return bDone; 4744cdf0e10cSrcweir } 4745cdf0e10cSrcweir 4746cdf0e10cSrcweir //------------------------------------------------------------------------ 4747cdf0e10cSrcweir 4748cdf0e10cSrcweir sal_Bool ScDocFunc::ResizeMatrix( const ScRange& rOldRange, const ScAddress& rNewEnd, sal_Bool bApi ) 4749cdf0e10cSrcweir { 4750cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4751cdf0e10cSrcweir SCCOL nStartCol = rOldRange.aStart.Col(); 4752cdf0e10cSrcweir SCROW nStartRow = rOldRange.aStart.Row(); 4753cdf0e10cSrcweir SCTAB nTab = rOldRange.aStart.Tab(); 4754cdf0e10cSrcweir 4755cdf0e10cSrcweir sal_Bool bUndo(pDoc->IsUndoEnabled()); 4756cdf0e10cSrcweir 4757cdf0e10cSrcweir sal_Bool bRet = sal_False; 4758cdf0e10cSrcweir 4759cdf0e10cSrcweir String aFormula; 4760cdf0e10cSrcweir pDoc->GetFormula( nStartCol, nStartRow, nTab, aFormula ); 4761cdf0e10cSrcweir if ( aFormula.GetChar(0) == '{' && aFormula.GetChar(aFormula.Len()-1) == '}' ) 4762cdf0e10cSrcweir { 4763cdf0e10cSrcweir String aUndo = ScGlobal::GetRscString( STR_UNDO_RESIZEMATRIX ); 4764cdf0e10cSrcweir if (bUndo) 4765cdf0e10cSrcweir rDocShell.GetUndoManager()->EnterListAction( aUndo, aUndo ); 4766cdf0e10cSrcweir 4767cdf0e10cSrcweir aFormula.Erase(0,1); 4768cdf0e10cSrcweir aFormula.Erase(aFormula.Len()-1,1); 4769cdf0e10cSrcweir 4770cdf0e10cSrcweir ScMarkData aMark; 4771cdf0e10cSrcweir aMark.SetMarkArea( rOldRange ); 4772cdf0e10cSrcweir aMark.SelectTable( nTab, sal_True ); 4773cdf0e10cSrcweir ScRange aNewRange( rOldRange.aStart, rNewEnd ); 4774cdf0e10cSrcweir 4775cdf0e10cSrcweir if ( DeleteContents( aMark, IDF_CONTENTS, sal_True, bApi ) ) 4776cdf0e10cSrcweir { 4777cdf0e10cSrcweir // GRAM_PODF_A1 for API compatibility. 4778cdf0e10cSrcweir bRet = EnterMatrix( aNewRange, &aMark, NULL, aFormula, bApi, sal_False, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 ); 4779cdf0e10cSrcweir if (!bRet) 4780cdf0e10cSrcweir { 4781cdf0e10cSrcweir // versuchen, alten Zustand wiederherzustellen 4782cdf0e10cSrcweir EnterMatrix( rOldRange, &aMark, NULL, aFormula, bApi, sal_False, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 ); 4783cdf0e10cSrcweir } 4784cdf0e10cSrcweir } 4785cdf0e10cSrcweir 4786cdf0e10cSrcweir if (bUndo) 4787cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); 4788cdf0e10cSrcweir } 4789cdf0e10cSrcweir 4790cdf0e10cSrcweir return bRet; 4791cdf0e10cSrcweir } 4792cdf0e10cSrcweir 4793cdf0e10cSrcweir //------------------------------------------------------------------------ 4794cdf0e10cSrcweir 4795cdf0e10cSrcweir sal_Bool ScDocFunc::InsertAreaLink( const String& rFile, const String& rFilter, 4796cdf0e10cSrcweir const String& rOptions, const String& rSource, 4797cdf0e10cSrcweir const ScRange& rDestRange, sal_uLong nRefresh, 4798cdf0e10cSrcweir sal_Bool bFitBlock, sal_Bool bApi ) 4799cdf0e10cSrcweir { 4800cdf0e10cSrcweir //! auch fuer ScViewFunc::InsertAreaLink benutzen! 4801cdf0e10cSrcweir 4802cdf0e10cSrcweir ScDocument* pDoc = rDocShell.GetDocument(); 4803cdf0e10cSrcweir sal_Bool bUndo (pDoc->IsUndoEnabled()); 4804cdf0e10cSrcweir 4805cdf0e10cSrcweir sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager(); 4806cdf0e10cSrcweir 4807cdf0e10cSrcweir // #i52120# if other area links exist at the same start position, 4808cdf0e10cSrcweir // remove them first (file format specifies only one link definition 4809cdf0e10cSrcweir // for a cell) 4810cdf0e10cSrcweir 4811cdf0e10cSrcweir sal_uInt16 nLinkCount = pLinkManager->GetLinks().Count(); 4812cdf0e10cSrcweir sal_uInt16 nRemoved = 0; 4813cdf0e10cSrcweir sal_uInt16 nLinkPos = 0; 4814cdf0e10cSrcweir while (nLinkPos<nLinkCount) 4815cdf0e10cSrcweir { 4816cdf0e10cSrcweir ::sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[nLinkPos]; 4817cdf0e10cSrcweir if ( pBase->ISA(ScAreaLink) && 4818cdf0e10cSrcweir static_cast<ScAreaLink*>(pBase)->GetDestArea().aStart == rDestRange.aStart ) 4819cdf0e10cSrcweir { 4820cdf0e10cSrcweir if ( bUndo ) 4821cdf0e10cSrcweir { 4822cdf0e10cSrcweir if ( !nRemoved ) 4823cdf0e10cSrcweir { 4824cdf0e10cSrcweir // group all remove and the insert action 4825cdf0e10cSrcweir String aUndo = ScGlobal::GetRscString( STR_UNDO_INSERTAREALINK ); 4826cdf0e10cSrcweir rDocShell.GetUndoManager()->EnterListAction( aUndo, aUndo ); 4827cdf0e10cSrcweir } 4828cdf0e10cSrcweir 4829cdf0e10cSrcweir ScAreaLink* pOldArea = static_cast<ScAreaLink*>(pBase); 4830cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( 4831cdf0e10cSrcweir new ScUndoRemoveAreaLink( &rDocShell, 4832cdf0e10cSrcweir pOldArea->GetFile(), pOldArea->GetFilter(), pOldArea->GetOptions(), 4833cdf0e10cSrcweir pOldArea->GetSource(), pOldArea->GetDestArea(), pOldArea->GetRefreshDelay() ) ); 4834cdf0e10cSrcweir } 4835cdf0e10cSrcweir pLinkManager->Remove( pBase ); 4836cdf0e10cSrcweir nLinkCount = pLinkManager->GetLinks().Count(); 4837cdf0e10cSrcweir ++nRemoved; 4838cdf0e10cSrcweir } 4839cdf0e10cSrcweir else 4840cdf0e10cSrcweir ++nLinkPos; 4841cdf0e10cSrcweir } 4842cdf0e10cSrcweir 4843cdf0e10cSrcweir String aFilterName = rFilter; 4844cdf0e10cSrcweir String aNewOptions = rOptions; 4845cdf0e10cSrcweir if (!aFilterName.Len()) 4846cdf0e10cSrcweir ScDocumentLoader::GetFilterName( rFile, aFilterName, aNewOptions, sal_True, !bApi ); 4847cdf0e10cSrcweir 4848cdf0e10cSrcweir // remove application prefix from filter name here, so the filter options 4849cdf0e10cSrcweir // aren't reset when the filter name is changed in ScAreaLink::DataChanged 4850cdf0e10cSrcweir ScDocumentLoader::RemoveAppPrefix( aFilterName ); 4851cdf0e10cSrcweir 4852cdf0e10cSrcweir ScAreaLink* pLink = new ScAreaLink( &rDocShell, rFile, aFilterName, 4853cdf0e10cSrcweir aNewOptions, rSource, rDestRange, nRefresh ); 4854cdf0e10cSrcweir pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, rFile, &aFilterName, &rSource ); 4855cdf0e10cSrcweir 4856cdf0e10cSrcweir // Undo fuer den leeren Link 4857cdf0e10cSrcweir 4858cdf0e10cSrcweir if (bUndo) 4859cdf0e10cSrcweir { 4860cdf0e10cSrcweir rDocShell.GetUndoManager()->AddUndoAction( new ScUndoInsertAreaLink( &rDocShell, 4861cdf0e10cSrcweir rFile, aFilterName, aNewOptions, 4862cdf0e10cSrcweir rSource, rDestRange, nRefresh ) ); 4863cdf0e10cSrcweir if ( nRemoved ) 4864cdf0e10cSrcweir rDocShell.GetUndoManager()->LeaveListAction(); // undo for link update is still separate 4865cdf0e10cSrcweir } 4866cdf0e10cSrcweir 4867cdf0e10cSrcweir // Update hat sein eigenes Undo 4868cdf0e10cSrcweir if (pDoc->IsExecuteLinkEnabled()) 4869cdf0e10cSrcweir { 4870cdf0e10cSrcweir pLink->SetDoInsert(bFitBlock); // beim ersten Update ggf. nichts einfuegen 4871cdf0e10cSrcweir pLink->Update(); // kein SetInCreate -> Update ausfuehren 4872cdf0e10cSrcweir } 4873cdf0e10cSrcweir pLink->SetDoInsert(sal_True); // Default = sal_True 4874cdf0e10cSrcweir 4875cdf0e10cSrcweir SfxBindings* pBindings = rDocShell.GetViewBindings(); 4876cdf0e10cSrcweir if (pBindings) 4877cdf0e10cSrcweir pBindings->Invalidate( SID_LINKS ); 4878cdf0e10cSrcweir 4879cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); // Navigator 4880cdf0e10cSrcweir 4881cdf0e10cSrcweir return sal_True; 4882cdf0e10cSrcweir } 4883cdf0e10cSrcweir 4884*0ba51277Smseidel /* vim: set noet sw=4 ts=4: */ 4885