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