1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sc.hxx" 26 27 28 #include <com/sun/star/embed/XEmbeddedObject.hpp> 29 #include <com/sun/star/frame/XComponentLoader.hpp> 30 31 32 using namespace ::com::sun::star; 33 34 // INCLUDE --------------------------------------------------------------- 35 #include <math.h> // prevent conflict between exception and std::exception 36 37 #include "scitems.hxx" 38 #include <sfx2/fcontnr.hxx> 39 #include <editeng/eeitem.hxx> 40 #include <sfx2/objface.hxx> 41 #include <sfx2/app.hxx> 42 #include <sfx2/bindings.hxx> 43 #include <sfx2/docfile.hxx> 44 #include <sfx2/docfilt.hxx> 45 #include <svtools/ehdl.hxx> 46 #include <basic/sbxcore.hxx> 47 #include <sfx2/printer.hxx> 48 #include <sfx2/request.hxx> 49 #include <svtools/sfxecode.hxx> 50 #include <svx/ofaitem.hxx> 51 #include <sot/formats.hxx> 52 #include <svl/whiter.hxx> 53 #include <vcl/msgbox.hxx> 54 #include <vcl/waitobj.hxx> 55 #include <tools/multisel.hxx> 56 #include <svx/dataaccessdescriptor.hxx> 57 #include <svx/drawitem.hxx> 58 #include <svx/fmview.hxx> 59 #include <svx/pageitem.hxx> 60 #include <svx/svditer.hxx> 61 #include <svx/svdpage.hxx> 62 #include <svx/fmshell.hxx> 63 #include <svtools/xwindowitem.hxx> 64 #include <sfx2/passwd.hxx> 65 #include <sfx2/filedlghelper.hxx> 66 #include <sfx2/docinsert.hxx> 67 #include <svl/PasswordHelper.hxx> 68 #include <svl/documentlockfile.hxx> 69 #include <svl/sharecontrolfile.hxx> 70 #include <unotools/securityoptions.hxx> 71 72 #include <comphelper/processfactory.hxx> 73 #include "docuno.hxx" 74 75 #include <com/sun/star/sdbc/XResultSet.hpp> 76 #include "docsh.hxx" 77 #include "docshimp.hxx" 78 #include "docfunc.hxx" 79 #include "sc.hrc" 80 #include "stlsheet.hxx" 81 #include "stlpool.hxx" 82 #include "appoptio.hxx" 83 #include "globstr.hrc" 84 #include "global.hxx" 85 //CHINA001 #include "styledlg.hxx" 86 //CHINA001 #include "hfedtdlg.hxx" 87 #include "dbdocfun.hxx" 88 #include "printfun.hxx" // DrawToDev 89 #include "viewdata.hxx" 90 #include "tabvwsh.hxx" 91 #include "impex.hxx" 92 #include "attrib.hxx" 93 //CHINA001 #include "corodlg.hxx" 94 #include "undodat.hxx" 95 #include "autostyl.hxx" 96 #include "undocell.hxx" 97 #include "undotab.hxx" 98 #include "inputhdl.hxx" 99 #include "dbcolect.hxx" 100 #include "servobj.hxx" 101 #include "rangenam.hxx" 102 #include "scmod.hxx" 103 //CHINA001 #include "scendlg.hxx" 104 #include "chgviset.hxx" 105 #include "reffact.hxx" 106 #include "chartlis.hxx" 107 #include "chartpos.hxx" 108 #include "waitoff.hxx" 109 #include "tablink.hxx" // ScDocumentLoader statics 110 #include "drwlayer.hxx" 111 #include "docoptio.hxx" 112 #include "undostyl.hxx" 113 #include "rangeseq.hxx" 114 #include "chgtrack.hxx" 115 #include "printopt.hxx" 116 #include <com/sun/star/document/UpdateDocMode.hpp> 117 #include "scresid.hxx" //add by CHINA001 118 #include "scabstdlg.hxx" //CHINA001 119 #include "externalrefmgr.hxx" 120 #include "sharedocdlg.hxx" 121 #include "conditio.hxx" 122 #include "sheetevents.hxx" 123 124 //------------------------------------------------------------------ 125 126 #define IS_SHARE_HEADER(set) \ 127 ((SfxBoolItem&) \ 128 ((SvxSetItem&)(set).Get(ATTR_PAGE_HEADERSET)).GetItemSet(). \ 129 Get(ATTR_PAGE_SHARED)).GetValue() 130 131 #define IS_SHARE_FOOTER(set) \ 132 ((SfxBoolItem&) \ 133 ((SvxSetItem&)(set).Get(ATTR_PAGE_FOOTERSET)).GetItemSet(). \ 134 Get(ATTR_PAGE_SHARED)).GetValue() 135 136 #define IS_AVAILABLE(WhichId,ppItem) \ 137 (pReqArgs->GetItemState((WhichId), sal_True, ppItem ) == SFX_ITEM_SET) 138 139 #define SC_PREVIEW_SIZE_X 10000 140 #define SC_PREVIEW_SIZE_Y 12400 141 142 143 //------------------------------------------------------------------ 144 145 void ScDocShell::Execute( SfxRequest& rReq ) 146 { 147 // SID_SC_RANGE (Range), 148 // SID_SC_CELLTEXT (CellText), 149 // SID_SC_CELLS (Cells) - removed (old Basic) 150 151 const SfxItemSet* pReqArgs = rReq.GetArgs(); 152 SfxBindings* pBindings = GetViewBindings(); 153 sal_Bool bUndo (aDocument.IsUndoEnabled()); 154 155 sal_uInt16 nSlot = rReq.GetSlot(); 156 switch ( nSlot ) 157 { 158 case SID_SC_SETTEXT: 159 { 160 const SfxPoolItem* pColItem; 161 const SfxPoolItem* pRowItem; 162 const SfxPoolItem* pTabItem; 163 const SfxPoolItem* pTextItem; 164 if( pReqArgs && IS_AVAILABLE( FN_PARAM_1, &pColItem ) && 165 IS_AVAILABLE( FN_PARAM_2, &pRowItem ) && 166 IS_AVAILABLE( FN_PARAM_3, &pTabItem ) && 167 IS_AVAILABLE( SID_SC_SETTEXT, &pTextItem ) ) 168 { 169 // Parameter sind 1-based !!! 170 SCCOL nCol = ((SfxInt16Item*)pColItem)->GetValue() - 1; 171 SCROW nRow = ((SfxInt32Item*)pRowItem)->GetValue() - 1; 172 SCTAB nTab = ((SfxInt16Item*)pTabItem)->GetValue() - 1; 173 174 SCTAB nTabCount = aDocument.GetTableCount(); 175 if ( ValidCol(nCol) && ValidRow(nRow) && ValidTab(nTab,nTabCount) ) 176 { 177 if ( aDocument.IsBlockEditable( nTab, nCol,nRow, nCol, nRow ) ) 178 { 179 String aVal = ((const SfxStringItem*)pTextItem)->GetValue(); 180 aDocument.SetString( nCol, nRow, nTab, aVal ); 181 182 PostPaintCell( nCol, nRow, nTab ); 183 SetDocumentModified(); 184 185 rReq.Done(); 186 break; 187 } 188 else // geschuetzte Zelle 189 { 190 SbxBase::SetError( SbxERR_BAD_PARAMETER ); //! welchen Fehler ? 191 break; 192 } 193 } 194 } 195 SbxBase::SetError( SbxERR_NO_OBJECT ); 196 } 197 break; 198 199 case SID_SBA_IMPORT: 200 { 201 if (pReqArgs) 202 { 203 const SfxPoolItem* pItem; 204 svx::ODataAccessDescriptor aDesc; 205 if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET ) 206 { 207 uno::Any aAny = static_cast<const SfxUsrAnyItem*>(pItem)->GetValue(); 208 uno::Sequence<beans::PropertyValue> aProperties; 209 if ( aAny >>= aProperties ) 210 aDesc.initializeFrom( aProperties ); 211 } 212 213 String sTarget; 214 if ( pReqArgs->GetItemState( FN_PARAM_1, sal_True, &pItem ) == SFX_ITEM_SET ) 215 sTarget = ((const SfxStringItem*)pItem)->GetValue(); 216 217 sal_Bool bIsNewArea = sal_True; // Default sal_True (keine Nachfrage) 218 if ( pReqArgs->GetItemState( FN_PARAM_2, sal_True, &pItem ) == SFX_ITEM_SET ) 219 bIsNewArea = ((const SfxBoolItem*)pItem)->GetValue(); 220 221 // bei Bedarf neuen Datenbankbereich anlegen 222 sal_Bool bMakeArea = sal_False; 223 if (bIsNewArea) 224 { 225 ScDBCollection* pDBColl = aDocument.GetDBCollection(); 226 sal_uInt16 nDummy; 227 if ( !pDBColl || !pDBColl->SearchName( sTarget, nDummy ) ) 228 { 229 ScAddress aPos; 230 if ( aPos.Parse( sTarget, &aDocument, aDocument.GetAddressConvention() ) & SCA_VALID ) 231 { 232 bMakeArea = sal_True; 233 if (bUndo) 234 { 235 String aStrImport = ScGlobal::GetRscString( STR_UNDO_IMPORTDATA ); 236 GetUndoManager()->EnterListAction( aStrImport, aStrImport ); 237 } 238 239 ScDBData* pDBData = GetDBData( ScRange(aPos), SC_DB_IMPORT, SC_DBSEL_KEEP ); 240 DBG_ASSERT(pDBData, "kann DB-Daten nicht anlegen"); 241 sTarget = pDBData->GetName(); 242 } 243 } 244 } 245 246 // nachfragen, bevor alter DB-Bereich ueberschrieben wird 247 sal_Bool bDo = sal_True; 248 if (!bIsNewArea) 249 { 250 String aTemplate = ScGlobal::GetRscString( STR_IMPORT_REPLACE ); 251 String aMessage = aTemplate.GetToken( 0, '#' ); 252 aMessage += sTarget; 253 aMessage += aTemplate.GetToken( 1, '#' ); 254 255 QueryBox aBox( 0, WinBits(WB_YES_NO | WB_DEF_YES), aMessage ); 256 bDo = ( aBox.Execute() == RET_YES ); 257 } 258 259 if (bDo) 260 { 261 ScDBDocFunc(*this).UpdateImport( sTarget, aDesc ); 262 rReq.Done(); 263 264 // UpdateImport aktualisiert auch die internen Operationen 265 } 266 else 267 rReq.Ignore(); 268 269 if ( bMakeArea && bUndo) 270 GetUndoManager()->LeaveListAction(); 271 } 272 else 273 { 274 DBG_ERROR( "arguments expected" ); 275 } 276 } 277 break; 278 279 case SID_CHART_SOURCE: 280 case SID_CHART_ADDSOURCE: 281 if (pReqArgs) 282 { 283 ScDocument* pDoc = GetDocument(); 284 // sal_Bool bUndo (pDoc->IsUndoEnabled()); 285 const SfxPoolItem* pItem; 286 String aChartName, aRangeName; 287 288 ScRange aSingleRange; 289 ScRangeListRef aRangeListRef; 290 sal_Bool bMultiRange = sal_False; 291 292 sal_Bool bColHeaders = sal_True; 293 sal_Bool bRowHeaders = sal_True; 294 sal_Bool bColInit = sal_False; 295 sal_Bool bRowInit = sal_False; 296 sal_Bool bAddRange = (nSlot == SID_CHART_ADDSOURCE); 297 298 if( IS_AVAILABLE( SID_CHART_NAME, &pItem ) ) 299 aChartName = ((const SfxStringItem*)pItem)->GetValue(); 300 301 if( IS_AVAILABLE( SID_CHART_SOURCE, &pItem ) ) 302 aRangeName = ((const SfxStringItem*)pItem)->GetValue(); 303 304 if( IS_AVAILABLE( FN_PARAM_1, &pItem ) ) 305 { 306 bColHeaders = ((const SfxBoolItem*)pItem)->GetValue(); 307 bColInit = sal_True; 308 } 309 if( IS_AVAILABLE( FN_PARAM_2, &pItem ) ) 310 { 311 bRowHeaders = ((const SfxBoolItem*)pItem)->GetValue(); 312 bRowInit = sal_True; 313 } 314 315 ScAddress::Details aDetails(pDoc->GetAddressConvention(), 0, 0); 316 sal_Bool bValid = ( aSingleRange.ParseAny( aRangeName, pDoc, aDetails ) & SCA_VALID ) != 0; 317 if (!bValid) 318 { 319 aRangeListRef = new ScRangeList; 320 aRangeListRef->Parse( aRangeName, pDoc ); 321 if ( aRangeListRef->Count() ) 322 { 323 bMultiRange = sal_True; 324 aSingleRange = *aRangeListRef->GetObject(0); // fuer Header 325 bValid = sal_True; 326 } 327 else 328 aRangeListRef.Clear(); 329 } 330 331 ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell(); 332 if (pViewSh && bValid && aChartName.Len() != 0 ) 333 { 334 Window* pParent = pViewSh->GetDialogParent(); 335 336 SCCOL nCol1 = aSingleRange.aStart.Col(); 337 SCROW nRow1 = aSingleRange.aStart.Row(); 338 SCCOL nCol2 = aSingleRange.aEnd.Col(); 339 SCROW nRow2 = aSingleRange.aEnd.Row(); 340 SCTAB nTab = aSingleRange.aStart.Tab(); 341 342 //! immer oder gar nicht begrenzen ??? 343 if (!bMultiRange) 344 aDocument.LimitChartArea( nTab, nCol1,nRow1, nCol2,nRow2 ); 345 346 // Dialog fuer Spalten/Zeilenkoepfe 347 sal_Bool bOk = sal_True; 348 if ( !bAddRange && ( !bColInit || !bRowInit ) ) 349 { 350 ScChartPositioner aChartPositioner( &aDocument, nTab, nCol1,nRow1, nCol2,nRow2 ); 351 if (!bColInit) 352 bColHeaders = aChartPositioner.HasColHeaders(); 353 if (!bRowInit) 354 bRowHeaders = aChartPositioner.HasRowHeaders(); 355 356 //CHINA001 ScColRowLabelDlg aDlg( pParent, bRowHeaders, bColHeaders ); 357 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 358 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 359 360 AbstractScColRowLabelDlg* pDlg = pFact->CreateScColRowLabelDlg( pParent, RID_SCDLG_CHARTCOLROW, bRowHeaders, bColHeaders); 361 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 362 if ( pDlg->Execute() == RET_OK ) //CHINA001 if ( aDlg.Execute() == RET_OK ) 363 { 364 bColHeaders = pDlg->IsRow(); //CHINA001 bColHeaders = aDlg.IsRow(); // Spaltenkoepfe = 1. Zeile 365 bRowHeaders = pDlg->IsCol(); //CHINA001 bRowHeaders = aDlg.IsCol(); 366 367 rReq.AppendItem(SfxBoolItem(FN_PARAM_1, bColHeaders)); 368 rReq.AppendItem(SfxBoolItem(FN_PARAM_2, bRowHeaders)); 369 } 370 else 371 bOk = sal_False; 372 delete pDlg; //CHINA001 373 } 374 375 if (bOk) // ausfuehren 376 { 377 if (bMultiRange) 378 { 379 if (bUndo) 380 { 381 GetUndoManager()->AddUndoAction( 382 new ScUndoChartData( this, aChartName, aRangeListRef, 383 bColHeaders, bRowHeaders, bAddRange ) ); 384 } 385 aDocument.UpdateChartArea( aChartName, aRangeListRef, 386 bColHeaders, bRowHeaders, bAddRange ); 387 } 388 else 389 { 390 ScRange aNewRange( nCol1,nRow1,nTab, nCol2,nRow2,nTab ); 391 if (bUndo) 392 { 393 GetUndoManager()->AddUndoAction( 394 new ScUndoChartData( this, aChartName, aNewRange, 395 bColHeaders, bRowHeaders, bAddRange ) ); 396 } 397 aDocument.UpdateChartArea( aChartName, aNewRange, 398 bColHeaders, bRowHeaders, bAddRange ); 399 } 400 } 401 } 402 else 403 { 404 DBG_ERROR("UpdateChartArea: keine ViewShell oder falsche Daten"); 405 } 406 rReq.Done(); 407 } 408 else 409 { 410 DBG_ERROR("SID_CHART_SOURCE ohne Argumente"); 411 } 412 break; 413 414 case FID_AUTO_CALC: 415 { 416 sal_Bool bNewVal; 417 const SfxPoolItem* pItem; 418 if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( nSlot, sal_True, &pItem ) ) 419 bNewVal = ((const SfxBoolItem*)pItem)->GetValue(); 420 else 421 bNewVal = !aDocument.GetAutoCalc(); // Toggle fuer Menue 422 aDocument.SetAutoCalc( bNewVal ); 423 SetDocumentModified(); 424 if (pBindings) 425 { 426 pBindings->Invalidate( FID_AUTO_CALC ); 427 // pBindings->Invalidate( FID_RECALC ); // jetzt immer enabled 428 } 429 rReq.AppendItem( SfxBoolItem( FID_AUTO_CALC, bNewVal ) ); 430 rReq.Done(); 431 } 432 break; 433 case FID_RECALC: 434 DoRecalc( rReq.IsAPI() ); 435 rReq.Done(); 436 break; 437 case FID_HARD_RECALC: 438 DoHardRecalc( rReq.IsAPI() ); 439 rReq.Done(); 440 break; 441 case SID_UPDATETABLINKS: 442 { 443 ScDocument* pDoc = GetDocument(); 444 445 ScLkUpdMode nSet=pDoc->GetLinkMode(); 446 447 sal_uInt16 nDlgRet=RET_NO; 448 if(nSet==LM_UNKNOWN) 449 { 450 ScAppOptions aAppOptions=SC_MOD()->GetAppOptions(); 451 nSet=aAppOptions.GetLinkMode(); 452 } 453 454 if (nCanUpdate == com::sun::star::document::UpdateDocMode::NO_UPDATE) 455 nSet = LM_NEVER; 456 else if (nCanUpdate == com::sun::star::document::UpdateDocMode::FULL_UPDATE) 457 nSet = LM_ALWAYS; 458 459 if (nSet == LM_ALWAYS && !(SvtSecurityOptions().GetMacroSecurityLevel() == 0)) 460 nSet = LM_ON_DEMAND; 461 if (nCanUpdate == com::sun::star::document::UpdateDocMode::QUIET_UPDATE && 462 nSet == LM_ON_DEMAND) 463 nSet = LM_NEVER; 464 465 if(nSet==LM_ON_DEMAND) 466 { 467 QueryBox aBox( GetActiveDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES), 468 ScGlobal::GetRscString(STR_RELOAD_TABLES) ); 469 470 nDlgRet=aBox.Execute(); 471 } 472 473 if (nDlgRet == RET_YES || nSet==LM_ALWAYS) 474 { 475 ReloadTabLinks(); 476 aDocument.UpdateExternalRefLinks(); 477 aDocument.UpdateDdeLinks(); 478 aDocument.UpdateAreaLinks(); 479 480 //! Test, ob Fehler 481 rReq.Done(); 482 } 483 else 484 rReq.Ignore(); 485 } 486 break; 487 488 case SID_REIMPORT_AFTER_LOAD: 489 { 490 // wird nach dem Laden aufgerufen, wenn DB-Bereiche mit 491 // weggelassenen Daten enthalten sind 492 493 sal_Bool bDone = sal_False; 494 ScDBCollection* pDBColl = aDocument.GetDBCollection(); 495 496 if ((nCanUpdate != com::sun::star::document::UpdateDocMode::NO_UPDATE) && 497 (nCanUpdate != com::sun::star::document::UpdateDocMode::QUIET_UPDATE)) 498 { 499 ScRange aRange; 500 ScTabViewShell* pViewSh = GetBestViewShell(); 501 DBG_ASSERT(pViewSh,"SID_REIMPORT_AFTER_LOAD: keine View"); 502 if (pViewSh && pDBColl) 503 { 504 QueryBox aBox( GetActiveDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES), 505 ScGlobal::GetRscString(STR_REIMPORT_AFTER_LOAD) ); 506 if (aBox.Execute() == RET_YES) 507 { 508 for (sal_uInt16 i=0; i<pDBColl->GetCount(); i++) 509 { 510 ScDBData* pDBData = (*pDBColl)[i]; 511 if ( pDBData->IsStripData() && 512 pDBData->HasImportParam() && !pDBData->HasImportSelection() ) 513 { 514 pDBData->GetArea(aRange); 515 pViewSh->MarkRange(aRange); 516 517 // Import und interne Operationen wie SID_REFRESH_DBAREA 518 // (Abfrage auf Import hier nicht noetig) 519 520 ScImportParam aImportParam; 521 pDBData->GetImportParam( aImportParam ); 522 sal_Bool bContinue = pViewSh->ImportData( aImportParam ); 523 pDBData->SetImportParam( aImportParam ); 524 525 // markieren (Groesse kann sich geaendert haben) 526 pDBData->GetArea(aRange); 527 pViewSh->MarkRange(aRange); 528 529 if ( bContinue ) // #41905# Fehler beim Import -> Abbruch 530 { 531 // interne Operationen, wenn welche gespeichert 532 533 if ( pDBData->HasQueryParam() || pDBData->HasSortParam() || 534 pDBData->HasSubTotalParam() ) 535 pViewSh->RepeatDB(); 536 537 // Pivottabellen die den Bereich als Quelldaten haben 538 539 RefreshPivotTables(aRange); 540 } 541 } 542 } 543 bDone = sal_True; 544 } 545 } 546 } 547 548 if ( !bDone && pDBColl ) 549 { 550 // wenn nicht, dann aber die abhaengigen Formeln updaten 551 //! auch fuer einzelne Bereiche, die nicht aktualisiert werden koennen 552 553 aDocument.CalcAll(); //! nur die abhaengigen 554 PostDataChanged(); 555 } 556 557 if (bDone) 558 rReq.Done(); 559 else 560 rReq.Ignore(); 561 } 562 break; 563 564 565 case SID_AUTO_STYLE: 566 DBG_ERROR("use ScAutoStyleHint instead of SID_AUTO_STYLE"); 567 break; 568 569 case SID_GET_COLORTABLE: 570 { 571 // passende ColorTable ist per PutItem gesetzt worden 572 const SvxColorTableItem* pColItem = static_cast< const SvxColorTableItem* >(GetItem(SID_COLOR_TABLE)); 573 XColorListSharedPtr aTable = pColItem->GetColorTable(); 574 575 rReq.SetReturnValue(SvxColorTableItem(aTable, SID_GET_COLORTABLE)); 576 } 577 break; 578 579 case FID_CHG_RECORD: 580 { 581 ScDocument* pDoc = GetDocument(); 582 if(pDoc!=NULL) 583 { 584 // get argument (recorded macro) 585 SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FID_CHG_RECORD, sal_False ); 586 sal_Bool bDo = sal_True; 587 588 // xmlsec05/06: 589 // getting real parent window when called from Security-Options TP 590 Window* pParent = NULL; 591 const SfxPoolItem* pParentItem; 592 if( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( SID_ATTR_XWINDOW, sal_False, &pParentItem ) ) 593 pParent = ( ( const XWindowItem* ) pParentItem )->GetWindowPtr(); 594 595 // desired state 596 ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack(); 597 sal_Bool bActivateTracking = (pChangeTrack == 0); // toggle 598 if ( pItem ) 599 bActivateTracking = pItem->GetValue(); // from argument 600 601 if ( !bActivateTracking ) 602 { 603 if ( !pItem ) 604 { 605 // no dialog on playing the macro 606 WarningBox aBox( pParent ? pParent : GetActiveDialogParent(), 607 WinBits(WB_YES_NO | WB_DEF_NO), 608 ScGlobal::GetRscString( STR_END_REDLINING ) ); 609 bDo = ( aBox.Execute() == RET_YES ); 610 } 611 612 if ( bDo ) 613 { 614 if ( pChangeTrack->IsProtected() ) 615 bDo = ExecuteChangeProtectionDialog( NULL ); 616 if ( bDo ) 617 { 618 pDoc->EndChangeTracking(); 619 PostPaintGridAll(); 620 } 621 } 622 } 623 else 624 { 625 pDoc->StartChangeTracking(); 626 ScChangeViewSettings aChangeViewSet; 627 aChangeViewSet.SetShowChanges(sal_True); 628 pDoc->SetChangeViewSettings(aChangeViewSet); 629 } 630 631 if ( bDo ) 632 { 633 UpdateAcceptChangesDialog(); 634 635 // Slots invalidieren 636 if (pBindings) 637 pBindings->InvalidateAll(sal_False); 638 if ( !pItem ) 639 rReq.AppendItem( SfxBoolItem( FID_CHG_RECORD, bActivateTracking ) ); 640 rReq.Done(); 641 } 642 else 643 rReq.Ignore(); 644 } 645 } 646 break; 647 648 case SID_CHG_PROTECT : 649 { 650 Window* pParent = NULL; 651 const SfxPoolItem* pParentItem; 652 if( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( SID_ATTR_XWINDOW, sal_False, &pParentItem ) ) 653 pParent = ( ( const XWindowItem* ) pParentItem )->GetWindowPtr(); 654 if ( ExecuteChangeProtectionDialog( pParent ) ) 655 { 656 rReq.Done(); 657 SetDocumentModified(); 658 } 659 else 660 rReq.Ignore(); 661 } 662 break; 663 664 case SID_DOCUMENT_MERGE: 665 case SID_DOCUMENT_COMPARE: 666 { 667 sal_Bool bDo = sal_True; 668 ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack(); 669 if ( pChangeTrack && !pImpl->bIgnoreLostRedliningWarning ) 670 { 671 if ( nSlot == SID_DOCUMENT_COMPARE ) 672 { //! old changes trace will be lost 673 WarningBox aBox( GetActiveDialogParent(), 674 WinBits(WB_YES_NO | WB_DEF_NO), 675 ScGlobal::GetRscString( STR_END_REDLINING ) ); 676 if( aBox.Execute() == RET_YES ) 677 bDo = ExecuteChangeProtectionDialog( NULL, sal_True ); 678 else 679 bDo = sal_False; 680 } 681 else // merge might reject some actions 682 bDo = ExecuteChangeProtectionDialog( NULL, sal_True ); 683 } 684 if ( !bDo ) 685 { 686 rReq.Ignore(); 687 break; 688 } 689 SfxApplication* pApp = SFX_APP(); 690 const SfxPoolItem* pItem; 691 SfxMedium* pMed = NULL; 692 if ( pReqArgs && 693 pReqArgs->GetItemState( SID_FILE_NAME, sal_True, &pItem ) == SFX_ITEM_SET && 694 pItem->ISA(SfxStringItem) ) 695 { 696 String aFileName = ((const SfxStringItem*)pItem)->GetValue(); 697 698 String aFilterName; 699 if ( pReqArgs->GetItemState( SID_FILTER_NAME, sal_True, &pItem ) == SFX_ITEM_SET && 700 pItem->ISA(SfxStringItem) ) 701 { 702 aFilterName = ((const SfxStringItem*)pItem)->GetValue(); 703 } 704 String aOptions; 705 if ( pReqArgs->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) == SFX_ITEM_SET && 706 pItem->ISA(SfxStringItem) ) 707 { 708 aOptions = ((const SfxStringItem*)pItem)->GetValue(); 709 } 710 short nVersion = 0; 711 if ( pReqArgs->GetItemState( SID_VERSION, sal_True, &pItem ) == SFX_ITEM_SET && 712 pItem->ISA(SfxInt16Item) ) 713 { 714 nVersion = ((const SfxInt16Item*)pItem)->GetValue(); 715 } 716 717 // kein Filter angegeben -> Detection 718 if ( !aFilterName.Len() ) 719 ScDocumentLoader::GetFilterName( aFileName, aFilterName, aOptions, sal_True, sal_False ); 720 721 // filter name from dialog contains application prefix, 722 // GetFilter needs name without the prefix. 723 ScDocumentLoader::RemoveAppPrefix( aFilterName ); 724 725 const SfxFilter* pFilter = ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName( aFilterName ); 726 SfxItemSet* pSet = new SfxAllItemSet( pApp->GetPool() ); 727 if ( aOptions.Len() ) 728 pSet->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, aOptions ) ); 729 if ( nVersion != 0 ) 730 pSet->Put( SfxInt16Item( SID_VERSION, nVersion ) ); 731 pMed = new SfxMedium( aFileName, STREAM_STD_READ, sal_False, pFilter, pSet ); 732 } 733 else 734 { 735 // start file dialog asynchronous 736 pImpl->bIgnoreLostRedliningWarning = true; 737 delete pImpl->pRequest; 738 pImpl->pRequest = new SfxRequest( rReq ); 739 delete pImpl->pDocInserter; 740 pImpl->pDocInserter = new ::sfx2::DocumentInserter( 741 0, String::CreateFromAscii( ScDocShell::Factory().GetShortName() ), 0 ); 742 pImpl->pDocInserter->StartExecuteModal( LINK( this, ScDocShell, DialogClosedHdl ) ); 743 return ; 744 } 745 746 if ( pMed ) // nun wirklich ausfuehren... 747 { 748 SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, pMed->GetName() ); 749 750 // pOtherDocSh->DoClose() will be called explicitly later, but it is still more safe to use SfxObjectShellLock here 751 ScDocShell* pOtherDocSh = new ScDocShell; 752 SfxObjectShellLock aDocShTablesRef = pOtherDocSh; 753 pOtherDocSh->DoLoad( pMed ); 754 sal_uLong nErr = pOtherDocSh->GetErrorCode(); 755 if (nErr) 756 ErrorHandler::HandleError( nErr ); // auch Warnings 757 758 if ( !pOtherDocSh->GetError() ) // nur Errors 759 { 760 sal_Bool bHadTrack = ( aDocument.GetChangeTrack() != NULL ); 761 sal_uLong nStart = 0; 762 if ( nSlot == SID_DOCUMENT_MERGE && pChangeTrack ) 763 { 764 nStart = pChangeTrack->GetActionMax() + 1; 765 } 766 767 if ( nSlot == SID_DOCUMENT_COMPARE ) 768 CompareDocument( *pOtherDocSh->GetDocument() ); 769 else 770 MergeDocument( *pOtherDocSh->GetDocument() ); 771 772 // show "accept changes" dialog 773 //! get view for this document! 774 if ( !IsDocShared() ) 775 { 776 SfxViewFrame* pViewFrm = SfxViewFrame::Current(); 777 if ( pViewFrm ) 778 { 779 pViewFrm->ShowChildWindow( ScAcceptChgDlgWrapper::GetChildWindowId(), sal_True ); //@51669 780 } 781 if ( pBindings ) 782 { 783 pBindings->Invalidate( FID_CHG_ACCEPT ); 784 } 785 } 786 787 rReq.SetReturnValue( SfxInt32Item( nSlot, 0 ) ); //! ??????? 788 rReq.Done(); 789 790 if (!bHadTrack) // neu eingeschaltet -> auch anzeigen 791 { 792 ScChangeViewSettings* pOldSet = aDocument.GetChangeViewSettings(); 793 if ( !pOldSet || !pOldSet->ShowChanges() ) 794 { 795 ScChangeViewSettings aChangeViewSet; 796 aChangeViewSet.SetShowChanges(sal_True); 797 aDocument.SetChangeViewSettings(aChangeViewSet); 798 } 799 } 800 else if ( nSlot == SID_DOCUMENT_MERGE && IsDocShared() && pChangeTrack ) 801 { 802 sal_uLong nEnd = pChangeTrack->GetActionMax(); 803 if ( nEnd >= nStart ) 804 { 805 // only show changes from merged document 806 ScChangeViewSettings aChangeViewSet; 807 aChangeViewSet.SetShowChanges( sal_True ); 808 aChangeViewSet.SetShowAccepted( sal_True ); 809 aChangeViewSet.SetHasActionRange( true ); 810 aChangeViewSet.SetTheActionRange( nStart, nEnd ); 811 aDocument.SetChangeViewSettings( aChangeViewSet ); 812 813 // update view 814 PostPaintExtras(); 815 PostPaintGridAll(); 816 } 817 } 818 } 819 pOtherDocSh->DoClose(); // delete passiert mit der Ref 820 } 821 } 822 break; 823 824 case SID_DELETE_SCENARIO: 825 if (pReqArgs) 826 { 827 const SfxPoolItem* pItem; 828 if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET ) 829 { 830 if ( pItem->ISA(SfxStringItem) ) 831 { 832 String aName = ((const SfxStringItem*)pItem)->GetValue(); 833 SCTAB nTab; 834 if (aDocument.GetTable( aName, nTab )) 835 { 836 // DeleteTable von viewfunc nach docfunc verschieben! 837 838 ScTabViewShell* pSh = GetBestViewShell(); 839 if ( pSh ) 840 { 841 //! SetTabNo in DeleteTable weglassen? 842 SCTAB nDispTab = pSh->GetViewData()->GetTabNo(); 843 pSh->DeleteTable( nTab ); 844 pSh->SetTabNo(nDispTab); 845 rReq.Done(); 846 } 847 } 848 } 849 } 850 } 851 break; 852 853 case SID_EDIT_SCENARIO: 854 { 855 const SfxPoolItem* pItem; 856 if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET ) 857 { 858 if ( pItem->ISA(SfxStringItem) ) 859 { 860 String aName = ((const SfxStringItem*)pItem)->GetValue(); 861 SCTAB nTab; 862 if (aDocument.GetTable( aName, nTab )) 863 { 864 if (aDocument.IsScenario(nTab)) 865 { 866 String aComment; 867 Color aColor; 868 sal_uInt16 nFlags; 869 aDocument.GetScenarioData( nTab, aComment, aColor, nFlags ); 870 871 // Determine if the Sheet that the Scenario was created on 872 // is protected. But first we need to find that Sheet. 873 // Rewind back to the actual sheet. 874 SCTAB nActualTab = nTab; 875 do 876 { 877 nActualTab--; 878 } 879 while(aDocument.IsScenario(nActualTab)); 880 sal_Bool bSheetProtected = aDocument.IsTabProtected(nActualTab); 881 882 //! anderen Titel am Dialog setzen 883 //CHINA001 ScNewScenarioDlg* pNewDlg = 884 //CHINA001 new ScNewScenarioDlg( GetActiveDialogParent(), aName, sal_True, bSheetProtected); 885 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 886 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 887 888 AbstractScNewScenarioDlg* pNewDlg = pFact->CreateScNewScenarioDlg( GetActiveDialogParent(), aName, RID_SCDLG_NEWSCENARIO, sal_True,bSheetProtected); 889 DBG_ASSERT(pNewDlg, "Dialog create fail!");//CHINA001 890 pNewDlg->SetScenarioData( aName, aComment, aColor, nFlags ); 891 if ( pNewDlg->Execute() == RET_OK ) 892 { 893 pNewDlg->GetScenarioData( aName, aComment, aColor, nFlags ); 894 ModifyScenario( nTab, aName, aComment, aColor, nFlags ); 895 rReq.Done(); 896 } 897 delete pNewDlg; 898 } 899 } 900 } 901 } 902 } 903 break; 904 905 case SID_ATTR_YEAR2000 : 906 { 907 const SfxPoolItem* pItem; 908 if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET ) 909 { 910 if ( pItem->ISA(SfxUInt16Item) ) 911 { 912 sal_uInt16 nY2k = ((SfxUInt16Item*)pItem)->GetValue(); 913 // immer an den DocOptions setzen, damit das auch fuer SO50 914 // gespeichert wird (und alle Abfragen bisher auch darauf laufen). 915 // SetDocOptions propagiert das an den NumberFormatter 916 ScDocOptions aDocOpt( aDocument.GetDocOptions() ); 917 aDocOpt.SetYear2000( nY2k ); 918 aDocument.SetDocOptions( aDocOpt ); 919 // die FormShell soll es mitbekommen 920 ScTabViewShell* pSh = GetBestViewShell(); 921 if ( pSh ) 922 { 923 FmFormShell* pFSh = pSh->GetFormShell(); 924 if ( pFSh ) 925 pFSh->SetY2KState( nY2k ); 926 } 927 } 928 } 929 } 930 break; 931 932 case SID_SHARE_DOC: 933 { 934 ScViewData* pViewData = GetViewData(); 935 if ( !pViewData ) 936 { 937 rReq.Ignore(); 938 break; 939 } 940 941 ScShareDocumentDlg aDlg( GetActiveDialogParent(), pViewData ); 942 if ( aDlg.Execute() == RET_OK ) 943 { 944 bool bSetShared = aDlg.IsShareDocumentChecked(); 945 if ( bSetShared != static_cast< bool >( IsDocShared() ) ) 946 { 947 if ( bSetShared ) 948 { 949 bool bContinue = true; 950 if ( HasName() ) 951 { 952 QueryBox aBox( GetActiveDialogParent(), WinBits( WB_YES_NO | WB_DEF_YES ), 953 ScGlobal::GetRscString( STR_DOC_WILLBESAVED ) ); 954 if ( aBox.Execute() == RET_NO ) 955 { 956 bContinue = false; 957 } 958 } 959 if ( bContinue ) 960 { 961 EnableSharedSettings( true ); 962 963 SC_MOD()->SetInSharedDocSaving( true ); 964 if ( !SwitchToShared( sal_True, sal_True ) ) 965 { 966 // TODO/LATER: what should be done in case the switch has failed? 967 // for example in case the user has cancelled the saveAs operation 968 } 969 970 SC_MOD()->SetInSharedDocSaving( false ); 971 972 InvalidateName(); 973 GetUndoManager()->Clear(); 974 975 ScTabView* pTabView = dynamic_cast< ScTabView* >( pViewData->GetView() ); 976 if ( pTabView ) 977 { 978 pTabView->UpdateLayerLocks(); 979 } 980 } 981 } 982 else 983 { 984 uno::Reference< frame::XModel > xModel; 985 try 986 { 987 // load shared file 988 xModel.set( LoadSharedDocument(), uno::UNO_QUERY_THROW ); 989 uno::Reference< util::XCloseable > xCloseable( xModel, uno::UNO_QUERY_THROW ); 990 991 // check if shared flag is set in shared file 992 bool bShared = false; 993 ScModelObj* pDocObj = ScModelObj::getImplementation( xModel ); 994 if ( pDocObj ) 995 { 996 ScDocShell* pDocShell = dynamic_cast< ScDocShell* >( pDocObj->GetEmbeddedObject() ); 997 if ( pDocShell ) 998 { 999 bShared = pDocShell->HasSharedXMLFlagSet(); 1000 } 1001 } 1002 1003 // #i87870# check if shared status was disabled and enabled again 1004 bool bOwnEntry = false; 1005 try 1006 { 1007 ::svt::ShareControlFile aControlFile( GetSharedFileURL() ); 1008 bOwnEntry = aControlFile.HasOwnEntry(); 1009 } 1010 catch ( uno::Exception& ) 1011 { 1012 } 1013 1014 if ( bShared && bOwnEntry ) 1015 { 1016 uno::Reference< frame::XStorable > xStorable( xModel, uno::UNO_QUERY_THROW ); 1017 if ( xStorable->isReadonly() ) 1018 { 1019 xCloseable->close( sal_True ); 1020 1021 String aUserName( ScGlobal::GetRscString( STR_UNKNOWN_USER ) ); 1022 try 1023 { 1024 ::svt::DocumentLockFile aLockFile( GetSharedFileURL() ); 1025 uno::Sequence< ::rtl::OUString > aData = aLockFile.GetLockData(); 1026 if ( aData.getLength() > LOCKFILE_SYSUSERNAME_ID ) 1027 { 1028 if ( aData[LOCKFILE_OOOUSERNAME_ID].getLength() > 0 ) 1029 { 1030 aUserName = aData[LOCKFILE_OOOUSERNAME_ID]; 1031 } 1032 else if ( aData[LOCKFILE_SYSUSERNAME_ID].getLength() > 0 ) 1033 { 1034 aUserName = aData[LOCKFILE_SYSUSERNAME_ID]; 1035 } 1036 } 1037 } 1038 catch ( uno::Exception& ) 1039 { 1040 } 1041 String aMessage( ScGlobal::GetRscString( STR_FILE_LOCKED_TRY_LATER ) ); 1042 aMessage.SearchAndReplaceAscii( "%1", aUserName ); 1043 1044 WarningBox aBox( GetActiveDialogParent(), WinBits( WB_OK ), aMessage ); 1045 aBox.Execute(); 1046 } 1047 else 1048 { 1049 WarningBox aBox( GetActiveDialogParent(), WinBits( WB_YES_NO | WB_DEF_YES ), 1050 ScGlobal::GetRscString( STR_DOC_DISABLESHARED ) ); 1051 if ( aBox.Execute() == RET_YES ) 1052 { 1053 xCloseable->close( sal_True ); 1054 1055 if ( !SwitchToShared( sal_False, sal_True ) ) 1056 { 1057 // TODO/LATER: what should be done in case the switch has failed? 1058 // for example in case the user has cancelled the saveAs operation 1059 } 1060 1061 EnableSharedSettings( false ); 1062 1063 if ( pBindings ) 1064 { 1065 pBindings->ExecuteSynchron( SID_SAVEDOC ); 1066 } 1067 1068 ScTabView* pTabView = dynamic_cast< ScTabView* >( pViewData->GetView() ); 1069 if ( pTabView ) 1070 { 1071 pTabView->UpdateLayerLocks(); 1072 } 1073 } 1074 else 1075 { 1076 xCloseable->close( sal_True ); 1077 } 1078 } 1079 } 1080 else 1081 { 1082 xCloseable->close( sal_True ); 1083 WarningBox aBox( GetActiveDialogParent(), WinBits( WB_OK ), 1084 ScGlobal::GetRscString( STR_DOC_NOLONGERSHARED ) ); 1085 aBox.Execute(); 1086 } 1087 } 1088 catch ( uno::Exception& ) 1089 { 1090 DBG_ERROR( "SID_SHARE_DOC: caught exception\n" ); 1091 SC_MOD()->SetInSharedDocSaving( false ); 1092 1093 try 1094 { 1095 uno::Reference< util::XCloseable > xClose( xModel, uno::UNO_QUERY_THROW ); 1096 xClose->close( sal_True ); 1097 } 1098 catch ( uno::Exception& ) 1099 { 1100 } 1101 } 1102 } 1103 } 1104 } 1105 rReq.Done(); 1106 } 1107 break; 1108 1109 default: 1110 { 1111 // kleiner (?) Hack -> forward der Slots an TabViewShell 1112 ScTabViewShell* pSh = GetBestViewShell(); 1113 if ( pSh ) 1114 pSh->Execute( rReq ); 1115 else 1116 SbxBase::SetError( SbxERR_NO_ACTIVE_OBJECT ); 1117 } 1118 } 1119 } 1120 1121 1122 //------------------------------------------------------------------ 1123 1124 void UpdateAcceptChangesDialog() 1125 { 1126 // update "accept changes" dialog 1127 //! notify all views 1128 SfxViewFrame* pViewFrm = SfxViewFrame::Current(); 1129 if ( pViewFrm && pViewFrm->HasChildWindow( FID_CHG_ACCEPT ) ) 1130 { 1131 SfxChildWindow* pChild = pViewFrm->GetChildWindow( FID_CHG_ACCEPT ); 1132 if ( pChild ) 1133 ((ScAcceptChgDlgWrapper*)pChild)->ReInitDlg(); 1134 } 1135 } 1136 1137 //------------------------------------------------------------------ 1138 1139 sal_Bool ScDocShell::ExecuteChangeProtectionDialog( Window* _pParent, sal_Bool bJustQueryIfProtected ) 1140 { 1141 sal_Bool bDone = sal_False; 1142 ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack(); 1143 if ( pChangeTrack ) 1144 { 1145 sal_Bool bProtected = pChangeTrack->IsProtected(); 1146 if ( bJustQueryIfProtected && !bProtected ) 1147 return sal_True; 1148 1149 String aTitle( ScResId( bProtected ? SCSTR_CHG_UNPROTECT : SCSTR_CHG_PROTECT ) ); 1150 String aText( ScResId( SCSTR_PASSWORD ) ); 1151 String aPassword; 1152 1153 SfxPasswordDialog* pDlg = new SfxPasswordDialog( 1154 _pParent ? _pParent : GetActiveDialogParent(), &aText ); 1155 pDlg->SetText( aTitle ); 1156 pDlg->SetMinLen( 1 ); 1157 pDlg->SetHelpId( GetStaticInterface()->GetSlot(SID_CHG_PROTECT)->GetCommand() ); 1158 pDlg->SetEditHelpId( HID_CHG_PROTECT ); 1159 if ( !bProtected ) 1160 pDlg->ShowExtras( SHOWEXTRAS_CONFIRM ); 1161 if ( pDlg->Execute() == RET_OK ) 1162 aPassword = pDlg->GetPassword(); 1163 delete pDlg; 1164 1165 if ( aPassword.Len() ) 1166 { 1167 if ( bProtected ) 1168 { 1169 if ( SvPasswordHelper::CompareHashPassword(pChangeTrack->GetProtection(), aPassword) ) 1170 { 1171 if ( bJustQueryIfProtected ) 1172 bDone = sal_True; 1173 else 1174 pChangeTrack->SetProtection( 1175 com::sun::star::uno::Sequence< sal_Int8 > (0) ); 1176 } 1177 else 1178 { 1179 InfoBox aBox( GetActiveDialogParent(), 1180 String( ScResId( SCSTR_WRONGPASSWORD ) ) ); 1181 aBox.Execute(); 1182 } 1183 } 1184 else 1185 { 1186 com::sun::star::uno::Sequence< sal_Int8 > aPass; 1187 SvPasswordHelper::GetHashPassword( aPass, aPassword ); 1188 pChangeTrack->SetProtection( aPass ); 1189 } 1190 if ( bProtected != pChangeTrack->IsProtected() ) 1191 { 1192 UpdateAcceptChangesDialog(); 1193 bDone = sal_True; 1194 } 1195 } 1196 } 1197 else if ( bJustQueryIfProtected ) 1198 bDone = sal_True; 1199 return bDone; 1200 } 1201 1202 1203 //------------------------------------------------------------------ 1204 1205 void ScDocShell::DoRecalc( sal_Bool bApi ) 1206 { 1207 sal_Bool bDone = sal_False; 1208 ScTabViewShell* pSh = GetBestViewShell(); 1209 if ( pSh ) 1210 { 1211 ScInputHandler* pHdl = SC_MOD()->GetInputHdl(pSh); 1212 if ( pHdl && pHdl->IsInputMode() && pHdl->IsFormulaMode() && !bApi ) 1213 { 1214 pHdl->FormulaPreview(); // Teilergebnis als QuickHelp 1215 bDone = sal_True; 1216 } 1217 else 1218 { 1219 pSh->UpdateInputLine(); // InputEnterHandler 1220 pSh->UpdateInputHandler(); 1221 } 1222 } 1223 if (!bDone) // sonst Dokument neu berechnen 1224 { 1225 WaitObject aWaitObj( GetActiveDialogParent() ); 1226 aDocument.CalcFormulaTree(); 1227 if ( pSh ) 1228 pSh->UpdateCharts(sal_True); 1229 1230 aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) ); 1231 1232 // #47939# Wenn es Charts gibt, dann alles painten, damit nicht 1233 // PostDataChanged und die Charts nacheinander kommen und Teile 1234 // doppelt gepainted werden. 1235 1236 ScChartListenerCollection* pCharts = aDocument.GetChartListenerCollection(); 1237 if ( pCharts && pCharts->GetCount() ) 1238 PostPaintGridAll(); 1239 else 1240 PostDataChanged(); 1241 } 1242 } 1243 1244 void ScDocShell::DoHardRecalc( sal_Bool /* bApi */ ) 1245 { 1246 WaitObject aWaitObj( GetActiveDialogParent() ); 1247 ScTabViewShell* pSh = GetBestViewShell(); 1248 if ( pSh ) 1249 { 1250 pSh->UpdateInputLine(); // InputEnterHandler 1251 pSh->UpdateInputHandler(); 1252 } 1253 aDocument.CalcAll(); 1254 GetDocFunc().DetectiveRefresh(); // erzeugt eigenes Undo 1255 if ( pSh ) 1256 pSh->UpdateCharts(sal_True); 1257 1258 // set notification flags for "calculate" event (used in SFX_HINT_DATACHANGED broadcast) 1259 // (might check for the presence of any formulas on each sheet) 1260 SCTAB nTabCount = aDocument.GetTableCount(); 1261 SCTAB nTab; 1262 if (aDocument.HasAnySheetEventScript( SC_SHEETEVENT_CALCULATE, true )) // search also for VBA hendler 1263 for (nTab=0; nTab<nTabCount; nTab++) 1264 aDocument.SetCalcNotification(nTab); 1265 1266 // CalcAll doesn't broadcast value changes, so SC_HINT_CALCALL is broadcasted globally 1267 // in addition to SFX_HINT_DATACHANGED. 1268 aDocument.BroadcastUno( SfxSimpleHint( SC_HINT_CALCALL ) ); 1269 aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) ); 1270 1271 // use hard recalc also to disable stream-copying of all sheets 1272 // (somewhat consistent with charts) 1273 for (nTab=0; nTab<nTabCount; nTab++) 1274 if (aDocument.IsStreamValid(nTab)) 1275 aDocument.SetStreamValid(nTab, sal_False); 1276 1277 PostPaintGridAll(); 1278 } 1279 1280 //------------------------------------------------------------------ 1281 1282 void ScDocShell::DoAutoStyle( const ScRange& rRange, const String& rStyle ) 1283 { 1284 ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool(); 1285 ScStyleSheet* pStyleSheet = 1286 pStylePool->FindCaseIns( rStyle, SFX_STYLE_FAMILY_PARA ); 1287 if (!pStyleSheet) 1288 pStyleSheet = (ScStyleSheet*) 1289 pStylePool->Find( ScGlobal::GetRscString(STR_STYLENAME_STANDARD), SFX_STYLE_FAMILY_PARA ); 1290 if (pStyleSheet) 1291 { 1292 DBG_ASSERT(rRange.aStart.Tab() == rRange.aEnd.Tab(), 1293 "DoAutoStyle mit mehreren Tabellen"); 1294 SCTAB nTab = rRange.aStart.Tab(); 1295 SCCOL nStartCol = rRange.aStart.Col(); 1296 SCROW nStartRow = rRange.aStart.Row(); 1297 SCCOL nEndCol = rRange.aEnd.Col(); 1298 SCROW nEndRow = rRange.aEnd.Row(); 1299 aDocument.ApplyStyleAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, *pStyleSheet ); 1300 aDocument.ExtendMerge( nStartCol, nStartRow, nEndCol, nEndRow, nTab ); 1301 PostPaint( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab, PAINT_GRID ); 1302 } 1303 } 1304 1305 //------------------------------------------------------------------ 1306 1307 void ScDocShell::NotifyStyle( const SfxStyleSheetHint& rHint ) 1308 { 1309 sal_uInt16 nId = rHint.GetHint(); 1310 const SfxStyleSheetBase* pStyle = rHint.GetStyleSheet(); 1311 if (!pStyle) 1312 return; 1313 1314 if ( pStyle->GetFamily() == SFX_STYLE_FAMILY_PAGE ) 1315 { 1316 if ( nId == SFX_STYLESHEET_MODIFIED ) 1317 { 1318 ScDocShellModificator aModificator( *this ); 1319 1320 String aNewName = pStyle->GetName(); 1321 String aOldName = aNewName; 1322 sal_Bool bExtended = rHint.ISA(SfxStyleSheetHintExtended); // Name geaendert? 1323 if (bExtended) 1324 aOldName = ((SfxStyleSheetHintExtended&)rHint).GetOldName(); 1325 1326 if ( aNewName != aOldName ) 1327 aDocument.RenamePageStyleInUse( aOldName, aNewName ); 1328 1329 SCTAB nTabCount = aDocument.GetTableCount(); 1330 for (SCTAB nTab=0; nTab<nTabCount; nTab++) 1331 if (aDocument.GetPageStyle(nTab) == aNewName) // schon auf neu angepasst 1332 { 1333 aDocument.PageStyleModified( nTab, aNewName ); 1334 ScPrintFunc aPrintFunc( this, GetPrinter(), nTab ); 1335 aPrintFunc.UpdatePages(); 1336 } 1337 1338 aModificator.SetDocumentModified(); 1339 1340 if (bExtended) 1341 { 1342 SfxBindings* pBindings = GetViewBindings(); 1343 if (pBindings) 1344 { 1345 pBindings->Invalidate( SID_STATUS_PAGESTYLE ); 1346 pBindings->Invalidate( SID_STYLE_FAMILY4 ); 1347 pBindings->Invalidate( FID_RESET_PRINTZOOM ); 1348 pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT ); 1349 pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT ); 1350 } 1351 } 1352 } 1353 } 1354 else if ( pStyle->GetFamily() == SFX_STYLE_FAMILY_PARA ) 1355 { 1356 if ( nId == SFX_STYLESHEET_MODIFIED) 1357 { 1358 String aNewName = pStyle->GetName(); 1359 String aOldName = aNewName; 1360 sal_Bool bExtended = rHint.ISA(SfxStyleSheetHintExtended); 1361 if (bExtended) 1362 aOldName = ((SfxStyleSheetHintExtended&)rHint).GetOldName(); 1363 if ( aNewName != aOldName ) 1364 { 1365 ScConditionalFormatList* pList = aDocument.GetCondFormList(); 1366 if (pList) 1367 pList->RenameCellStyle( aOldName,aNewName ); 1368 } 1369 } 1370 } 1371 1372 // alles andere geht ueber Slots... 1373 } 1374 1375 // wie in printfun.cxx 1376 #define ZOOM_MIN 10 1377 1378 void ScDocShell::SetPrintZoom( SCTAB nTab, sal_uInt16 nScale, sal_uInt16 nPages ) 1379 { 1380 sal_Bool bUndo(aDocument.IsUndoEnabled()); 1381 String aStyleName = aDocument.GetPageStyle( nTab ); 1382 ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool(); 1383 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE ); 1384 DBG_ASSERT( pStyleSheet, "PageStyle not found" ); 1385 if ( pStyleSheet ) 1386 { 1387 ScDocShellModificator aModificator( *this ); 1388 1389 SfxItemSet& rSet = pStyleSheet->GetItemSet(); 1390 if (bUndo) 1391 { 1392 sal_uInt16 nOldScale = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALE)).GetValue(); 1393 sal_uInt16 nOldPages = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALETOPAGES)).GetValue(); 1394 GetUndoManager()->AddUndoAction( new ScUndoPrintZoom( 1395 this, nTab, nOldScale, nOldPages, nScale, nPages ) ); 1396 } 1397 1398 rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALE, nScale ) ); 1399 rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALETOPAGES, nPages ) ); 1400 1401 ScPrintFunc aPrintFunc( this, GetPrinter(), nTab ); 1402 aPrintFunc.UpdatePages(); 1403 aModificator.SetDocumentModified(); 1404 1405 SfxBindings* pBindings = GetViewBindings(); 1406 if (pBindings) 1407 pBindings->Invalidate( FID_RESET_PRINTZOOM ); 1408 } 1409 } 1410 1411 sal_Bool ScDocShell::AdjustPrintZoom( const ScRange& rRange ) 1412 { 1413 sal_Bool bChange = sal_False; 1414 SCTAB nTab = rRange.aStart.Tab(); 1415 1416 String aStyleName = aDocument.GetPageStyle( nTab ); 1417 ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool(); 1418 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE ); 1419 DBG_ASSERT( pStyleSheet, "PageStyle not found" ); 1420 if ( pStyleSheet ) 1421 { 1422 SfxItemSet& rSet = pStyleSheet->GetItemSet(); 1423 sal_Bool bHeaders = ((const SfxBoolItem&)rSet.Get(ATTR_PAGE_HEADERS)).GetValue(); 1424 sal_uInt16 nOldScale = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALE)).GetValue(); 1425 sal_uInt16 nOldPages = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALETOPAGES)).GetValue(); 1426 const ScRange* pRepeatCol = aDocument.GetRepeatColRange( nTab ); 1427 const ScRange* pRepeatRow = aDocument.GetRepeatRowRange( nTab ); 1428 1429 // benoetigte Skalierung fuer Selektion ausrechnen 1430 1431 sal_uInt16 nNewScale = nOldScale; 1432 1433 long nBlkTwipsX = 0; 1434 if (bHeaders) 1435 nBlkTwipsX += (long) PRINT_HEADER_WIDTH; 1436 SCCOL nStartCol = rRange.aStart.Col(); 1437 SCCOL nEndCol = rRange.aEnd.Col(); 1438 if ( pRepeatCol && nStartCol >= pRepeatCol->aStart.Col() ) 1439 { 1440 for (SCCOL i=pRepeatCol->aStart.Col(); i<=pRepeatCol->aEnd.Col(); i++ ) 1441 nBlkTwipsX += aDocument.GetColWidth( i, nTab ); 1442 if ( nStartCol <= pRepeatCol->aEnd.Col() ) 1443 nStartCol = pRepeatCol->aEnd.Col() + 1; 1444 } 1445 // legacy compilers' own scope for i 1446 { 1447 for ( SCCOL i=nStartCol; i<=nEndCol; i++ ) 1448 nBlkTwipsX += aDocument.GetColWidth( i, nTab ); 1449 } 1450 1451 long nBlkTwipsY = 0; 1452 if (bHeaders) 1453 nBlkTwipsY += (long) PRINT_HEADER_HEIGHT; 1454 SCROW nStartRow = rRange.aStart.Row(); 1455 SCROW nEndRow = rRange.aEnd.Row(); 1456 if ( pRepeatRow && nStartRow >= pRepeatRow->aStart.Row() ) 1457 { 1458 nBlkTwipsY += aDocument.GetRowHeight( pRepeatRow->aStart.Row(), 1459 pRepeatRow->aEnd.Row(), nTab ); 1460 if ( nStartRow <= pRepeatRow->aEnd.Row() ) 1461 nStartRow = pRepeatRow->aEnd.Row() + 1; 1462 } 1463 nBlkTwipsY += aDocument.GetRowHeight( nStartRow, nEndRow, nTab ); 1464 1465 Size aPhysPage; 1466 long nHdr, nFtr; 1467 ScPrintFunc aOldPrFunc( this, GetPrinter(), nTab ); 1468 aOldPrFunc.GetScaleData( aPhysPage, nHdr, nFtr ); 1469 nBlkTwipsY += nHdr + nFtr; 1470 1471 if ( nBlkTwipsX == 0 ) // #100639# hidden columns/rows may lead to 0 1472 nBlkTwipsX = 1; 1473 if ( nBlkTwipsY == 0 ) 1474 nBlkTwipsY = 1; 1475 1476 long nNeeded = Min( aPhysPage.Width() * 100 / nBlkTwipsX, 1477 aPhysPage.Height() * 100 / nBlkTwipsY ); 1478 if ( nNeeded < ZOOM_MIN ) 1479 nNeeded = ZOOM_MIN; // Begrenzung 1480 if ( nNeeded < (long) nNewScale ) 1481 nNewScale = (sal_uInt16) nNeeded; 1482 1483 bChange = ( nNewScale != nOldScale || nOldPages != 0 ); 1484 if ( bChange ) 1485 SetPrintZoom( nTab, nNewScale, 0 ); 1486 } 1487 return bChange; 1488 } 1489 1490 void ScDocShell::PageStyleModified( const String& rStyleName, sal_Bool bApi ) 1491 { 1492 ScDocShellModificator aModificator( *this ); 1493 1494 sal_Bool bWarn = sal_False; 1495 1496 SCTAB nTabCount = aDocument.GetTableCount(); 1497 SCTAB nUseTab = MAXTAB+1; 1498 for (SCTAB nTab=0; nTab<nTabCount && nUseTab>MAXTAB; nTab++) 1499 if ( aDocument.GetPageStyle(nTab) == rStyleName && 1500 ( !bApi || aDocument.GetPageSize(nTab).Width() ) ) 1501 nUseTab = nTab; 1502 // bei bApi nur, wenn Umbrueche schon angezeigt 1503 1504 if (ValidTab(nUseTab)) // nicht verwendet -> nichts zu tun 1505 { 1506 ScPrintFunc aPrintFunc( this, GetPrinter(), nUseTab ); //! ohne CountPages auskommen 1507 if (!aPrintFunc.UpdatePages()) // setzt Umbrueche auf allen Tabs 1508 bWarn = sal_True; 1509 1510 if (bWarn && !bApi) 1511 { 1512 ScWaitCursorOff aWaitOff( GetActiveDialogParent() ); 1513 InfoBox aInfoBox(GetActiveDialogParent(), 1514 ScGlobal::GetRscString(STR_PRINT_INVALID_AREA)); 1515 aInfoBox.Execute(); 1516 } 1517 } 1518 1519 aModificator.SetDocumentModified(); 1520 1521 SfxBindings* pBindings = GetViewBindings(); 1522 if (pBindings) 1523 { 1524 pBindings->Invalidate( FID_RESET_PRINTZOOM ); 1525 pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT ); 1526 pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT ); 1527 } 1528 } 1529 1530 void ScDocShell::ExecutePageStyle( SfxViewShell& rCaller, 1531 SfxRequest& rReq, 1532 SCTAB nCurTab ) 1533 { 1534 const SfxItemSet* pReqArgs = rReq.GetArgs(); 1535 1536 switch ( rReq.GetSlot() ) 1537 { 1538 case SID_STATUS_PAGESTYLE: // Click auf StatusBar-Control 1539 case SID_FORMATPAGE: 1540 { 1541 if ( pReqArgs != NULL ) 1542 { 1543 } 1544 else if ( pReqArgs == NULL ) 1545 { 1546 sal_Bool bUndo(aDocument.IsUndoEnabled()); 1547 String aOldName = aDocument.GetPageStyle( nCurTab ); 1548 ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool(); 1549 SfxStyleSheetBase* pStyleSheet 1550 = pStylePool->Find( aOldName, SFX_STYLE_FAMILY_PAGE ); 1551 1552 DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" ); 1553 1554 if ( pStyleSheet ) 1555 { 1556 ScStyleSaveData aOldData; 1557 if (bUndo) 1558 aOldData.InitFromStyle( pStyleSheet ); 1559 1560 SfxItemSet& rStyleSet = pStyleSheet->GetItemSet(); 1561 1562 //CHINA001 ScStyleDlg* pDlg = new ScStyleDlg( GetActiveDialogParent(), 1563 //CHINA001 *pStyleSheet, 1564 //CHINA001 RID_SCDLG_STYLES_PAGE ); 1565 //CHINA001 1566 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 1567 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 1568 1569 SfxAbstractTabDialog* pDlg = pFact->CreateScStyleDlg( GetActiveDialogParent(), *pStyleSheet, RID_SCDLG_STYLES_PAGE, RID_SCDLG_STYLES_PAGE ); 1570 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 1571 1572 if ( pDlg->Execute() == RET_OK ) 1573 { 1574 const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); 1575 1576 WaitObject aWait( GetActiveDialogParent() ); 1577 1578 String aNewName = pStyleSheet->GetName(); 1579 if ( aNewName != aOldName && 1580 aDocument.RenamePageStyleInUse( aOldName, aNewName ) ) 1581 { 1582 SfxBindings* pBindings = GetViewBindings(); 1583 if (pBindings) 1584 { 1585 pBindings->Invalidate( SID_STATUS_PAGESTYLE ); 1586 pBindings->Invalidate( FID_RESET_PRINTZOOM ); 1587 } 1588 } 1589 1590 if ( pOutSet ) 1591 aDocument.ModifyStyleSheet( *pStyleSheet, *pOutSet ); 1592 1593 // merken fuer GetState(): 1594 GetPageOnFromPageStyleSet( &rStyleSet, nCurTab, bHeaderOn, bFooterOn ); 1595 rCaller.GetViewFrame()->GetBindings().Invalidate( SID_HFEDIT ); 1596 1597 ScStyleSaveData aNewData; 1598 aNewData.InitFromStyle( pStyleSheet ); 1599 if (bUndo) 1600 { 1601 GetUndoManager()->AddUndoAction( 1602 new ScUndoModifyStyle( this, SFX_STYLE_FAMILY_PAGE, 1603 aOldData, aNewData ) ); 1604 } 1605 1606 PageStyleModified( aNewName, sal_False ); 1607 rReq.Done(); 1608 } 1609 delete pDlg; 1610 1611 rStyleSet.ClearItem( ATTR_PAGE_PAPERTRAY ); 1612 } 1613 } 1614 } 1615 break; 1616 1617 case SID_HFEDIT: 1618 { 1619 if ( pReqArgs != NULL ) 1620 { 1621 } 1622 else if ( pReqArgs == NULL ) 1623 { 1624 String aStr( aDocument.GetPageStyle( nCurTab ) ); 1625 1626 ScStyleSheetPool* pStylePool 1627 = aDocument.GetStyleSheetPool(); 1628 1629 SfxStyleSheetBase* pStyleSheet 1630 = pStylePool->Find( aStr, SFX_STYLE_FAMILY_PAGE ); 1631 1632 DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" ); 1633 1634 if ( pStyleSheet ) 1635 { 1636 SfxItemSet& rStyleSet = pStyleSheet->GetItemSet(); 1637 1638 SvxPageUsage eUsage = 1639 SvxPageUsage( ((const SvxPageItem&) 1640 rStyleSet.Get( ATTR_PAGE )). 1641 GetPageUsage() ); 1642 sal_Bool bShareHeader = IS_SHARE_HEADER(rStyleSet); 1643 sal_Bool bShareFooter = IS_SHARE_FOOTER(rStyleSet); 1644 sal_uInt16 nResId = 0; 1645 1646 switch ( eUsage ) 1647 { 1648 case SVX_PAGE_LEFT: 1649 case SVX_PAGE_RIGHT: 1650 { 1651 if ( bHeaderOn && bFooterOn ) 1652 nResId = RID_SCDLG_HFEDIT; 1653 else if ( SVX_PAGE_RIGHT == eUsage ) 1654 { 1655 if ( !bHeaderOn && bFooterOn ) 1656 nResId = RID_SCDLG_HFEDIT_RIGHTFOOTER; 1657 else if ( bHeaderOn && !bFooterOn ) 1658 nResId = RID_SCDLG_HFEDIT_RIGHTHEADER; 1659 } 1660 else 1661 { 1662 // #69193a# respect "shared" setting 1663 if ( !bHeaderOn && bFooterOn ) 1664 nResId = bShareFooter ? 1665 RID_SCDLG_HFEDIT_RIGHTFOOTER : 1666 RID_SCDLG_HFEDIT_LEFTFOOTER; 1667 else if ( bHeaderOn && !bFooterOn ) 1668 nResId = bShareHeader ? 1669 RID_SCDLG_HFEDIT_RIGHTHEADER : 1670 RID_SCDLG_HFEDIT_LEFTHEADER; 1671 } 1672 } 1673 break; 1674 1675 case SVX_PAGE_MIRROR: 1676 case SVX_PAGE_ALL: 1677 default: 1678 { 1679 if ( !bShareHeader && !bShareFooter ) 1680 { 1681 if ( bHeaderOn && bFooterOn ) 1682 nResId = RID_SCDLG_HFEDIT_ALL; 1683 else if ( !bHeaderOn && bFooterOn ) 1684 nResId = RID_SCDLG_HFEDIT_FOOTER; 1685 else if ( bHeaderOn && !bFooterOn ) 1686 nResId = RID_SCDLG_HFEDIT_HEADER; 1687 } 1688 else if ( bShareHeader && bShareFooter ) 1689 { 1690 if ( bHeaderOn && bFooterOn ) 1691 nResId = RID_SCDLG_HFEDIT; 1692 else 1693 { 1694 if ( !bHeaderOn && bFooterOn ) 1695 nResId = RID_SCDLG_HFEDIT_RIGHTFOOTER; 1696 else if ( bHeaderOn && !bFooterOn ) 1697 nResId = RID_SCDLG_HFEDIT_RIGHTHEADER; 1698 } 1699 } 1700 else if ( !bShareHeader && bShareFooter ) 1701 { 1702 if ( bHeaderOn && bFooterOn ) 1703 nResId = RID_SCDLG_HFEDIT_SFTR; 1704 else if ( !bHeaderOn && bFooterOn ) 1705 nResId = RID_SCDLG_HFEDIT_RIGHTFOOTER; 1706 else if ( bHeaderOn && !bFooterOn ) 1707 nResId = RID_SCDLG_HFEDIT_HEADER; 1708 } 1709 else if ( bShareHeader && !bShareFooter ) 1710 { 1711 if ( bHeaderOn && bFooterOn ) 1712 nResId = RID_SCDLG_HFEDIT_SHDR; 1713 else if ( !bHeaderOn && bFooterOn ) 1714 nResId = RID_SCDLG_HFEDIT_FOOTER; 1715 else if ( bHeaderOn && !bFooterOn ) 1716 nResId = RID_SCDLG_HFEDIT_RIGHTHEADER; 1717 } 1718 } 1719 } 1720 1721 //CHINA001 ScHFEditDlg* pDlg 1722 //CHINA001 = new ScHFEditDlg( SFX_APP()->GetViewFrame(), 1723 //CHINA001 GetActiveDialogParent(), 1724 //CHINA001 rStyleSet, 1725 //CHINA001 aStr, 1726 //CHINA001 nResId ); 1727 //CHINA001 1728 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 1729 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 1730 1731 SfxAbstractTabDialog* pDlg = pFact->CreateScHFEditDlg( SfxViewFrame::Current(), 1732 GetActiveDialogParent(), 1733 rStyleSet, 1734 aStr, 1735 RID_SCDLG_HFEDIT, nResId); 1736 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 1737 if ( pDlg->Execute() == RET_OK ) 1738 { 1739 const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); 1740 1741 if ( pOutSet ) 1742 aDocument.ModifyStyleSheet( *pStyleSheet, *pOutSet ); 1743 1744 SetDocumentModified(); 1745 rReq.Done(); 1746 } 1747 delete pDlg; 1748 } 1749 } 1750 } 1751 break; 1752 1753 default: 1754 break; 1755 } 1756 } 1757 1758 void ScDocShell::GetStatePageStyle( SfxViewShell& /* rCaller */, 1759 SfxItemSet& rSet, 1760 SCTAB nCurTab ) 1761 { 1762 SfxWhichIter aIter(rSet); 1763 sal_uInt16 nWhich = aIter.FirstWhich(); 1764 while ( nWhich ) 1765 { 1766 switch (nWhich) 1767 { 1768 case SID_STATUS_PAGESTYLE: 1769 rSet.Put( SfxStringItem( nWhich, aDocument.GetPageStyle( nCurTab ) ) ); 1770 break; 1771 1772 case SID_HFEDIT: 1773 { 1774 String aStr = aDocument.GetPageStyle( nCurTab ); 1775 ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool(); 1776 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStr, SFX_STYLE_FAMILY_PAGE ); 1777 1778 DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" ); 1779 1780 if ( pStyleSheet ) 1781 { 1782 SfxItemSet& rStyleSet = pStyleSheet->GetItemSet(); 1783 1784 GetPageOnFromPageStyleSet( &rStyleSet, nCurTab, bHeaderOn, bFooterOn ); 1785 1786 if ( !bHeaderOn && !bFooterOn ) 1787 rSet.DisableItem( nWhich ); 1788 } 1789 } 1790 break; 1791 } 1792 1793 nWhich = aIter.NextWhich(); 1794 } 1795 } 1796 1797 void ScDocShell::GetState( SfxItemSet &rSet ) 1798 { 1799 SfxWhichIter aIter(rSet); 1800 sal_uInt16 nWhich = aIter.FirstWhich(); 1801 while ( nWhich ) 1802 { 1803 switch (nWhich) 1804 { 1805 case FID_AUTO_CALC: 1806 if ( (sal_Bool) aDocument.GetHardRecalcState() ) 1807 rSet.DisableItem( nWhich ); 1808 else 1809 rSet.Put( SfxBoolItem( nWhich, aDocument.GetAutoCalc() ) ); 1810 break; 1811 1812 case FID_CHG_RECORD: 1813 if ( IsDocShared() ) 1814 rSet.DisableItem( nWhich ); 1815 else 1816 rSet.Put( SfxBoolItem( nWhich, 1817 aDocument.GetChangeTrack() != NULL ) ); 1818 break; 1819 1820 case SID_CHG_PROTECT: 1821 { 1822 ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack(); 1823 if ( pChangeTrack && !IsDocShared() ) 1824 rSet.Put( SfxBoolItem( nWhich, 1825 pChangeTrack->IsProtected() ) ); 1826 else 1827 rSet.DisableItem( nWhich ); 1828 } 1829 break; 1830 1831 case SID_DOCUMENT_COMPARE: 1832 { 1833 if ( IsDocShared() ) 1834 { 1835 rSet.DisableItem( nWhich ); 1836 } 1837 } 1838 break; 1839 1840 // Wenn eine Formel editiert wird, muss FID_RECALC auf jeden Fall enabled sein. 1841 // Recalc fuer das Doc war mal wegen #29898# disabled, wenn AutoCalc an war, 1842 // ist jetzt wegen #41540# aber auch immer enabled. 1843 // case FID_RECALC: 1844 // if ( aDocument.GetAutoCalc() ) 1845 // rSet.DisableItem( nWhich ); 1846 // break; 1847 1848 case SID_TABLES_COUNT: 1849 rSet.Put( SfxInt16Item( nWhich, aDocument.GetTableCount() ) ); 1850 break; 1851 1852 case SID_ATTR_YEAR2000 : 1853 rSet.Put( SfxUInt16Item( nWhich, 1854 aDocument.GetDocOptions().GetYear2000() ) ); 1855 break; 1856 1857 case SID_SHARE_DOC: 1858 { 1859 if ( IsReadOnly() ) 1860 { 1861 rSet.DisableItem( nWhich ); 1862 } 1863 } 1864 break; 1865 1866 default: 1867 { 1868 } 1869 break; 1870 } 1871 1872 nWhich = aIter.NextWhich(); 1873 } 1874 } 1875 1876 void ScDocShell::GetSbxState( SfxItemSet &rSet ) 1877 { 1878 // SID_SC_SELECTION (Selection), 1879 // SID_SC_ACTIVECELL (ActiveCell), 1880 // SID_SC_ACTIVETAB (ActiveTable), 1881 // SID_TABLES_GET (Tables), 1882 // SID_PIVOT_GET (DataPilotTables) - removed (old Basic) 1883 1884 // 1885 // Wenn hier Slots von der View-Shell executed werden, muss auch der 1886 // GetState weitergeleitet werden! 1887 // 1888 1889 ScTabViewShell* pVisibleSh = GetBestViewShell(); // sichtbare View 1890 if ( pVisibleSh ) 1891 pVisibleSh->GetState( rSet ); 1892 } 1893 1894 void __EXPORT ScDocShell::Draw( OutputDevice* pDev, const JobSetup & /* rSetup */, sal_uInt16 nAspect ) 1895 { 1896 // bIsOle = sal_True; // jetzt ueber den CreateMode 1897 1898 SCTAB nVisTab = aDocument.GetVisibleTab(); 1899 if (!aDocument.HasTable(nVisTab)) 1900 return; 1901 1902 sal_uLong nOldLayoutMode = pDev->GetLayoutMode(); 1903 pDev->SetLayoutMode( TEXT_LAYOUT_DEFAULT ); // even if it's the same, to get the metafile action 1904 1905 if ( nAspect == ASPECT_THUMBNAIL ) 1906 { 1907 Rectangle aBoundRect = GetVisArea( ASPECT_THUMBNAIL ); 1908 ScViewData aTmpData( this, NULL ); 1909 aTmpData.SetTabNo(nVisTab); 1910 aDocument.SnapVisArea( aBoundRect ); 1911 aTmpData.SetScreen( aBoundRect ); 1912 ScPrintFunc::DrawToDev( &aDocument, pDev, 1.0, aBoundRect, &aTmpData, sal_True ); 1913 } 1914 else 1915 { 1916 Rectangle aBoundRect = SfxObjectShell::GetVisArea(); 1917 ScViewData aTmpData( this, NULL ); 1918 aTmpData.SetTabNo(nVisTab); 1919 aDocument.SnapVisArea( aBoundRect ); 1920 aTmpData.SetScreen( aBoundRect ); 1921 ScPrintFunc::DrawToDev( &aDocument, pDev, 1.0, aBoundRect, &aTmpData, sal_True ); 1922 } 1923 1924 pDev->SetLayoutMode( nOldLayoutMode ); 1925 } 1926 1927 Rectangle __EXPORT ScDocShell::GetVisArea( sal_uInt16 nAspect ) const 1928 { 1929 SfxObjectCreateMode eShellMode = GetCreateMode(); 1930 if ( eShellMode == SFX_CREATE_MODE_ORGANIZER ) 1931 { 1932 // ohne Inhalte wissen wir auch nicht, wie gross die Inhalte sind 1933 // leeres Rechteck zurueckgeben, das wird dann nach dem Laden berechnet 1934 return Rectangle(); 1935 } 1936 1937 if( nAspect == ASPECT_THUMBNAIL ) 1938 { 1939 // Rectangle aArea( 0,0, 3175,3175 ); // 120x120 Pixel in 1:1 1940 Rectangle aArea( 0,0, SC_PREVIEW_SIZE_X,SC_PREVIEW_SIZE_Y ); 1941 sal_Bool bNegativePage = aDocument.IsNegativePage( aDocument.GetVisibleTab() ); 1942 if ( bNegativePage ) 1943 ScDrawLayer::MirrorRectRTL( aArea ); 1944 aDocument.SnapVisArea( aArea ); 1945 return aArea; 1946 } 1947 else if( nAspect == ASPECT_CONTENT && eShellMode != SFX_CREATE_MODE_EMBEDDED ) 1948 { 1949 // Visarea holen wie nach Load 1950 1951 SCTAB nVisTab = aDocument.GetVisibleTab(); 1952 if (!aDocument.HasTable(nVisTab)) 1953 { 1954 nVisTab = 0; 1955 ((ScDocShell*)this)->aDocument.SetVisibleTab(nVisTab); 1956 } 1957 SCCOL nStartCol; 1958 SCROW nStartRow; 1959 aDocument.GetDataStart( nVisTab, nStartCol, nStartRow ); 1960 SCCOL nEndCol; 1961 SCROW nEndRow; 1962 aDocument.GetPrintArea( nVisTab, nEndCol, nEndRow ); 1963 if (nStartCol>nEndCol) 1964 nStartCol = nEndCol; 1965 if (nStartRow>nEndRow) 1966 nStartRow = nEndRow; 1967 Rectangle aNewArea = ((ScDocument&)aDocument) 1968 .GetMMRect( nStartCol,nStartRow, nEndCol,nEndRow, nVisTab ); 1969 //TODO/LATER: different methods for setting VisArea?! 1970 ((ScDocShell*)this)->SfxObjectShell::SetVisArea( aNewArea ); 1971 return aNewArea; 1972 } 1973 else 1974 return SfxObjectShell::GetVisArea( nAspect ); 1975 } 1976 1977 void ScDocShell::GetPageOnFromPageStyleSet( const SfxItemSet* pStyleSet, 1978 SCTAB nCurTab, 1979 sal_Bool& rbHeader, 1980 sal_Bool& rbFooter ) 1981 { 1982 if ( !pStyleSet ) 1983 { 1984 ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool(); 1985 SfxStyleSheetBase* pStyleSheet = pStylePool-> 1986 Find( aDocument.GetPageStyle( nCurTab ), 1987 SFX_STYLE_FAMILY_PAGE ); 1988 1989 DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" ); 1990 1991 if ( pStyleSheet ) 1992 pStyleSet = &pStyleSheet->GetItemSet(); 1993 else 1994 rbHeader = rbFooter = sal_False; 1995 } 1996 1997 DBG_ASSERT( pStyleSet, "PageStyle-Set not found! :-(" ); 1998 1999 //-------------------------------------------------------------------- 2000 2001 const SvxSetItem* pSetItem = NULL; 2002 const SfxItemSet* pSet = NULL; 2003 2004 pSetItem = (const SvxSetItem*) &pStyleSet->Get( ATTR_PAGE_HEADERSET ); 2005 pSet = &pSetItem->GetItemSet(); 2006 rbHeader = ((const SfxBoolItem&)pSet->Get(ATTR_PAGE_ON)).GetValue(); 2007 2008 pSetItem = (const SvxSetItem*) &pStyleSet->Get( ATTR_PAGE_FOOTERSET ); 2009 pSet = &pSetItem->GetItemSet(); 2010 rbFooter = ((const SfxBoolItem&)pSet->Get(ATTR_PAGE_ON)).GetValue(); 2011 } 2012 2013 long __EXPORT ScDocShell::DdeGetData( const String& rItem, 2014 const String& rMimeType, 2015 ::com::sun::star::uno::Any & rValue ) 2016 { 2017 if( FORMAT_STRING == SotExchange::GetFormatIdFromMimeType( rMimeType ) ) 2018 { 2019 if( rItem.EqualsIgnoreCaseAscii( "Format" ) ) 2020 { 2021 ByteString aFmtByte( aDdeTextFmt, gsl_getSystemTextEncoding() ); 2022 rValue <<= ::com::sun::star::uno::Sequence< sal_Int8 >( 2023 (sal_Int8*)aFmtByte.GetBuffer(), 2024 aFmtByte.Len() + 1 ); 2025 return 1; 2026 } 2027 ScImportExport aObj( &aDocument, rItem ); 2028 if ( !aObj.IsRef() ) 2029 return 0; // ungueltiger Bereich 2030 2031 if( aDdeTextFmt.GetChar(0) == 'F' ) 2032 aObj.SetFormulas( sal_True ); 2033 if( aDdeTextFmt.EqualsAscii( "SYLK" ) || 2034 aDdeTextFmt.EqualsAscii( "FSYLK" ) ) 2035 { 2036 ByteString aData; 2037 if( aObj.ExportByteString( aData, gsl_getSystemTextEncoding(), 2038 SOT_FORMATSTR_ID_SYLK ) ) 2039 { 2040 rValue <<= ::com::sun::star::uno::Sequence< sal_Int8 >( 2041 (sal_Int8*)aData.GetBuffer(), 2042 aData.Len() + 1 ); 2043 return 1; 2044 } 2045 else 2046 return 0; 2047 } 2048 if( aDdeTextFmt.EqualsAscii( "CSV" ) || 2049 aDdeTextFmt.EqualsAscii( "FCSV" ) ) 2050 aObj.SetSeparator( ',' ); 2051 aObj.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::ToSpace, 0, false ) ); 2052 return aObj.ExportData( rMimeType, rValue ) ? 1 : 0; 2053 } 2054 2055 ScImportExport aObj( &aDocument, rItem ); 2056 aObj.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::ToSpace, 0, false ) ); 2057 if( aObj.IsRef() ) 2058 return aObj.ExportData( rMimeType, rValue ) ? 1 : 0; 2059 return 0; 2060 } 2061 2062 long __EXPORT ScDocShell::DdeSetData( const String& rItem, 2063 const String& rMimeType, 2064 const ::com::sun::star::uno::Any & rValue ) 2065 { 2066 if( FORMAT_STRING == SotExchange::GetFormatIdFromMimeType( rMimeType )) 2067 { 2068 if( rItem.EqualsIgnoreCaseAscii( "Format" ) ) 2069 { 2070 if ( ScByteSequenceToString::GetString( aDdeTextFmt, rValue, gsl_getSystemTextEncoding() ) ) 2071 { 2072 aDdeTextFmt.ToUpperAscii(); 2073 return 1; 2074 } 2075 return 0; 2076 } 2077 ScImportExport aObj( &aDocument, rItem ); 2078 if( aDdeTextFmt.GetChar(0) == 'F' ) 2079 aObj.SetFormulas( sal_True ); 2080 if( aDdeTextFmt.EqualsAscii( "SYLK" ) || 2081 aDdeTextFmt.EqualsAscii( "FSYLK" ) ) 2082 { 2083 String aData; 2084 if ( ScByteSequenceToString::GetString( aData, rValue, gsl_getSystemTextEncoding() ) ) 2085 { 2086 return aObj.ImportString( aData, SOT_FORMATSTR_ID_SYLK ) ? 1 : 0; 2087 } 2088 return 0; 2089 } 2090 if( aDdeTextFmt.EqualsAscii( "CSV" ) || 2091 aDdeTextFmt.EqualsAscii( "FCSV" ) ) 2092 aObj.SetSeparator( ',' ); 2093 return aObj.ImportData( rMimeType, rValue ) ? 1 : 0; 2094 } 2095 ScImportExport aObj( &aDocument, rItem ); 2096 if( aObj.IsRef() ) 2097 return aObj.ImportData( rMimeType, rValue ) ? 1 : 0; 2098 return 0; 2099 } 2100 2101 ::sfx2::SvLinkSource* __EXPORT ScDocShell::DdeCreateLinkSource( const String& rItem ) 2102 { 2103 // only check for valid item string - range is parsed again in ScServerObject ctor 2104 2105 // named range? 2106 String aPos = rItem; 2107 ScRangeName* pRange = aDocument.GetRangeName(); 2108 if( pRange ) 2109 { 2110 sal_uInt16 nPos; 2111 if( pRange->SearchName( aPos, nPos ) ) 2112 { 2113 ScRangeData* pData = (*pRange)[ nPos ]; 2114 if( pData->HasType( RT_REFAREA ) 2115 || pData->HasType( RT_ABSAREA ) 2116 || pData->HasType( RT_ABSPOS ) ) 2117 pData->GetSymbol( aPos ); // continue with the name's contents 2118 } 2119 } 2120 2121 // Address in DDE function must be always parsed as CONV_OOO so that it 2122 // would always work regardless of current address convension. We do this 2123 // because the address item in a DDE entry is *not* normalized when saved 2124 // into ODF. 2125 ScRange aRange; 2126 bool bValid = ( (aRange.Parse(aPos, &aDocument, formula::FormulaGrammar::CONV_OOO ) & SCA_VALID) || 2127 (aRange.aStart.Parse(aPos, &aDocument, formula::FormulaGrammar::CONV_OOO) & SCA_VALID) ); 2128 2129 ScServerObject* pObj = NULL; // NULL = error 2130 if ( bValid ) 2131 pObj = new ScServerObject( this, rItem ); 2132 2133 // GetLinkManager()->InsertServer() is in the ScServerObject ctor 2134 2135 return pObj; 2136 } 2137 2138 //------------------------------------------------------------------ 2139 2140 ScViewData* ScDocShell::GetViewData() 2141 { 2142 SfxViewShell* pCur = SfxViewShell::Current(); 2143 ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,pCur); 2144 return pViewSh ? pViewSh->GetViewData() : NULL; 2145 } 2146 2147 //------------------------------------------------------------------ 2148 2149 SCTAB ScDocShell::GetCurTab() 2150 { 2151 //! this must be made non-static and use a ViewShell from this document! 2152 2153 ScViewData* pViewData = GetViewData(); 2154 2155 return pViewData ? pViewData->GetTabNo() : static_cast<SCTAB>(0); 2156 } 2157 2158 ScTabViewShell* ScDocShell::GetBestViewShell( sal_Bool bOnlyVisible ) 2159 { 2160 ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell(); 2161 // falsches Doc? 2162 if( pViewSh && pViewSh->GetViewData()->GetDocShell() != this ) 2163 pViewSh = NULL; 2164 if( !pViewSh ) 2165 { 2166 // 1. ViewShell suchen 2167 SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this, bOnlyVisible ); 2168 if( pFrame ) 2169 { 2170 SfxViewShell* p = pFrame->GetViewShell(); 2171 pViewSh = PTR_CAST(ScTabViewShell,p); 2172 } 2173 } 2174 return pViewSh; 2175 } 2176 2177 SfxBindings* ScDocShell::GetViewBindings() 2178 { 2179 // used to invalidate slots after changes to this document 2180 2181 SfxViewShell* pViewSh = GetBestViewShell(); 2182 if (pViewSh) 2183 return &pViewSh->GetViewFrame()->GetBindings(); 2184 else 2185 return NULL; 2186 } 2187 2188 //------------------------------------------------------------------ 2189 2190 ScDocShell* ScDocShell::GetShellByNum( sal_uInt16 nDocNo ) // static 2191 { 2192 ScDocShell* pFound = NULL; 2193 SfxObjectShell* pShell = SfxObjectShell::GetFirst(); 2194 sal_uInt16 nShellCnt = 0; 2195 2196 while ( pShell && !pFound ) 2197 { 2198 if ( pShell->Type() == TYPE(ScDocShell) ) 2199 { 2200 if ( nShellCnt == nDocNo ) 2201 pFound = (ScDocShell*) pShell; 2202 else 2203 ++nShellCnt; 2204 } 2205 pShell = SfxObjectShell::GetNext( *pShell ); 2206 } 2207 2208 return pFound; 2209 } 2210 2211 //------------------------------------------------------------------ 2212 2213 IMPL_LINK( ScDocShell, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg ) 2214 { 2215 DBG_ASSERT( _pFileDlg, "ScDocShell::DialogClosedHdl(): no file dialog" ); 2216 DBG_ASSERT( pImpl->pDocInserter, "ScDocShell::DialogClosedHdl(): no document inserter" ); 2217 2218 if ( ERRCODE_NONE == _pFileDlg->GetError() ) 2219 { 2220 sal_uInt16 nSlot = pImpl->pRequest->GetSlot(); 2221 SfxMedium* pMed = pImpl->pDocInserter->CreateMedium(); 2222 // #i87094# If a .odt was selected pMed is NULL. 2223 if (pMed) 2224 { 2225 pImpl->pRequest->AppendItem( SfxStringItem( SID_FILE_NAME, pMed->GetName() ) ); 2226 if ( SID_DOCUMENT_COMPARE == nSlot ) 2227 { 2228 if ( pMed->GetFilter() ) 2229 pImpl->pRequest->AppendItem( 2230 SfxStringItem( SID_FILTER_NAME, pMed->GetFilter()->GetFilterName() ) ); 2231 String sOptions = ScDocumentLoader::GetOptions( *pMed ); 2232 if ( sOptions.Len() > 0 ) 2233 pImpl->pRequest->AppendItem( SfxStringItem( SID_FILE_FILTEROPTIONS, sOptions ) ); 2234 } 2235 const SfxPoolItem* pItem = NULL; 2236 SfxItemSet* pSet = pMed->GetItemSet(); 2237 if ( pSet && 2238 pSet->GetItemState( SID_VERSION, sal_True, &pItem ) == SFX_ITEM_SET && 2239 pItem->ISA( SfxInt16Item ) ) 2240 { 2241 pImpl->pRequest->AppendItem( *pItem ); 2242 } 2243 2244 Execute( *(pImpl->pRequest) ); 2245 } 2246 } 2247 2248 pImpl->bIgnoreLostRedliningWarning = false; 2249 return 0; 2250 } 2251 2252 //------------------------------------------------------------------ 2253 2254 void ScDocShell::EnableSharedSettings( bool bEnable ) 2255 { 2256 SetDocumentModified(); 2257 2258 if ( bEnable ) 2259 { 2260 aDocument.EndChangeTracking(); 2261 aDocument.StartChangeTracking(); 2262 2263 // hide accept or reject changes dialog 2264 sal_uInt16 nId = ScAcceptChgDlgWrapper::GetChildWindowId(); 2265 SfxViewFrame* pViewFrame = SfxViewFrame::Current(); 2266 if ( pViewFrame && pViewFrame->HasChildWindow( nId ) ) 2267 { 2268 pViewFrame->ToggleChildWindow( nId ); 2269 SfxBindings* pBindings = GetViewBindings(); 2270 if ( pBindings ) 2271 { 2272 pBindings->Invalidate( FID_CHG_ACCEPT ); 2273 } 2274 } 2275 } 2276 else 2277 { 2278 aDocument.EndChangeTracking(); 2279 } 2280 2281 ScChangeViewSettings aChangeViewSet; 2282 aChangeViewSet.SetShowChanges( sal_False ); 2283 aDocument.SetChangeViewSettings( aChangeViewSet ); 2284 } 2285 2286 uno::Reference< frame::XModel > ScDocShell::LoadSharedDocument() 2287 { 2288 uno::Reference< frame::XModel > xModel; 2289 try 2290 { 2291 SC_MOD()->SetInSharedDocLoading( true ); 2292 uno::Reference< lang::XMultiServiceFactory > xFactory( 2293 ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW ); 2294 uno::Reference< frame::XComponentLoader > xLoader( 2295 xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ) ) ), 2296 uno::UNO_QUERY_THROW ); 2297 uno::Sequence < beans::PropertyValue > aArgs( 1 ); 2298 aArgs[0].Name = ::rtl::OUString::createFromAscii( "Hidden" ); 2299 aArgs[0].Value <<= sal_True; 2300 2301 if ( GetMedium() ) 2302 { 2303 SFX_ITEMSET_ARG( GetMedium()->GetItemSet(), pPasswordItem, SfxStringItem, SID_PASSWORD, sal_False); 2304 if ( pPasswordItem && pPasswordItem->GetValue().Len() ) 2305 { 2306 aArgs.realloc( 2 ); 2307 aArgs[1].Name = ::rtl::OUString::createFromAscii( "Password" ); 2308 aArgs[1].Value <<= ::rtl::OUString( pPasswordItem->GetValue() ); 2309 } 2310 } 2311 2312 xModel.set( 2313 xLoader->loadComponentFromURL( GetSharedFileURL(), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_blank" ) ), 0, aArgs ), 2314 uno::UNO_QUERY_THROW ); 2315 SC_MOD()->SetInSharedDocLoading( false ); 2316 } 2317 catch ( uno::Exception& ) 2318 { 2319 DBG_ERROR( "ScDocShell::LoadSharedDocument(): caught exception\n" ); 2320 SC_MOD()->SetInSharedDocLoading( false ); 2321 try 2322 { 2323 uno::Reference< util::XCloseable > xClose( xModel, uno::UNO_QUERY_THROW ); 2324 xClose->close( sal_True ); 2325 return uno::Reference< frame::XModel >(); 2326 } 2327 catch ( uno::Exception& ) 2328 { 2329 return uno::Reference< frame::XModel >(); 2330 } 2331 } 2332 return xModel; 2333 } 2334