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 29 // INCLUDE --------------------------------------------------------------- 30 31 #include "scitems.hxx" 32 #include <editeng/eeitem.hxx> 33 34 #include <sfx2/app.hxx> 35 #include <svx/extrusionbar.hxx> 36 #include <svx/fontworkbar.hxx> 37 #include <editeng/boxitem.hxx> 38 #include <svx/fmshell.hxx> 39 #include <editeng/sizeitem.hxx> 40 #include <editeng/boxitem.hxx> 41 #include <svx/prtqry.hxx> 42 #include <svx/sidebar/ContextChangeEventMultiplexer.hxx> 43 #include <sfx2/request.hxx> 44 #include <sfx2/printer.hxx> 45 #include <sfx2/dispatch.hxx> 46 #include <svl/whiter.hxx> 47 #include <unotools/moduleoptions.hxx> 48 #include <rtl/logfile.hxx> 49 #include <tools/urlobj.hxx> 50 #include <sfx2/docfile.hxx> 51 52 #include "tabvwsh.hxx" 53 #include "sc.hrc" 54 #include "globstr.hrc" 55 #include "stlpool.hxx" 56 #include "stlsheet.hxx" 57 #include "docsh.hxx" 58 #include "scmod.hxx" 59 #include "appoptio.hxx" 60 #include "rangeutl.hxx" 61 #include "printfun.hxx" 62 #include "drawsh.hxx" 63 #include "drformsh.hxx" 64 #include "editsh.hxx" 65 #include "pivotsh.hxx" 66 #include "auditsh.hxx" 67 #include "drtxtob.hxx" 68 #include "inputhdl.hxx" 69 #include "editutil.hxx" 70 #include "inputopt.hxx" 71 #include "inputwin.hxx" 72 #include "scresid.hxx" 73 #include "dbcolect.hxx" // fuer ReImport 74 #include "reffact.hxx" 75 #include "viewuno.hxx" 76 #include "dispuno.hxx" 77 #include "anyrefdg.hxx" 78 #include "chgtrack.hxx" 79 #include "cellsh.hxx" 80 #include "oleobjsh.hxx" 81 #include "chartsh.hxx" 82 #include "graphsh.hxx" 83 #include "mediash.hxx" 84 #include "pgbrksh.hxx" 85 #include "dpobject.hxx" 86 #include "prevwsh.hxx" 87 #include "tpprint.hxx" 88 #include "scextopt.hxx" 89 #include "printopt.hxx" 90 #include "drawview.hxx" 91 #include "fupoor.hxx" 92 #include "navsett.hxx" 93 #include "sc.hrc" //CHINA001 94 #include "scabstdlg.hxx" //CHINA001 95 #include "externalrefmgr.hxx" 96 97 void ActivateOlk( ScViewData* pViewData ); 98 void DeActivateOlk( ScViewData* pViewData ); 99 100 extern SfxViewShell* pScActiveViewShell; // global.cxx 101 102 using namespace com::sun::star; 103 104 // STATIC DATA ----------------------------------------------------------- 105 106 sal_uInt16 ScTabViewShell::nInsertCtrlState = SID_INSERT_GRAPHIC; 107 sal_uInt16 ScTabViewShell::nInsCellsCtrlState = 0; 108 sal_uInt16 ScTabViewShell::nInsObjCtrlState = SID_INSERT_DIAGRAM; 109 110 // ----------------------------------------------------------------------- 111 112 void __EXPORT ScTabViewShell::Activate(sal_Bool bMDI) 113 { 114 SfxViewShell::Activate(bMDI); 115 116 // hier kein GrabFocus, sonst gibt's Probleme wenn etwas inplace editiert wird! 117 118 if ( bMDI ) 119 { 120 // fuer Eingabezeile (ClearCache) 121 ScModule* pScMod = SC_MOD(); 122 pScMod->ViewShellChanged(); 123 124 ActivateView( sal_True, bFirstActivate ); 125 ActivateOlk( GetViewData() ); 126 127 // #56870# AutoCorrect umsetzen, falls der Writer seins neu angelegt hat 128 UpdateDrawTextOutliner(); 129 130 // RegisterNewTargetNames gibts nicht mehr 131 132 SfxViewFrame* pThisFrame = GetViewFrame(); 133 if ( pInputHandler && pThisFrame->HasChildWindow(FID_INPUTLINE_STATUS) ) 134 { 135 // eigentlich nur beim Reload (letzte Version) noetig: 136 // Das InputWindow bleibt stehen, aber die View mitsamt InputHandler wird 137 // neu angelegt, darum muss der InputHandler am InputWindow gesetzt werden. 138 SfxChildWindow* pChild = pThisFrame->GetChildWindow(FID_INPUTLINE_STATUS); 139 if (pChild) 140 { 141 ScInputWindow* pWin = (ScInputWindow*)pChild->GetWindow(); 142 if (pWin && pWin->IsVisible()) 143 { 144 145 ScInputHandler* pOldHdl=pWin->GetInputHandler(); 146 147 TypeId aScType = TYPE(ScTabViewShell); 148 149 SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType ); 150 while ( pSh!=NULL && pOldHdl!=NULL) 151 { 152 if (((ScTabViewShell*)pSh)->GetInputHandler() == pOldHdl) 153 { 154 pOldHdl->ResetDelayTimer(); 155 break; 156 } 157 pSh = SfxViewShell::GetNext( *pSh, &aScType ); 158 } 159 160 pWin->SetInputHandler( pInputHandler ); 161 } 162 } 163 } 164 165 UpdateInputHandler( sal_True ); 166 167 if ( bFirstActivate ) 168 { 169 SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_NAVIGATOR_UPDATEALL ) ); 170 bFirstActivate = sal_False; 171 172 // #116278# ReadExtOptions (view settings from Excel import) must also be done 173 // after the ctor, because of the potential calls to Window::Show. 174 // Even after the fix for #104887# (Window::Show no longer notifies the access 175 // bridge, it's done in ImplSetReallyVisible), there are problems if Window::Show 176 // is called during the ViewShell ctor and reschedules asynchronous calls 177 // (for example from the FmFormShell ctor). 178 ScExtDocOptions* pExtOpt = GetViewData()->GetDocument()->GetExtDocOptions(); 179 if ( pExtOpt && pExtOpt->IsChanged() ) 180 { 181 GetViewData()->ReadExtOptions(*pExtOpt); // Excel view settings 182 SetTabNo( GetViewData()->GetTabNo(), sal_True ); 183 pExtOpt->SetChanged( false ); 184 } 185 } 186 187 pScActiveViewShell = this; 188 189 ScInputHandler* pHdl = pScMod->GetInputHdl(this); 190 if (pHdl) 191 { 192 pHdl->SetRefScale( GetViewData()->GetZoomX(), GetViewData()->GetZoomY() ); 193 } 194 195 // Aenderungs-Dialog aktualisieren 196 197 if ( pThisFrame->HasChildWindow(FID_CHG_ACCEPT) ) 198 { 199 SfxChildWindow* pChild = pThisFrame->GetChildWindow(FID_CHG_ACCEPT); 200 if (pChild) 201 { 202 ((ScAcceptChgDlgWrapper*)pChild)->ReInitDlg(); 203 } 204 } 205 206 if(pScMod->IsRefDialogOpen()) 207 { 208 sal_uInt16 nModRefDlgId=pScMod->GetCurRefDlgId(); 209 SfxChildWindow* pChildWnd = pThisFrame->GetChildWindow( nModRefDlgId ); 210 if ( pChildWnd ) 211 { 212 IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow()); 213 pRefDlg->ViewShellChanged(this); 214 } 215 } 216 } 217 218 // don't call CheckSelectionTransfer here - activating a view should not change the 219 // primary selection (may be happening just because the mouse was moved over the window) 220 221 // Wenn Referenzeingabe-Tip-Hilfe hier wieder angezeigt werden soll (ShowRefTip), 222 // muss sie beim Verschieben der View angepasst werden (gibt sonst Probleme unter OS/2 223 // beim Umschalten zwischen Dokumenten) 224 225 ContextChangeEventMultiplexer::NotifyContextChange( 226 GetController(), 227 ::sfx2::sidebar::EnumContext::Context_Default); 228 } 229 230 void __EXPORT ScTabViewShell::Deactivate(sal_Bool bMDI) 231 { 232 HideTip(); 233 234 ScDocument* pDoc=GetViewData()->GetDocument(); 235 236 ScChangeTrack* pChanges=pDoc->GetChangeTrack(); 237 238 if(pChanges!=NULL) 239 { 240 Link aLink; 241 pChanges->SetModifiedLink(aLink); 242 } 243 244 SfxViewShell::Deactivate(bMDI); 245 246 ScInputHandler* pHdl = SC_MOD()->GetInputHdl(this); 247 248 if( bMDI ) 249 { 250 // #85421# during shell deactivation, shells must not be switched, or the loop 251 // through the shell stack (in SfxDispatcher::DoDeactivate_Impl) will not work 252 sal_Bool bOldDontSwitch = bDontSwitch; 253 bDontSwitch = sal_True; 254 255 DeActivateOlk( GetViewData() ); 256 ActivateView( sal_False, sal_False ); 257 258 if ( GetViewFrame()->GetFrame().IsInPlace() ) // inplace 259 GetViewData()->GetDocShell()->UpdateOle(GetViewData(),sal_True); 260 261 if ( pHdl ) 262 pHdl->NotifyChange( NULL, sal_True ); // Timer-verzoegert wg. Dokumentwechsel 263 264 if (pScActiveViewShell == this) 265 pScActiveViewShell = NULL; 266 267 bDontSwitch = bOldDontSwitch; 268 } 269 else 270 { 271 HideNoteMarker(); // Notiz-Anzeige 272 273 if ( pHdl ) 274 pHdl->HideTip(); // Formel-AutoEingabe-Tip abschalten 275 } 276 } 277 278 void ScTabViewShell::SetActive() 279 { 280 // Die Sfx-View moechte sich gerne selbst aktivieren, weil dabei noch 281 // magische Dinge geschehen (z.B. stuerzt sonst evtl. der Gestalter ab) 282 ActiveGrabFocus(); 283 284 #if 0 285 SfxViewFrame* pFrame = GetViewFrame(); 286 pFrame->GetFrame().Appear(); 287 288 SFX_APP()->SetViewFrame( pFrame ); // immer erst Appear, dann SetViewFrame (#29290#) 289 #endif 290 } 291 292 sal_uInt16 __EXPORT ScTabViewShell::PrepareClose(sal_Bool bUI, sal_Bool bForBrowsing) 293 { 294 // Call EnterHandler even in formula mode here, 295 // so a formula change in an embedded object isn't lost 296 // (ScDocShell::PrepareClose isn't called then). 297 ScInputHandler* pHdl = SC_MOD()->GetInputHdl( this ); 298 if ( pHdl && pHdl->IsInputMode() ) 299 pHdl->EnterHandler(); 300 301 // #110797# draw text edit mode must be closed 302 FuPoor* pPoor = GetDrawFuncPtr(); 303 if ( pPoor && ( IsDrawTextShell() || pPoor->GetSlotID() == SID_DRAW_NOTEEDIT ) ) 304 { 305 // "clean" end of text edit, including note handling, subshells and draw func switching, 306 // as in FuDraw and ScTabView::DrawDeselectAll 307 GetViewData()->GetDispatcher().Execute( pPoor->GetSlotID(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD ); 308 } 309 ScDrawView* pDrView = GetScDrawView(); 310 if ( pDrView ) 311 { 312 // force end of text edit, to be safe 313 // #128314# ScEndTextEdit must always be used, to ensure correct UndoManager 314 pDrView->ScEndTextEdit(); 315 } 316 317 if ( pFormShell ) 318 { 319 sal_uInt16 nRet = pFormShell->PrepareClose(bUI, bForBrowsing); 320 if (nRet!=sal_True) 321 return nRet; 322 } 323 return SfxViewShell::PrepareClose(bUI,bForBrowsing); 324 } 325 326 //------------------------------------------------------------------ 327 328 Size __EXPORT ScTabViewShell::GetOptimalSizePixel() const 329 { 330 Size aOptSize; 331 332 SCTAB nCurTab = GetViewData()->GetTabNo(); 333 ScDocument* pDoc = GetViewData()->GetDocument(); 334 ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); 335 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( 336 pDoc->GetPageStyle( nCurTab ), 337 SFX_STYLE_FAMILY_PAGE ); 338 339 DBG_ASSERT( pStyleSheet, "PageStyle not found :-/" ); 340 341 if ( pStyleSheet ) 342 { 343 const SfxItemSet& rSet = pStyleSheet->GetItemSet(); 344 const SvxSizeItem& rItem = (const SvxSizeItem&)rSet.Get( ATTR_PAGE_SIZE ); 345 const Size& rPageSize = rItem.GetSize(); 346 347 aOptSize.Width() = (long) (rPageSize.Width() * GetViewData()->GetPPTX()); 348 aOptSize.Height() = (long) (rPageSize.Height() * GetViewData()->GetPPTY()); 349 } 350 351 return aOptSize; 352 } 353 354 //------------------------------------------------------------------ 355 356 // Zoom fuer In-Place berechnen 357 // aus Verhaeltnis von VisArea und Fenstergroesse des GridWin 358 359 void ScTabViewShell::UpdateOleZoom() 360 { 361 ScDocShell* pDocSh = GetViewData()->GetDocShell(); 362 if ( pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED ) 363 { 364 //TODO/LATER: is there a difference between the two GetVisArea methods? 365 Size aObjSize = ((const SfxObjectShell*)pDocSh)->GetVisArea().GetSize(); 366 if ( aObjSize.Width() > 0 && aObjSize.Height() > 0 ) 367 { 368 Window* pWin = GetActiveWin(); 369 Size aWinHMM = pWin->PixelToLogic( pWin->GetOutputSizePixel(), MAP_100TH_MM ); 370 SetZoomFactor( Fraction( aWinHMM.Width(),aObjSize.Width() ), 371 Fraction( aWinHMM.Height(),aObjSize.Height() ) ); 372 } 373 } 374 } 375 376 void __EXPORT ScTabViewShell::AdjustPosSizePixel( const Point &rPos, const Size &rSize ) 377 { 378 OuterResizePixel( rPos, rSize ); 379 } 380 381 void __EXPORT ScTabViewShell::InnerResizePixel( const Point &rOfs, const Size &rSize ) 382 { 383 Size aNewSize( rSize ); 384 if ( GetViewFrame()->GetFrame().IsInPlace() ) 385 { 386 SvBorder aBorder; 387 GetBorderSize( aBorder, rSize ); 388 SetBorderPixel( aBorder ); 389 390 Size aObjSize = GetObjectShell()->GetVisArea().GetSize(); 391 392 Size aSize( rSize ); 393 aSize.Width() -= (aBorder.Left() + aBorder.Right()); 394 aSize.Height() -= (aBorder.Top() + aBorder.Bottom()); 395 396 if ( aObjSize.Width() > 0 && aObjSize.Height() > 0 ) 397 { 398 Size aLogicSize = GetWindow()->PixelToLogic( aSize, MAP_100TH_MM ); 399 SfxViewShell::SetZoomFactor( Fraction( aLogicSize.Width(),aObjSize.Width() ), 400 Fraction( aLogicSize.Height(),aObjSize.Height() ) ); 401 } 402 403 Point aPos( rOfs ); 404 aPos.X() += aBorder.Left(); 405 aPos.Y() += aBorder.Top(); 406 GetWindow()->SetPosSizePixel( aPos, aSize ); 407 } 408 else 409 { 410 SvBorder aBorder; 411 GetBorderSize( aBorder, rSize ); 412 SetBorderPixel( aBorder ); 413 aNewSize.Width() += aBorder.Left() + aBorder.Right(); 414 aNewSize.Height() += aBorder.Top() + aBorder.Bottom(); 415 } 416 417 DoResize( rOfs, aNewSize, sal_True ); // rSize = Groesse von gridwin 418 419 UpdateOleZoom(); // Zoom fuer In-Place berechnen 420 421 // GetViewData()->GetDocShell()->UpdateOle( GetViewData() ); 422 GetViewData()->GetDocShell()->SetDocumentModified(); 423 } 424 425 void __EXPORT ScTabViewShell::OuterResizePixel( const Point &rOfs, const Size &rSize ) 426 { 427 SvBorder aBorder; 428 GetBorderSize( aBorder, rSize ); 429 SetBorderPixel( aBorder ); 430 431 DoResize( rOfs, rSize ); // Position und Groesse von tabview wie uebergeben 432 433 // ForceMove als Ersatz fuer den Sfx-Move-Mechanismus 434 // (aWinPos muss aktuell gehalten werden, damit ForceMove beim Ole-Deaktivieren klappt) 435 436 ForceMove(); 437 } 438 439 void __EXPORT ScTabViewShell::SetZoomFactor( const Fraction &rZoomX, const Fraction &rZoomY ) 440 { 441 // fuer OLE... 442 443 Fraction aFrac20( 1,5 ); 444 Fraction aFrac400( 4,1 ); 445 446 Fraction aNewX( rZoomX ); 447 if ( aNewX < aFrac20 ) 448 aNewX = aFrac20; 449 if ( aNewX > aFrac400 ) 450 aNewX = aFrac400; 451 Fraction aNewY( rZoomY ); 452 if ( aNewY < aFrac20 ) 453 aNewY = aFrac20; 454 if ( aNewY > aFrac400 ) 455 aNewY = aFrac400; 456 457 GetViewData()->UpdateScreenZoom( aNewX, aNewY ); 458 SetZoom( aNewX, aNewY, sal_True ); 459 460 PaintGrid(); 461 PaintTop(); 462 PaintLeft(); 463 464 SfxViewShell::SetZoomFactor( rZoomX, rZoomY ); 465 } 466 467 void __EXPORT ScTabViewShell::QueryObjAreaPixel( Rectangle& rRect ) const 468 { 469 // auf ganze Zellen anpassen (in 1/100 mm) 470 471 Size aPixelSize = rRect.GetSize(); 472 Window* pWin = ((ScTabViewShell*)this)->GetActiveWin(); 473 Size aLogicSize = pWin->PixelToLogic( aPixelSize ); 474 475 const ScViewData* pViewData = GetViewData(); 476 ScDocument* pDoc = pViewData->GetDocument(); 477 ScSplitPos ePos = pViewData->GetActivePart(); 478 SCCOL nCol = pViewData->GetPosX(WhichH(ePos)); 479 SCROW nRow = pViewData->GetPosY(WhichV(ePos)); 480 SCTAB nTab = pViewData->GetTabNo(); 481 sal_Bool bNegativePage = pDoc->IsNegativePage( nTab ); 482 483 Rectangle aLogicRect = pDoc->GetMMRect( nCol, nRow, nCol, nRow, nTab ); 484 if ( bNegativePage ) 485 { 486 // use right edge of aLogicRect, and aLogicSize 487 aLogicRect.Left() = aLogicRect.Right() - aLogicSize.Width() + 1; // Right() is set below 488 } 489 aLogicRect.SetSize( aLogicSize ); 490 491 pDoc->SnapVisArea( aLogicRect ); 492 493 rRect.SetSize( pWin->LogicToPixel( aLogicRect.GetSize() ) ); 494 495 #if 0 496 // auf ganze Zellen anpassen (in Pixeln) 497 498 ScViewData* pViewData = ((ScTabViewShell*)this)->GetViewData(); 499 Size aSize = rRect.GetSize(); 500 501 ScSplitPos ePos = pViewData->GetActivePart(); 502 Window* pWin = ((ScTabViewShell*)this)->GetActiveWin(); 503 504 Point aTest( aSize.Width(), aSize.Height() ); 505 SCsCOL nPosX; 506 SCsROW nPosY; 507 pViewData->GetPosFromPixel( aTest.X(), aTest.Y(), ePos, nPosX, nPosY ); 508 sal_Bool bLeft; 509 sal_Bool bTop; 510 pViewData->GetMouseQuadrant( aTest, ePos, nPosX, nPosY, bLeft, bTop ); 511 if (!bLeft) 512 ++nPosX; 513 if (!bTop) 514 ++nPosY; 515 aTest = pViewData->GetScrPos( (SCCOL)nPosX, (SCROW)nPosY, ePos, sal_True ); 516 517 rRect.SetSize(Size(aTest.X(),aTest.Y())); 518 #endif 519 } 520 521 //------------------------------------------------------------------ 522 523 void __EXPORT ScTabViewShell::Move() 524 { 525 Point aNewPos = GetViewFrame()->GetWindow().OutputToScreenPixel(Point()); 526 527 if (aNewPos != aWinPos) 528 { 529 StopMarking(); 530 aWinPos = aNewPos; 531 } 532 } 533 534 //------------------------------------------------------------------ 535 536 void __EXPORT ScTabViewShell::ShowCursor(FASTBOOL /* bOn */) 537 { 538 /*!!! ShowCursor wird nicht paarweise wie im gridwin gerufen. 539 Der CursorLockCount am Gridwin muss hier direkt auf 0 gesetzt werden 540 541 if (bOn) 542 ShowAllCursors(); 543 else 544 HideAllCursors(); 545 */ 546 } 547 548 //------------------------------------------------------------------ 549 550 void __EXPORT ScTabViewShell::WriteUserData(String& rData, sal_Bool /* bBrowse */) 551 { 552 GetViewData()->WriteUserData(rData); 553 } 554 555 void ScTabViewShell::WriteUserDataSequence (uno::Sequence < beans::PropertyValue >& rSettings, sal_Bool /* bBrowse */ ) 556 { 557 GetViewData()->WriteUserDataSequence (rSettings); 558 } 559 560 void __EXPORT ScTabViewShell::ReadUserData(const String& rData, sal_Bool /* bBrowse */) 561 { 562 if ( !GetViewData()->GetDocShell()->IsPreview() ) 563 DoReadUserData( rData ); 564 } 565 566 void ScTabViewShell::ReadUserDataSequence (const uno::Sequence < beans::PropertyValue >& rSettings, sal_Bool /* bBrowse */ ) 567 { 568 if ( !GetViewData()->GetDocShell()->IsPreview() ) 569 DoReadUserDataSequence( rSettings ); 570 } 571 572 void ScTabViewShell::DoReadUserDataSequence( const uno::Sequence < beans::PropertyValue >& rSettings ) 573 { 574 Window* pOldWin = GetActiveWin(); 575 sal_Bool bFocus = pOldWin && pOldWin->HasFocus(); 576 577 GetViewData()->ReadUserDataSequence(rSettings); 578 SetTabNo( GetViewData()->GetTabNo(), sal_True ); 579 580 if ( GetViewData()->IsPagebreakMode() ) 581 SetCurSubShell( GetCurObjectSelectionType(), sal_True ); 582 583 Window* pNewWin = GetActiveWin(); 584 if (pNewWin && pNewWin != pOldWin) 585 { 586 SetWindow( pNewWin ); //! ist diese ViewShell immer aktiv??? 587 if (bFocus) 588 pNewWin->GrabFocus(); 589 WindowChanged(); // Drawing-Layer (z.B. #56771#) 590 } 591 592 if (GetViewData()->GetHSplitMode() == SC_SPLIT_FIX || 593 GetViewData()->GetVSplitMode() == SC_SPLIT_FIX) 594 { 595 InvalidateSplit(); 596 } 597 598 ZoomChanged(); 599 600 TestHintWindow(); 601 602 //! if ViewData has more tables than document, remove tables in ViewData 603 } 604 605 // DoReadUserData is also called from ctor when switching from print preview 606 607 void ScTabViewShell::DoReadUserData( const String& rData ) 608 { 609 Window* pOldWin = GetActiveWin(); 610 sal_Bool bFocus = pOldWin && pOldWin->HasFocus(); 611 612 GetViewData()->ReadUserData(rData); 613 SetTabNo( GetViewData()->GetTabNo(), sal_True ); 614 615 if ( GetViewData()->IsPagebreakMode() ) 616 SetCurSubShell( GetCurObjectSelectionType(), sal_True ); 617 618 Window* pNewWin = GetActiveWin(); 619 if (pNewWin && pNewWin != pOldWin) 620 { 621 SetWindow( pNewWin ); //! ist diese ViewShell immer aktiv??? 622 if (bFocus) 623 pNewWin->GrabFocus(); 624 WindowChanged(); // Drawing-Layer (z.B. #56771#) 625 } 626 627 if (GetViewData()->GetHSplitMode() == SC_SPLIT_FIX || 628 GetViewData()->GetVSplitMode() == SC_SPLIT_FIX) 629 { 630 InvalidateSplit(); 631 } 632 633 ZoomChanged(); 634 635 TestHintWindow(); 636 637 //! if ViewData has more tables than document, remove tables in ViewData 638 } 639 640 //------------------------------------------------------------------ 641 642 void ScTabViewShell::UpdateDrawShell() 643 { 644 // Called after user interaction that may delete the selected drawing object. 645 // Remove DrawShell if nothing is selected. 646 647 SdrView* pDrView = GetSdrView(); 648 if ( pDrView && !pDrView->AreObjectsMarked() && !IsDrawSelMode() ) 649 SetDrawShell( sal_False ); 650 } 651 652 void ScTabViewShell::SetDrawShellOrSub() 653 { 654 bActiveDrawSh = sal_True; 655 656 if(bActiveDrawFormSh) 657 { 658 SetCurSubShell(OST_DrawForm); 659 } 660 else if(bActiveGraphicSh) 661 { 662 SetCurSubShell(OST_Graphic); 663 } 664 else if(bActiveMediaSh) 665 { 666 SetCurSubShell(OST_Media); 667 } 668 else if(bActiveChartSh) 669 { 670 SetCurSubShell(OST_Chart); 671 } 672 else if(bActiveOleObjectSh) 673 { 674 SetCurSubShell(OST_OleObject); 675 } 676 else 677 { 678 SetCurSubShell(OST_Drawing, true /* force: different toolbars are 679 visible concerning shape type 680 and shape state */); 681 } 682 } 683 684 void ScTabViewShell::SetDrawShell( sal_Bool bActive ) 685 { 686 if(bActive) 687 { 688 SetCurSubShell(OST_Drawing, true /* force: different toolbars are 689 visible concerning shape type 690 and shape state */); 691 } 692 else 693 { 694 if(bActiveDrawFormSh || bActiveDrawSh || 695 bActiveGraphicSh || bActiveMediaSh || bActiveOleObjectSh|| 696 bActiveChartSh || bActiveDrawTextSh) 697 { 698 SetCurSubShell(OST_Cell); 699 } 700 bActiveDrawFormSh=sal_False; 701 bActiveGraphicSh=sal_False; 702 bActiveMediaSh=sal_False; 703 bActiveOleObjectSh=sal_False; 704 bActiveChartSh=sal_False; 705 } 706 707 sal_Bool bWasDraw = bActiveDrawSh || bActiveDrawTextSh; 708 709 bActiveDrawSh = bActive; 710 bActiveDrawTextSh = sal_False; 711 712 if ( !bActive ) 713 { 714 ResetDrawDragMode(); // Mirror / Rotate aus 715 716 if (bWasDraw && (GetViewData()->GetHSplitMode() == SC_SPLIT_FIX || 717 GetViewData()->GetVSplitMode() == SC_SPLIT_FIX)) 718 { 719 // Aktiven Teil an Cursor anpassen, etc. 720 MoveCursorAbs( GetViewData()->GetCurX(), GetViewData()->GetCurY(), 721 SC_FOLLOW_NONE, sal_False, sal_False, sal_True ); 722 } 723 } 724 } 725 726 void ScTabViewShell::SetDrawTextShell( sal_Bool bActive ) 727 { 728 bActiveDrawTextSh = bActive; 729 if ( bActive ) 730 { 731 bActiveDrawFormSh=sal_False; 732 bActiveGraphicSh=sal_False; 733 bActiveMediaSh=sal_False; 734 bActiveOleObjectSh=sal_False; 735 bActiveChartSh=sal_False; 736 bActiveDrawSh = sal_False; 737 SetCurSubShell(OST_DrawText); 738 } 739 else 740 SetCurSubShell(OST_Cell); 741 742 } 743 744 void ScTabViewShell::SetPivotShell( sal_Bool bActive ) 745 { 746 bActivePivotSh = bActive; 747 748 // #68771# #76198# SetPivotShell is called from CursorPosChanged every time 749 // -> don't change anything except switching between cell and pivot shell 750 751 if ( eCurOST == OST_Pivot || eCurOST == OST_Cell ) 752 { 753 if ( bActive ) 754 { 755 bActiveDrawTextSh = bActiveDrawSh = sal_False; 756 bActiveDrawFormSh=sal_False; 757 bActiveGraphicSh=sal_False; 758 bActiveMediaSh=sal_False; 759 bActiveOleObjectSh=sal_False; 760 bActiveChartSh=sal_False; 761 SetCurSubShell(OST_Pivot); 762 } 763 else 764 SetCurSubShell(OST_Cell); 765 } 766 } 767 768 void ScTabViewShell::SetAuditShell( sal_Bool bActive ) 769 { 770 bActiveAuditingSh = bActive; 771 if ( bActive ) 772 { 773 bActiveDrawTextSh = bActiveDrawSh = sal_False; 774 bActiveDrawFormSh=sal_False; 775 bActiveGraphicSh=sal_False; 776 bActiveMediaSh=sal_False; 777 bActiveOleObjectSh=sal_False; 778 bActiveChartSh=sal_False; 779 SetCurSubShell(OST_Auditing); 780 } 781 else 782 SetCurSubShell(OST_Cell); 783 } 784 785 void ScTabViewShell::SetDrawFormShell( sal_Bool bActive ) 786 { 787 bActiveDrawFormSh = bActive; 788 789 if(bActiveDrawFormSh) 790 SetCurSubShell(OST_DrawForm); 791 } 792 void ScTabViewShell::SetChartShell( sal_Bool bActive ) 793 { 794 bActiveChartSh = bActive; 795 796 if(bActiveChartSh) 797 SetCurSubShell(OST_Chart); 798 } 799 800 void ScTabViewShell::SetGraphicShell( sal_Bool bActive ) 801 { 802 bActiveGraphicSh = bActive; 803 804 if(bActiveGraphicSh) 805 SetCurSubShell(OST_Graphic); 806 } 807 808 void ScTabViewShell::SetMediaShell( sal_Bool bActive ) 809 { 810 bActiveMediaSh = bActive; 811 812 if(bActiveMediaSh) 813 SetCurSubShell(OST_Media); 814 } 815 816 void ScTabViewShell::SetOleObjectShell( sal_Bool bActive ) 817 { 818 bActiveOleObjectSh = bActive; 819 820 if(bActiveOleObjectSh) 821 SetCurSubShell(OST_OleObject); 822 else 823 SetCurSubShell(OST_Cell); 824 } 825 826 void ScTabViewShell::SetEditShell(EditView* pView, sal_Bool bActive ) 827 { 828 if(bActive) 829 { 830 if (pEditShell) 831 pEditShell->SetEditView( pView ); 832 else 833 pEditShell = new ScEditShell( pView, GetViewData() ); 834 835 SetCurSubShell(OST_Editing); 836 } 837 else if(bActiveEditSh) 838 { 839 SetCurSubShell(OST_Cell); 840 } 841 bActiveEditSh = bActive; 842 } 843 844 void ScTabViewShell::SetCurSubShell(ObjectSelectionType eOST, sal_Bool bForce) 845 { 846 ScViewData* pViewData = GetViewData(); 847 ScDocShell* pDocSh = pViewData->GetDocShell(); 848 849 if(bDontSwitch) return; 850 851 if(!pCellShell) //Wird eh immer gebraucht. 852 { 853 pCellShell = new ScCellShell( GetViewData() ); 854 pCellShell->SetRepeatTarget( &aTarget ); 855 } 856 857 sal_Bool bPgBrk=pViewData->IsPagebreakMode(); 858 859 if(bPgBrk && !pPageBreakShell) 860 { 861 pPageBreakShell = new ScPageBreakShell( this ); 862 pPageBreakShell->SetRepeatTarget( &aTarget ); 863 } 864 865 866 if ( eOST!=eCurOST || bForce ) 867 { 868 sal_Bool bCellBrush = sal_False; // "format paint brush" allowed for cells 869 sal_Bool bDrawBrush = sal_False; // "format paint brush" allowed for drawing objects 870 871 if(eCurOST!=OST_NONE) RemoveSubShell(); 872 873 if (pFormShell && !bFormShellAtTop) 874 AddSubShell(*pFormShell); // add below own subshells 875 876 switch(eOST) 877 { 878 case OST_Cell: 879 { 880 AddSubShell(*pCellShell); 881 if(bPgBrk) AddSubShell(*pPageBreakShell); 882 bCellBrush = sal_True; 883 } 884 break; 885 case OST_Editing: 886 { 887 AddSubShell(*pCellShell); 888 if(bPgBrk) AddSubShell(*pPageBreakShell); 889 890 if(pEditShell) 891 { 892 AddSubShell(*pEditShell); 893 } 894 } 895 break; 896 case OST_DrawText: 897 { 898 if ( !pDrawTextShell ) 899 { 900 pDocSh->MakeDrawLayer(); 901 pDrawTextShell = new ScDrawTextObjectBar( GetViewData() ); 902 } 903 AddSubShell(*pDrawTextShell); 904 } 905 break; 906 case OST_Drawing: 907 { 908 if (svx::checkForSelectedCustomShapes( 909 GetScDrawView(), true /* bOnlyExtruded */ )) { 910 if (pExtrusionBarShell == 0) 911 pExtrusionBarShell = new svx::ExtrusionBar(this); 912 AddSubShell( *pExtrusionBarShell ); 913 } 914 sal_uInt32 nCheckStatus = 0; 915 if (svx::checkForSelectedFontWork( 916 GetScDrawView(), nCheckStatus )) { 917 if (pFontworkBarShell == 0) 918 pFontworkBarShell = new svx::FontworkBar(this); 919 AddSubShell( *pFontworkBarShell ); 920 } 921 922 if ( !pDrawShell ) 923 { 924 pDocSh->MakeDrawLayer(); 925 pDrawShell = new ScDrawShell( GetViewData() ); 926 pDrawShell->SetRepeatTarget( &aTarget ); 927 } 928 AddSubShell(*pDrawShell); 929 bDrawBrush = sal_True; 930 } 931 break; 932 933 case OST_DrawForm: 934 { 935 if ( !pDrawFormShell ) 936 { 937 pDocSh->MakeDrawLayer(); 938 pDrawFormShell = new ScDrawFormShell( GetViewData() ); 939 pDrawFormShell->SetRepeatTarget( &aTarget ); 940 } 941 AddSubShell(*pDrawFormShell); 942 bDrawBrush = sal_True; 943 } 944 break; 945 946 case OST_Chart: 947 { 948 if ( !pChartShell ) 949 { 950 pDocSh->MakeDrawLayer(); 951 pChartShell = new ScChartShell( GetViewData() ); 952 pChartShell->SetRepeatTarget( &aTarget ); 953 } 954 AddSubShell(*pChartShell); 955 bDrawBrush = sal_True; 956 } 957 break; 958 959 case OST_OleObject: 960 { 961 if ( !pOleObjectShell ) 962 { 963 pDocSh->MakeDrawLayer(); 964 pOleObjectShell = new ScOleObjectShell( GetViewData() ); 965 pOleObjectShell->SetRepeatTarget( &aTarget ); 966 } 967 AddSubShell(*pOleObjectShell); 968 bDrawBrush = sal_True; 969 } 970 break; 971 972 case OST_Graphic: 973 { 974 if ( !pGraphicShell) 975 { 976 pDocSh->MakeDrawLayer(); 977 pGraphicShell = new ScGraphicShell( GetViewData() ); 978 pGraphicShell->SetRepeatTarget( &aTarget ); 979 } 980 AddSubShell(*pGraphicShell); 981 bDrawBrush = sal_True; 982 } 983 break; 984 985 case OST_Media: 986 { 987 if ( !pMediaShell) 988 { 989 pDocSh->MakeDrawLayer(); 990 pMediaShell = new ScMediaShell( GetViewData() ); 991 pMediaShell->SetRepeatTarget( &aTarget ); 992 } 993 AddSubShell(*pMediaShell); 994 } 995 break; 996 997 case OST_Pivot: 998 { 999 AddSubShell(*pCellShell); 1000 if(bPgBrk) AddSubShell(*pPageBreakShell); 1001 1002 if ( !pPivotShell ) 1003 { 1004 pPivotShell = new ScPivotShell( this ); 1005 pPivotShell->SetRepeatTarget( &aTarget ); 1006 } 1007 AddSubShell(*pPivotShell); 1008 bCellBrush = sal_True; 1009 } 1010 break; 1011 case OST_Auditing: 1012 { 1013 AddSubShell(*pCellShell); 1014 if(bPgBrk) AddSubShell(*pPageBreakShell); 1015 1016 if ( !pAuditingShell ) 1017 { 1018 pDocSh->MakeDrawLayer(); // die Wartezeit lieber jetzt als beim Klick 1019 1020 pAuditingShell = new ScAuditingShell( GetViewData() ); 1021 pAuditingShell->SetRepeatTarget( &aTarget ); 1022 } 1023 AddSubShell(*pAuditingShell); 1024 bCellBrush = sal_True; 1025 } 1026 break; 1027 default: 1028 DBG_ERROR("Falsche Shell angefordert"); 1029 break; 1030 } 1031 1032 if (pFormShell && bFormShellAtTop) 1033 AddSubShell(*pFormShell); // add on top of own subshells 1034 1035 eCurOST=eOST; 1036 1037 // abort "format paint brush" when switching to an incompatible shell 1038 if ( ( GetBrushDocument() && !bCellBrush ) || ( GetDrawBrushSet() && !bDrawBrush ) ) 1039 ResetBrushDocument(); 1040 } 1041 } 1042 1043 void ScTabViewShell::SetFormShellAtTop( sal_Bool bSet ) 1044 { 1045 if ( pFormShell && !bSet ) 1046 pFormShell->ForgetActiveControl(); // let the FormShell know it no longer has the focus 1047 1048 if ( bFormShellAtTop != bSet ) 1049 { 1050 bFormShellAtTop = bSet; 1051 SetCurSubShell( GetCurObjectSelectionType(), sal_True ); 1052 } 1053 } 1054 1055 IMPL_LINK( ScTabViewShell, FormControlActivated, FmFormShell*, EMPTYARG ) 1056 { 1057 // a form control got the focus, so the form shell has to be on top 1058 SetFormShellAtTop( sal_True ); 1059 return 0; 1060 } 1061 1062 ObjectSelectionType ScTabViewShell::GetCurObjectSelectionType() 1063 { 1064 return eCurOST; 1065 } 1066 1067 // GetMySubShell / SetMySubShell: altes Verhalten simulieren, 1068 // dass es nur eine SubShell gibt (nur innerhalb der 5 eignenen SubShells) 1069 1070 SfxShell* ScTabViewShell::GetMySubShell() const 1071 { 1072 // GetSubShell() war frueher const, und GetSubShell(sal_uInt16) sollte es auch sein... 1073 1074 sal_uInt16 nPos = 0; 1075 SfxShell* pSub = ((ScTabViewShell*)this)->GetSubShell(nPos); 1076 while (pSub) 1077 { 1078 if ( pSub == pDrawShell || pSub == pDrawTextShell || pSub == pEditShell || 1079 pSub == pPivotShell || pSub == pAuditingShell || pSub == pDrawFormShell || 1080 pSub == pCellShell || pSub == pOleObjectShell|| pSub == pChartShell || 1081 pSub == pGraphicShell || pSub == pMediaShell || pSub == pPageBreakShell) 1082 return pSub; // gefunden 1083 1084 pSub = ((ScTabViewShell*)this)->GetSubShell(++nPos); 1085 } 1086 return NULL; // keine von meinen dabei 1087 } 1088 1089 //UNUSED2008-05 void ScTabViewShell::SetMySubShell( SfxShell* pShell ) 1090 //UNUSED2008-05 { 1091 //UNUSED2008-05 SfxShell* pOld = GetMySubShell(); 1092 //UNUSED2008-05 if ( pOld != pShell ) 1093 //UNUSED2008-05 { 1094 //UNUSED2008-05 if (pOld) 1095 //UNUSED2008-05 RemoveSubShell(pOld); // alte SubShell entfernen 1096 //UNUSED2008-05 if (pShell) 1097 //UNUSED2008-05 AddSubShell(*pShell); // neue setzen 1098 //UNUSED2008-05 } 1099 //UNUSED2008-05 } 1100 1101 sal_Bool ScTabViewShell::IsDrawTextShell() const 1102 { 1103 return ( pDrawTextShell && ( GetMySubShell() == pDrawTextShell ) ); 1104 } 1105 1106 sal_Bool ScTabViewShell::IsAuditShell() const 1107 { 1108 return ( pAuditingShell && ( GetMySubShell() == pAuditingShell ) ); 1109 } 1110 1111 void ScTabViewShell::SetDrawTextUndo( ::svl::IUndoManager* pNewUndoMgr ) 1112 { 1113 // Default: Undo-Manager der DocShell 1114 if (!pNewUndoMgr) 1115 pNewUndoMgr = GetViewData()->GetDocShell()->GetUndoManager(); 1116 1117 if (pDrawTextShell) 1118 { 1119 pDrawTextShell->SetUndoManager(pNewUndoMgr); 1120 ScDocShell* pDocSh = GetViewData()->GetDocShell(); 1121 if ( pNewUndoMgr == pDocSh->GetUndoManager() && 1122 !pDocSh->GetDocument()->IsUndoEnabled() ) 1123 { 1124 pNewUndoMgr->SetMaxUndoActionCount( 0 ); 1125 } 1126 } 1127 else 1128 { 1129 DBG_ERROR("SetDrawTextUndo ohne DrawTextShell"); 1130 } 1131 } 1132 1133 //------------------------------------------------------------------ 1134 1135 ScTabViewShell* ScTabViewShell::GetActiveViewShell() 1136 { 1137 return PTR_CAST(ScTabViewShell,Current()); 1138 } 1139 1140 //------------------------------------------------------------------ 1141 1142 SfxPrinter* __EXPORT ScTabViewShell::GetPrinter( sal_Bool bCreate ) 1143 { 1144 // Drucker ist immer da (wird fuer die FontListe schon beim Starten angelegt) 1145 return GetViewData()->GetDocShell()->GetPrinter(bCreate); 1146 } 1147 1148 sal_uInt16 __EXPORT ScTabViewShell::SetPrinter( SfxPrinter *pNewPrinter, sal_uInt16 nDiffFlags, bool ) 1149 { 1150 return GetViewData()->GetDocShell()->SetPrinter( pNewPrinter, nDiffFlags ); 1151 } 1152 1153 SfxTabPage* ScTabViewShell::CreatePrintOptionsPage( Window *pParent, const SfxItemSet &rOptions ) 1154 { 1155 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 1156 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 1157 //CHINA001 return ScTpPrintOptions::Create( pParent, rOptions ); 1158 ::CreateTabPage ScTpPrintOptionsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_PRINT ); 1159 if ( ScTpPrintOptionsCreate ) 1160 return (*ScTpPrintOptionsCreate)( pParent, rOptions); 1161 return 0; 1162 } 1163 1164 void ScTabViewShell::StopEditShell() 1165 { 1166 if ( pEditShell != NULL && !bDontSwitch ) 1167 SetEditShell(NULL, sal_False ); 1168 } 1169 1170 //------------------------------------------------------------------ 1171 1172 // close handler to ensure function of dialog: 1173 1174 IMPL_LINK( ScTabViewShell, SimpleRefClose, String*, EMPTYARG ) 1175 { 1176 SfxInPlaceClient* pClient = GetIPClient(); 1177 if ( pClient && pClient->IsObjectInPlaceActive() ) 1178 { 1179 // If range selection was started with an active embedded object, 1180 // switch back to original sheet (while the dialog is still open). 1181 1182 SetTabNo( GetViewData()->GetRefTabNo() ); 1183 } 1184 1185 ScSimpleRefDlgWrapper::SetAutoReOpen( sal_True ); 1186 return 0; 1187 } 1188 1189 // handlers to call UNO listeners: 1190 1191 ScTabViewObj* lcl_GetViewObj( ScTabViewShell& rShell ) 1192 { 1193 ScTabViewObj* pRet = NULL; 1194 SfxViewFrame* pViewFrame = rShell.GetViewFrame(); 1195 if (pViewFrame) 1196 { 1197 SfxFrame& rFrame = pViewFrame->GetFrame(); 1198 uno::Reference<frame::XController> xController = rFrame.GetController(); 1199 if (xController.is()) 1200 pRet = ScTabViewObj::getImplementation( xController ); 1201 } 1202 return pRet; 1203 } 1204 1205 IMPL_LINK( ScTabViewShell, SimpleRefDone, String*, pResult ) 1206 { 1207 ScTabViewObj* pImpObj = lcl_GetViewObj( *this ); 1208 if ( pImpObj && pResult ) 1209 pImpObj->RangeSelDone( *pResult ); 1210 return 0; 1211 } 1212 1213 IMPL_LINK( ScTabViewShell, SimpleRefAborted, String*, pResult ) 1214 { 1215 ScTabViewObj* pImpObj = lcl_GetViewObj( *this ); 1216 if ( pImpObj && pResult ) 1217 pImpObj->RangeSelAborted( *pResult ); 1218 return 0; 1219 } 1220 1221 IMPL_LINK( ScTabViewShell, SimpleRefChange, String*, pResult ) 1222 { 1223 ScTabViewObj* pImpObj = lcl_GetViewObj( *this ); 1224 if ( pImpObj && pResult ) 1225 pImpObj->RangeSelChanged( *pResult ); 1226 return 0; 1227 } 1228 1229 void ScTabViewShell::StartSimpleRefDialog( 1230 const String& rTitle, const String& rInitVal, 1231 sal_Bool bCloseOnButtonUp, sal_Bool bSingleCell, sal_Bool bMultiSelection ) 1232 { 1233 SfxViewFrame* pViewFrm = GetViewFrame(); 1234 1235 if ( GetActiveViewShell() != this ) 1236 { 1237 // #i18833# / #i34499# The API method can be called for a view that's not active. 1238 // Then the view has to be activated first, the same way as in Execute for SID_CURRENTDOC. 1239 // Can't use GrabFocus here, because it needs to take effect immediately. 1240 1241 pViewFrm->GetFrame().Appear(); 1242 } 1243 1244 sal_uInt16 nId = ScSimpleRefDlgWrapper::GetChildWindowId(); 1245 1246 SC_MOD()->SetRefDialog( nId, sal_True, pViewFrm ); 1247 1248 ScSimpleRefDlgWrapper* pWnd = (ScSimpleRefDlgWrapper*)pViewFrm->GetChildWindow( nId ); 1249 if (pWnd) 1250 { 1251 pWnd->SetCloseHdl( LINK( this, ScTabViewShell, SimpleRefClose ) ); 1252 pWnd->SetUnoLinks( LINK( this, ScTabViewShell, SimpleRefDone ), 1253 LINK( this, ScTabViewShell, SimpleRefAborted ), 1254 LINK( this, ScTabViewShell, SimpleRefChange ) ); 1255 pWnd->SetRefString( rInitVal ); 1256 pWnd->SetFlags( bCloseOnButtonUp, bSingleCell, bMultiSelection ); 1257 pWnd->SetAutoReOpen( sal_False ); 1258 Window* pWin = pWnd->GetWindow(); 1259 pWin->SetText( rTitle ); 1260 pWnd->StartRefInput(); 1261 } 1262 } 1263 1264 void ScTabViewShell::StopSimpleRefDialog() 1265 { 1266 SfxViewFrame* pViewFrm = GetViewFrame(); 1267 sal_uInt16 nId = ScSimpleRefDlgWrapper::GetChildWindowId(); 1268 1269 ScSimpleRefDlgWrapper* pWnd = (ScSimpleRefDlgWrapper*)pViewFrm->GetChildWindow( nId ); 1270 if (pWnd) 1271 { 1272 Window* pWin = pWnd->GetWindow(); 1273 if (pWin && pWin->IsSystemWindow()) 1274 ((SystemWindow*)pWin)->Close(); // calls abort handler 1275 } 1276 } 1277 1278 //------------------------------------------------------------------ 1279 1280 sal_Bool ScTabViewShell::TabKeyInput(const KeyEvent& rKEvt) 1281 { 1282 ScModule* pScMod = SC_MOD(); 1283 1284 SfxViewFrame* pThisFrame = GetViewFrame(); 1285 if ( pThisFrame->GetChildWindow( SID_OPENDLG_FUNCTION ) ) 1286 return sal_False; 1287 1288 KeyCode aCode = rKEvt.GetKeyCode(); 1289 sal_Bool bShift = aCode.IsShift(); 1290 sal_Bool bControl = aCode.IsMod1(); 1291 sal_Bool bAlt = aCode.IsMod2(); 1292 sal_uInt16 nCode = aCode.GetCode(); 1293 sal_Bool bUsed = sal_False; 1294 sal_Bool bInPlace = pScMod->IsEditMode(); // Editengine bekommt alles 1295 sal_Bool bAnyEdit = pScMod->IsInputMode(); // nur Zeichen & Backspace 1296 sal_Bool bDraw = IsDrawTextEdit(); 1297 1298 HideNoteMarker(); // Notiz-Anzeige 1299 1300 // don't do extra HideCursor/ShowCursor calls if EnterHandler will switch to a different sheet 1301 sal_Bool bOnRefSheet = ( GetViewData()->GetRefTabNo() == GetViewData()->GetTabNo() ); 1302 sal_Bool bHideCursor = ( ( nCode == KEY_RETURN && bInPlace ) || nCode == KEY_TAB ) && bOnRefSheet; 1303 1304 if (bHideCursor) 1305 HideAllCursors(); 1306 1307 ScDocument* pDoc = GetViewData()->GetDocument(); 1308 if ( pDoc ) 1309 pDoc->KeyInput( rKEvt ); // TimerDelays etc. 1310 1311 if( bInPlace ) 1312 { 1313 bUsed = pScMod->InputKeyEvent( rKEvt ); // Eingabe 1314 if( !bUsed ) 1315 bUsed = sal::static_int_cast<sal_Bool>(SfxViewShell::KeyInput( rKEvt )); // accelerators 1316 } 1317 else if( bAnyEdit ) 1318 { 1319 sal_Bool bIsType = sal_False; 1320 sal_uInt16 nModi = aCode.GetModifier(); 1321 sal_uInt16 nGroup = aCode.GetGroup(); 1322 1323 if ( nGroup == KEYGROUP_NUM || nGroup == KEYGROUP_ALPHA || nGroup == 0 ) 1324 if ( !bControl && !bAlt ) 1325 bIsType = sal_True; 1326 1327 if ( nGroup == KEYGROUP_MISC ) 1328 switch ( nCode ) 1329 { 1330 case KEY_RETURN: 1331 bIsType = bControl && !bAlt; // Control, Shift-Control-Return 1332 if ( !bIsType && nModi == 0 ) 1333 { 1334 // Will der InputHandler auch ein einfaches Return? 1335 1336 ScInputHandler* pHdl = pScMod->GetInputHdl(this); 1337 bIsType = pHdl && pHdl->TakesReturn(); 1338 } 1339 break; 1340 case KEY_SPACE: 1341 bIsType = !bControl && !bAlt; // ohne Modifier oder Shift-Space 1342 break; 1343 case KEY_ESCAPE: 1344 case KEY_BACKSPACE: 1345 bIsType = (nModi == 0); // nur ohne Modifier 1346 break; 1347 default: 1348 bIsType = sal_True; 1349 } 1350 1351 if( bIsType ) 1352 bUsed = pScMod->InputKeyEvent( rKEvt ); // Eingabe 1353 1354 if( !bUsed ) 1355 bUsed = sal::static_int_cast<sal_Bool>(SfxViewShell::KeyInput( rKEvt )); // accelerators 1356 1357 if ( !bUsed && !bIsType && nCode != KEY_RETURN ) // Eingabe nochmal hinterher 1358 bUsed = pScMod->InputKeyEvent( rKEvt ); 1359 } 1360 else 1361 { 1362 // #51889# Spezialfall: Copy/Cut bei Mehrfachselektion -> Fehlermeldung 1363 // (Slot ist disabled, SfxViewShell::KeyInput wuerde also kommentarlos verschluckt) 1364 KeyFuncType eFunc = aCode.GetFunction(); 1365 if ( eFunc == KEYFUNC_CUT ) 1366 { 1367 ScRange aDummy; 1368 ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy ); 1369 if ( eMarkType != SC_MARK_SIMPLE && 1370 !(eFunc == KEYFUNC_COPY && eMarkType == SC_MARK_SIMPLE_FILTERED) ) 1371 { 1372 ErrorMessage(STR_NOMULTISELECT); 1373 bUsed = sal_True; 1374 } 1375 } 1376 if (!bUsed) 1377 bUsed = sal::static_int_cast<sal_Bool>(SfxViewShell::KeyInput( rKEvt )); // accelerators 1378 1379 // #74696# during inplace editing, some slots are handled by the 1380 // container app and are executed during Window::KeyInput. 1381 // -> don't pass keys to input handler that would be used there 1382 // but should call slots instead. 1383 sal_Bool bParent = ( GetViewFrame()->GetFrame().IsInPlace() && eFunc != KEYFUNC_DONTKNOW ); 1384 1385 if( !bUsed && !bDraw && nCode != KEY_RETURN && !bParent ) 1386 bUsed = pScMod->InputKeyEvent( rKEvt, sal_True ); // Eingabe 1387 } 1388 1389 if (!bInPlace && !bUsed && !bDraw) 1390 { 1391 switch (nCode) 1392 { 1393 case KEY_RETURN: 1394 { 1395 sal_Bool bNormal = !bControl && !bAlt; 1396 if ( !bAnyEdit && bNormal ) 1397 { 1398 // je nach Optionen mit Enter in den Edit-Modus schalten 1399 1400 const ScInputOptions& rOpt = pScMod->GetInputOptions(); 1401 if ( rOpt.GetEnterEdit() ) 1402 { 1403 pScMod->SetInputMode( SC_INPUT_TABLE ); 1404 bUsed = sal_True; 1405 } 1406 } 1407 1408 sal_Bool bEditReturn = bControl && !bShift; // An Edit-Engine weiter 1409 if ( !bUsed && !bEditReturn ) 1410 { 1411 if ( bOnRefSheet ) 1412 HideAllCursors(); 1413 1414 sal_uInt8 nMode = SC_ENTER_NORMAL; 1415 if ( bShift && bControl ) 1416 nMode = SC_ENTER_MATRIX; 1417 else if ( bAlt ) 1418 nMode = SC_ENTER_BLOCK; 1419 pScMod->InputEnterHandler(nMode); 1420 1421 if (nMode == SC_ENTER_NORMAL) 1422 { 1423 if( bShift ) 1424 GetViewData()->GetDispatcher().Execute( SID_CURSORENTERUP, 1425 SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD ); 1426 else 1427 GetViewData()->GetDispatcher().Execute( SID_CURSORENTERDOWN, 1428 SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD ); 1429 } 1430 else 1431 UpdateInputHandler(sal_True); 1432 1433 if ( bOnRefSheet ) 1434 ShowAllCursors(); 1435 1436 // hier kein UpdateInputHandler, weil bei Referenzeingabe auf ein 1437 // anderes Dokument diese ViewShell nicht die ist, auf der eingegeben 1438 // wird! 1439 1440 bUsed = sal_True; 1441 } 1442 } 1443 break; 1444 } 1445 } 1446 1447 // Alt-Cursortasten hart codiert, weil Alt nicht konfigurierbar ist 1448 1449 if ( !bUsed && bAlt && !bControl ) 1450 { 1451 sal_uInt16 nSlotId = 0; 1452 switch (nCode) 1453 { 1454 case KEY_UP: 1455 ModifyCellSize( DIR_TOP, bShift ); 1456 bUsed = sal_True; 1457 break; 1458 case KEY_DOWN: 1459 ModifyCellSize( DIR_BOTTOM, bShift ); 1460 bUsed = sal_True; 1461 break; 1462 case KEY_LEFT: 1463 ModifyCellSize( DIR_LEFT, bShift ); 1464 bUsed = sal_True; 1465 break; 1466 case KEY_RIGHT: 1467 ModifyCellSize( DIR_RIGHT, bShift ); 1468 bUsed = sal_True; 1469 break; 1470 case KEY_PAGEUP: 1471 nSlotId = bShift ? SID_CURSORPAGELEFT_SEL : SID_CURSORPAGELEFT_; 1472 break; 1473 case KEY_PAGEDOWN: 1474 nSlotId = bShift ? SID_CURSORPAGERIGHT_SEL : SID_CURSORPAGERIGHT_; 1475 break; 1476 } 1477 if ( nSlotId ) 1478 { 1479 GetViewData()->GetDispatcher().Execute( nSlotId, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD ); 1480 bUsed = sal_True; 1481 } 1482 } 1483 1484 if (bHideCursor) 1485 ShowAllCursors(); 1486 1487 return bUsed; 1488 } 1489 1490 sal_Bool ScTabViewShell::SfxKeyInput(const KeyEvent& rKeyEvent) 1491 { 1492 return sal::static_int_cast<sal_Bool>(SfxViewShell::KeyInput( rKeyEvent )); 1493 } 1494 1495 FASTBOOL __EXPORT ScTabViewShell::KeyInput( const KeyEvent &rKeyEvent ) 1496 { 1497 // return SfxViewShell::KeyInput( rKeyEvent ); 1498 return TabKeyInput( rKeyEvent ); 1499 } 1500 1501 //------------------------------------------------------------------ 1502 1503 #define __INIT_ScTabViewShell \ 1504 eCurOST(OST_NONE), \ 1505 nDrawSfxId(0), \ 1506 nCtrlSfxId(USHRT_MAX), \ 1507 nFormSfxId(USHRT_MAX), \ 1508 pDrawShell(NULL), \ 1509 pDrawTextShell(NULL), \ 1510 pEditShell(NULL), \ 1511 pPivotShell(NULL), \ 1512 pAuditingShell(NULL), \ 1513 pDrawFormShell(NULL), \ 1514 pCellShell(NULL), \ 1515 pOleObjectShell(NULL), \ 1516 pChartShell(NULL), \ 1517 pGraphicShell(NULL), \ 1518 pMediaShell(NULL), \ 1519 pPageBreakShell(NULL), \ 1520 pExtrusionBarShell(NULL), \ 1521 pFontworkBarShell(NULL), \ 1522 pFormShell(NULL), \ 1523 pInputHandler(NULL), \ 1524 pCurFrameLine(NULL), \ 1525 aTarget( this ), \ 1526 pDialogDPObject(NULL), \ 1527 pNavSettings(NULL), \ 1528 bActiveDrawSh(sal_False), \ 1529 bActiveDrawTextSh(sal_False), \ 1530 bActivePivotSh(sal_False), \ 1531 bActiveAuditingSh(sal_False), \ 1532 bActiveDrawFormSh(sal_False), \ 1533 bActiveOleObjectSh(sal_False), \ 1534 bActiveChartSh(sal_False), \ 1535 bActiveGraphicSh(sal_False), \ 1536 bActiveMediaSh(sal_False), \ 1537 bActiveEditSh(sal_False), \ 1538 bFormShellAtTop(sal_False), \ 1539 bDontSwitch(sal_False), \ 1540 bInFormatDialog(sal_False), \ 1541 bPrintSelected(sal_False), \ 1542 bReadOnly(sal_False), \ 1543 pScSbxObject(NULL), \ 1544 /*bChartDlgIsEdit(sal_False),*/ \ 1545 bChartAreaValid(sal_False), \ 1546 nCurRefDlgId(0), \ 1547 pAccessibilityBroadcaster(NULL) 1548 1549 1550 //------------------------------------------------------------------ 1551 1552 void ScTabViewShell::Construct( sal_uInt8 nForceDesignMode ) 1553 { 1554 SfxApplication* pSfxApp = SFX_APP(); 1555 ScDocShell* pDocSh = GetViewData()->GetDocShell(); 1556 ScDocument* pDoc = pDocSh->GetDocument(); 1557 1558 bReadOnly = pDocSh->IsReadOnly(); 1559 1560 SetName( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("View")) ); // fuer SBX 1561 Color aColBlack( COL_BLACK ); 1562 // SetPool( &pSfxApp->GetPool() ); 1563 SetPool( &SC_MOD()->GetPool() ); 1564 SetWindow( GetActiveWin() ); 1565 1566 pCurFrameLine = new SvxBorderLine( &aColBlack, 20, 0, 0 ); 1567 pPivotSource = new ScArea; 1568 StartListening(*GetViewData()->GetDocShell(),sal_True); 1569 StartListening(*GetViewFrame(),sal_True); 1570 StartListening(*pSfxApp,sal_True); // #i62045# #i62046# application is needed for Calc's own hints 1571 1572 SfxViewFrame* pFirst = SfxViewFrame::GetFirst(pDocSh); 1573 sal_Bool bFirstView = !pFirst 1574 || (pFirst == GetViewFrame() && !SfxViewFrame::GetNext(*pFirst,pDocSh)); 1575 1576 if ( pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED ) 1577 { 1578 //TODO/LATER: is there a difference between the two GetVisArea methods? 1579 Rectangle aVisArea = ((const SfxObjectShell*)pDocSh)->GetVisArea(); 1580 1581 SCTAB nVisTab = pDoc->GetVisibleTab(); 1582 if (!pDoc->HasTable(nVisTab)) 1583 { 1584 nVisTab = 0; 1585 pDoc->SetVisibleTab(nVisTab); 1586 } 1587 SetTabNo( nVisTab ); 1588 sal_Bool bNegativePage = pDoc->IsNegativePage( nVisTab ); 1589 // show the right cells 1590 GetViewData()->SetScreenPos( bNegativePage ? aVisArea.TopRight() : aVisArea.TopLeft() ); 1591 1592 if ( GetViewFrame()->GetFrame().IsInPlace() ) // inplace 1593 { 1594 pDocSh->SetInplace( sal_True ); // schon so initialisiert 1595 if (pDoc->IsEmbedded()) 1596 pDoc->ResetEmbedded(); // keine blaue Markierung 1597 } 1598 else if ( bFirstView ) 1599 { 1600 pDocSh->SetInplace( sal_False ); 1601 GetViewData()->RefreshZoom(); // recalculate PPT 1602 if (!pDoc->IsEmbedded()) 1603 pDoc->SetEmbedded( aVisArea ); // VisArea markieren 1604 } 1605 } 1606 1607 // ViewInputHandler 1608 // #48721# jeder Task hat neuerdings sein eigenes InputWindow, 1609 // darum muesste eigentlich entweder jeder Task seinen InputHandler bekommen, 1610 // oder das InputWindow muesste sich beim App-InputHandler anmelden, wenn der 1611 // Task aktiv wird, oder das InputWindow muesste sich den InputHandler selbst 1612 // anlegen (dann immer ueber das InputWindow suchen, und nur wenn das nicht da 1613 // ist, den InputHandler von der App nehmen). 1614 // Als Sofortloesung bekommt erstmal jede View ihren Inputhandler, das gibt 1615 // nur noch Probleme, wenn zwei Views in einem Task-Fenster sind. 1616 1617 pInputHandler = new ScInputHandler; 1618 1619 // Alte Version: 1620 // if ( !GetViewFrame()->ISA(SfxTopViewFrame) ) // OLE oder Plug-In 1621 // pInputHandler = new ScInputHandler; 1622 1623 // FormShell vor MakeDrawView anlegen, damit die DrawView auf jeden Fall 1624 // an der FormShell angemeldet werden kann 1625 // Gepusht wird die FormShell im ersten Activate 1626 pFormShell = new FmFormShell(this); 1627 pFormShell->SetControlActivationHandler( LINK( this, ScTabViewShell, FormControlActivated ) ); 1628 1629 // DrawView darf nicht im TabView - ctor angelegt werden, 1630 // wenn die ViewShell noch nicht kostruiert ist... 1631 if (pDoc->GetDrawLayer()) 1632 MakeDrawView( nForceDesignMode ); 1633 ViewOptionsHasChanged(sal_False); // legt auch evtl. DrawView an 1634 1635 ::svl::IUndoManager* pMgr = pDocSh->GetUndoManager(); 1636 SetUndoManager( pMgr ); 1637 pFormShell->SetUndoManager( pMgr ); 1638 if ( !pDoc->IsUndoEnabled() ) 1639 { 1640 pMgr->SetMaxUndoActionCount( 0 ); 1641 } 1642 SetRepeatTarget( &aTarget ); 1643 pFormShell->SetRepeatTarget( &aTarget ); 1644 SetHelpId( HID_SCSHELL_TABVWSH ); 1645 1646 if ( bFirstView ) // first view? 1647 { 1648 pDoc->SetDocVisible( sal_True ); // used when creating new sheets 1649 if ( pDocSh->IsEmpty() ) 1650 { 1651 // set first sheet's RTL flag (following will already be initialized because of SetDocVisible) 1652 pDoc->SetLayoutRTL( 0, ScGlobal::IsSystemRTL() ); 1653 1654 // append additional sheets (not for OLE object) 1655 if ( pDocSh->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED ) 1656 { 1657 SCTAB nInitTabCount = 3; //! konfigurierbar !!! 1658 for (SCTAB i=1; i<nInitTabCount; i++) 1659 pDoc->MakeTable(i,false); 1660 } 1661 1662 pDocSh->SetEmpty( sal_False ); // #i6232# make sure this is done only once 1663 } 1664 1665 // ReadExtOptions is now in Activate 1666 1667 // Link-Update nicht verschachteln 1668 if ( pDocSh->GetCreateMode() != SFX_CREATE_MODE_INTERNAL && 1669 pDocSh->IsUpdateEnabled() ) // #105575#; update only in the first creation of the ViewShell 1670 { 1671 // Check if there are any external data. 1672 bool bLink = pDoc->GetExternalRefManager()->hasExternalData(); 1673 if (!bLink) 1674 { 1675 // #i100042# sheet links can still exist independently from external formula references 1676 SCTAB nTabCount = pDoc->GetTableCount(); 1677 for (SCTAB i=0; i<nTabCount && !bLink; i++) 1678 if (pDoc->IsLinked(i)) 1679 bLink = true; 1680 } 1681 if (!bLink) 1682 if (pDoc->HasDdeLinks() || pDoc->HasAreaLinks()) 1683 bLink = sal_True; 1684 if (bLink) 1685 { 1686 if ( !pFirst ) 1687 pFirst = GetViewFrame(); 1688 1689 if(SC_MOD()->GetCurRefDlgId()==0) 1690 { 1691 pFirst->GetDispatcher()->Execute( SID_UPDATETABLINKS, 1692 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD ); 1693 } 1694 } 1695 1696 sal_Bool bReImport = sal_False; // importierte Daten aktualisieren 1697 ScDBCollection* pDBColl = pDoc->GetDBCollection(); 1698 if ( pDBColl ) 1699 { 1700 sal_uInt16 nCount = pDBColl->GetCount(); 1701 for (sal_uInt16 i=0; i<nCount && !bReImport; i++) 1702 { 1703 ScDBData* pData = (*pDBColl)[i]; 1704 if ( pData->IsStripData() && 1705 pData->HasImportParam() && !pData->HasImportSelection() ) 1706 bReImport = sal_True; 1707 } 1708 } 1709 if (bReImport) 1710 { 1711 if ( !pFirst ) 1712 pFirst = GetViewFrame(); 1713 if(SC_MOD()->GetCurRefDlgId()==0) 1714 { 1715 pFirst->GetDispatcher()->Execute( SID_REIMPORT_AFTER_LOAD, 1716 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD ); 1717 } 1718 } 1719 } 1720 } 1721 1722 UpdateAutoFillMark(); 1723 1724 // ScDispatchProviderInterceptor registers itself in ctor 1725 xDisProvInterceptor = new ScDispatchProviderInterceptor( this ); 1726 1727 bFirstActivate = sal_True; // NavigatorUpdate aufschieben bis Activate() 1728 1729 // #105575#; update only in the first creation of the ViewShell 1730 pDocSh->SetUpdateEnabled(sal_False); 1731 1732 if ( GetViewFrame()->GetFrame().IsInPlace() ) 1733 UpdateHeaderWidth(); // The implace activation requires headers to be calculated 1734 1735 SvBorder aBorder; 1736 GetBorderSize( aBorder, Size() ); 1737 SetBorderPixel( aBorder ); 1738 } 1739 1740 //------------------------------------------------------------------ 1741 1742 //UNUSED2008-05 ScTabViewShell::ScTabViewShell( SfxViewFrame* pViewFrame, 1743 //UNUSED2008-05 const ScTabViewShell& rWin ) : 1744 //UNUSED2008-05 SfxViewShell( pViewFrame, SFX_VIEW_MAXIMIZE_FIRST | SFX_VIEW_CAN_PRINT | SFX_VIEW_HAS_PRINTOPTIONS ), 1745 //UNUSED2008-05 ScDBFunc( &pViewFrame->GetWindow(), rWin, this ), 1746 //UNUSED2008-05 __INIT_ScTabViewShell 1747 //UNUSED2008-05 { 1748 //UNUSED2008-05 RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScTabViewShell::ScTabViewShell" ); 1749 //UNUSED2008-05 1750 //UNUSED2008-05 Construct(); 1751 //UNUSED2008-05 1752 //UNUSED2008-05 UpdatePageBreakData(); 1753 //UNUSED2008-05 1754 //UNUSED2008-05 /*uno::Reference<frame::XFrame> xFrame = pViewFrame->GetFrame().GetFrameInterface(); 1755 //UNUSED2008-05 if (xFrame.is()) 1756 //UNUSED2008-05 xFrame->setComponent( uno::Reference<awt::XWindow>(), new ScTabViewObj( this ) );*/ 1757 //UNUSED2008-05 // make Controller known to SFX 1758 //UNUSED2008-05 new ScTabViewObj( this ); 1759 //UNUSED2008-05 1760 //UNUSED2008-05 SetCurSubShell(OST_Cell); 1761 //UNUSED2008-05 SvBorder aBorder; 1762 //UNUSED2008-05 GetBorderSize( aBorder, Size() ); 1763 //UNUSED2008-05 SetBorderPixel( aBorder ); 1764 //UNUSED2008-05 } 1765 1766 //------------------------------------------------------------------ 1767 1768 ScTabViewShell::ScTabViewShell( SfxViewFrame* pViewFrame, 1769 SfxViewShell* pOldSh ) : 1770 SfxViewShell( pViewFrame, SFX_VIEW_CAN_PRINT | SFX_VIEW_HAS_PRINTOPTIONS ), 1771 ScDBFunc( &pViewFrame->GetWindow(), (ScDocShell&)*pViewFrame->GetObjectShell(), this ), 1772 __INIT_ScTabViewShell 1773 { 1774 RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScTabViewShell::ScTabViewShell" ); 1775 1776 const ScAppOptions& rAppOpt = SC_MOD()->GetAppOptions(); 1777 1778 // if switching back from print preview, 1779 // restore the view settings that were active when creating the preview 1780 // #89897# ReadUserData must not happen from ctor, because the view's edit window 1781 // has to be shown by the sfx. ReadUserData is deferred until the first Activate call. 1782 // #106334# old DesignMode state from form layer must be restored, too 1783 1784 sal_uInt8 nForceDesignMode = SC_FORCEMODE_NONE; 1785 if ( pOldSh && pOldSh->ISA( ScPreviewShell ) ) 1786 { 1787 ScPreviewShell* pPreviewShell = ((ScPreviewShell*)pOldSh); 1788 nForceDesignMode = pPreviewShell->GetSourceDesignMode(); 1789 } 1790 1791 Construct( nForceDesignMode ); 1792 1793 if ( GetViewData()->GetDocShell()->IsPreview() ) 1794 { 1795 // preview for template dialog: always show whole page 1796 SetZoomType( SVX_ZOOM_WHOLEPAGE, sal_True ); // zoom value is recalculated at next Resize 1797 } 1798 else 1799 { 1800 Fraction aFract( rAppOpt.GetZoom(), 100 ); 1801 SetZoom( aFract, aFract, sal_True ); 1802 SetZoomType( rAppOpt.GetZoomType(), sal_True ); 1803 } 1804 1805 /*uno::Reference<frame::XFrame> xFrame = pViewFrame->GetFrame().GetFrameInterface(); 1806 if (xFrame.is()) 1807 xFrame->setComponent( uno::Reference<awt::XWindow>(), new ScTabViewObj( this ) );*/ 1808 // make Controller known to SFX 1809 new ScTabViewObj( this ); 1810 1811 SetCurSubShell(OST_Cell); 1812 SvBorder aBorder; 1813 GetBorderSize( aBorder, Size() ); 1814 SetBorderPixel( aBorder ); 1815 1816 // #114409# 1817 MakeDrawLayer(); 1818 } 1819 1820 #undef __INIT_ScTabViewShell 1821 1822 //------------------------------------------------------------------ 1823 1824 __EXPORT ScTabViewShell::~ScTabViewShell() 1825 { 1826 ScDocShell* pDocSh = GetViewData()->GetDocShell(); 1827 EndListening(*pDocSh); 1828 EndListening(*GetViewFrame()); 1829 EndListening(*SFX_APP()); // #i62045# #i62046# needed now - SfxViewShell no longer does it 1830 1831 SC_MOD()->ViewShellGone(this); 1832 1833 RemoveSubShell(); // alle 1834 SetWindow(0); 1835 1836 // #54104# alles auf NULL, falls aus dem TabView-dtor noch darauf zugegriffen wird 1837 //! (soll eigentlich nicht !??!?!) 1838 1839 DELETEZ(pFontworkBarShell); 1840 DELETEZ(pExtrusionBarShell); 1841 DELETEZ(pCellShell); 1842 DELETEZ(pPageBreakShell); 1843 DELETEZ(pDrawShell); 1844 DELETEZ(pDrawFormShell); 1845 DELETEZ(pOleObjectShell); 1846 DELETEZ(pChartShell); 1847 DELETEZ(pGraphicShell); 1848 DELETEZ(pMediaShell); 1849 DELETEZ(pDrawTextShell); 1850 DELETEZ(pEditShell); 1851 DELETEZ(pPivotShell); 1852 DELETEZ(pAuditingShell); 1853 DELETEZ(pCurFrameLine); 1854 DELETEZ(pInputHandler); 1855 DELETEZ(pPivotSource); 1856 DELETEZ(pDialogDPObject); 1857 DELETEZ(pNavSettings); 1858 1859 DELETEZ(pFormShell); 1860 DELETEZ(pAccessibilityBroadcaster); 1861 } 1862 1863 //------------------------------------------------------------------ 1864 1865 void ScTabViewShell::SetDialogDPObject( const ScDPObject* pObj ) 1866 { 1867 delete pDialogDPObject; 1868 if (pObj) 1869 pDialogDPObject = new ScDPObject( *pObj ); 1870 else 1871 pDialogDPObject = NULL; 1872 } 1873 1874 //------------------------------------------------------------------ 1875 1876 void ScTabViewShell::FillFieldData( ScHeaderFieldData& rData ) 1877 { 1878 ScDocShell* pDocShell = GetViewData()->GetDocShell(); 1879 ScDocument* pDoc = pDocShell->GetDocument(); 1880 SCTAB nTab = GetViewData()->GetTabNo(); 1881 pDoc->GetName( nTab, rData.aTabName ); 1882 1883 rData.aTitle = pDocShell->GetTitle(); 1884 const INetURLObject& rURLObj = pDocShell->GetMedium()->GetURLObject(); 1885 rData.aLongDocName = rURLObj.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ); 1886 if ( rData.aLongDocName.Len() ) 1887 rData.aShortDocName = rURLObj.GetName( INetURLObject::DECODE_UNAMBIGUOUS ); 1888 else 1889 rData.aShortDocName = rData.aLongDocName = rData.aTitle; 1890 rData.nPageNo = 1; 1891 rData.nTotalPages = 99; 1892 1893 // eNumType kennt der Dialog selber 1894 } 1895 1896 //------------------------------------------------------------------ 1897 1898 void ScTabViewShell::SetChartArea( const ScRangeListRef& rSource, const Rectangle& rDest ) 1899 { 1900 bChartAreaValid = sal_True; 1901 aChartSource = rSource; 1902 aChartPos = rDest; 1903 nChartDestTab = GetViewData()->GetTabNo(); 1904 } 1905 1906 //UNUSED2008-05 void ScTabViewShell::ResetChartArea() 1907 //UNUSED2008-05 { 1908 //UNUSED2008-05 bChartAreaValid = sal_False; 1909 //UNUSED2008-05 } 1910 1911 sal_Bool ScTabViewShell::GetChartArea( ScRangeListRef& rSource, Rectangle& rDest, SCTAB& rTab ) const 1912 { 1913 rSource = aChartSource; 1914 rDest = aChartPos; 1915 rTab = nChartDestTab; 1916 return bChartAreaValid; 1917 } 1918 1919 //UNUSED2008-05 sal_Bool ScTabViewShell::IsChartDlgEdit() const 1920 //UNUSED2008-05 { 1921 //UNUSED2008-05 return bChartDlgIsEdit; 1922 //UNUSED2008-05 } 1923 //UNUSED2008-05 1924 //UNUSED2008-05 const String& ScTabViewShell::GetEditChartName() const 1925 //UNUSED2008-05 { 1926 //UNUSED2008-05 return aEditChartName; 1927 //UNUSED2008-05 } 1928 1929 ScNavigatorSettings* ScTabViewShell::GetNavigatorSettings() 1930 { 1931 if( !pNavSettings ) 1932 pNavSettings = new ScNavigatorSettings; 1933 return pNavSettings; 1934 } 1935 1936 1937 //------------------------------------------------------------------ 1938 1939 void ScTabViewShell::ExecTbx( SfxRequest& rReq ) 1940 { 1941 const SfxItemSet* pReqArgs = rReq.GetArgs(); 1942 sal_uInt16 nSlot = rReq.GetSlot(); 1943 const SfxPoolItem* pItem = NULL; 1944 if ( pReqArgs ) 1945 pReqArgs->GetItemState( nSlot, sal_True, &pItem ); 1946 1947 switch ( nSlot ) 1948 { 1949 case SID_TBXCTL_INSERT: 1950 if ( pItem ) 1951 nInsertCtrlState = ((const SfxUInt16Item*)pItem)->GetValue(); 1952 break; 1953 case SID_TBXCTL_INSCELLS: 1954 if ( pItem ) 1955 nInsCellsCtrlState = ((const SfxUInt16Item*)pItem)->GetValue(); 1956 break; 1957 case SID_TBXCTL_INSOBJ: 1958 if ( pItem ) 1959 nInsObjCtrlState = ((const SfxUInt16Item*)pItem)->GetValue(); 1960 break; 1961 default: 1962 DBG_ERROR("Slot im Wald"); 1963 } 1964 GetViewFrame()->GetBindings().Invalidate( nSlot ); 1965 } 1966 1967 void ScTabViewShell::GetTbxState( SfxItemSet& rSet ) 1968 { 1969 rSet.Put( SfxUInt16Item( SID_TBXCTL_INSERT, nInsertCtrlState ) ); 1970 rSet.Put( SfxUInt16Item( SID_TBXCTL_INSCELLS, nInsCellsCtrlState ) ); 1971 1972 // ohne installiertes Chart darf Chart nicht Default sein... 1973 if ( nInsObjCtrlState == SID_DRAW_CHART && !SvtModuleOptions().IsChart() ) 1974 nInsObjCtrlState = SID_INSERT_OBJECT; 1975 1976 rSet.Put( SfxUInt16Item( SID_TBXCTL_INSOBJ, nInsObjCtrlState ) ); 1977 } 1978 1979 1980 1981 1982 1983