1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sc.hxx" 30 31 32 33 // INCLUDE --------------------------------------------------------------- 34 35 #include "scitems.hxx" 36 #include <editeng/eeitem.hxx> 37 38 39 #include <svx/fmshell.hxx> 40 #include <svx/svdobj.hxx> 41 #include <svx/svdoutl.hxx> 42 #include <sfx2/bindings.hxx> 43 #include <sfx2/dispatch.hxx> 44 #include <sfx2/objsh.hxx> 45 #include <tools/ref.hxx> 46 47 #include "tabview.hxx" 48 #include "tabvwsh.hxx" 49 #include "document.hxx" 50 #include "gridwin.hxx" 51 #include "olinewin.hxx" 52 #include "tabsplit.hxx" 53 #include "colrowba.hxx" 54 #include "tabcont.hxx" 55 #include "hintwin.hxx" 56 #include "sc.hrc" 57 #include "pagedata.hxx" 58 #include "hiranges.hxx" 59 #include "drawview.hxx" 60 #include "drwlayer.hxx" 61 #include "fusel.hxx" // Start-Function 62 #include "seltrans.hxx" 63 #include "scmod.hxx" 64 #include "AccessibilityHints.hxx" 65 #include "docsh.hxx" 66 #include "viewuno.hxx" 67 68 #include <vcl/svapp.hxx> 69 70 using namespace com::sun::star; 71 72 // STATIC DATA ----------------------------------------------------------- 73 74 75 void __EXPORT ScTabView::Init() 76 { 77 /* RTL layout of the view windows is done manually, because it depends on 78 the sheet orientation, not the UI setting. Note: controls that are 79 already constructed (e.g. scroll bars) have the RTL setting of the GUI. 80 Eventually this has to be disabled manually (see below). */ 81 pFrameWin->EnableRTL( sal_False ); 82 83 sal_uInt16 i; 84 85 aScrollTimer.SetTimeout(10); 86 aScrollTimer.SetTimeoutHdl( LINK( this, ScTabView, TimerHdl ) ); 87 88 for (i=0; i<4; i++) 89 pGridWin[i] = NULL; 90 pGridWin[SC_SPLIT_BOTTOMLEFT] = new ScGridWindow( pFrameWin, &aViewData, SC_SPLIT_BOTTOMLEFT ); 91 92 pSelEngine = new ScViewSelectionEngine( pGridWin[SC_SPLIT_BOTTOMLEFT], this, 93 SC_SPLIT_BOTTOMLEFT ); 94 aFunctionSet.SetSelectionEngine( pSelEngine ); 95 96 pHdrSelEng = new ScHeaderSelectionEngine( pFrameWin, &aHdrFunc ); 97 98 pColBar[SC_SPLIT_LEFT] = new ScColBar( pFrameWin, &aViewData, SC_SPLIT_LEFT, 99 &aHdrFunc, pHdrSelEng ); 100 pColBar[SC_SPLIT_RIGHT] = NULL; 101 pRowBar[SC_SPLIT_BOTTOM] = new ScRowBar( pFrameWin, &aViewData, SC_SPLIT_BOTTOM, 102 &aHdrFunc, pHdrSelEng ); 103 pRowBar[SC_SPLIT_TOP] = NULL; 104 for (i=0; i<2; i++) 105 pColOutline[i] = pRowOutline[i] = NULL; 106 107 pHSplitter = new ScTabSplitter( pFrameWin, WinBits( WB_HSCROLL ), &aViewData ); 108 pVSplitter = new ScTabSplitter( pFrameWin, WinBits( WB_VSCROLL ), &aViewData ); 109 110 // SSA: override default keyboard step size to allow snap to row/column 111 pHSplitter->SetKeyboardStepSize( 1 ); 112 pVSplitter->SetKeyboardStepSize( 1 ); 113 114 pTabControl = new ScTabControl( pFrameWin, &aViewData ); 115 /* #i97900# The tab control has to remain in RTL mode if GUI is RTL, this 116 is needed to draw the 3D effect correctly. The base TabBar implementes 117 mirroring independent from the GUI direction. Have to set RTL mode 118 explicitly because the parent frame window is already RTL disabled. */ 119 pTabControl->EnableRTL( Application::GetSettings().GetLayoutRTL() ); 120 121 InitScrollBar( aHScrollLeft, MAXCOL+1 ); 122 InitScrollBar( aHScrollRight, MAXCOL+1 ); 123 InitScrollBar( aVScrollTop, MAXROW+1 ); 124 InitScrollBar( aVScrollBottom, MAXROW+1 ); 125 /* #i97900# scrollbars remain in correct RTL mode, needed mirroring etc. 126 is now handled correctly at the respective places. */ 127 128 // Hier noch nichts anzeigen (Show), weil noch falsch angeordnet ist 129 // Show kommt dann aus UpdateShow beim ersten Resize 130 // pTabControl, pGridWin, aHScrollLeft, aVScrollBottom, 131 // aCornerButton, aScrollBarBox, pHSplitter, pVSplitter 132 133 // Splitter 134 135 pHSplitter->SetSplitHdl( LINK( this, ScTabView, SplitHdl ) ); 136 pVSplitter->SetSplitHdl( LINK( this, ScTabView, SplitHdl ) ); 137 138 // UpdateShow kommt beim Resize, oder bei Kopie einer bestehenden View aus dem ctor 139 140 pDrawActual = NULL; 141 pDrawOld = NULL; 142 143 // DrawView darf nicht im TabView - ctor angelegt werden, 144 // wenn die ViewShell noch nicht konstruiert ist... 145 // Das gilt auch fuer ViewOptionsHasChanged() 146 147 TestHintWindow(); 148 } 149 150 __EXPORT ScTabView::~ScTabView() 151 { 152 sal_uInt16 i; 153 154 // remove selection object 155 ScModule* pScMod = SC_MOD(); 156 ScSelectionTransferObj* pOld = pScMod->GetSelectionTransfer(); 157 if ( pOld && pOld->GetView() == this ) 158 { 159 pOld->ForgetView(); 160 pScMod->SetSelectionTransfer( NULL ); 161 TransferableHelper::ClearSelection( GetActiveWin() ); // may delete pOld 162 } 163 164 DELETEZ(pBrushDocument); 165 DELETEZ(pDrawBrushSet); 166 167 DELETEZ(pPageBreakData); 168 DELETEZ(pHighlightRanges); 169 170 DELETEZ(pDrawOld); 171 DELETEZ(pDrawActual); 172 173 aViewData.KillEditView(); // solange GridWin's noch existieren 174 175 DELETEZ(pInputHintWindow); 176 177 if (pDrawView) 178 { 179 for (i=0; i<4; i++) 180 if (pGridWin[i]) 181 { 182 pDrawView->VCRemoveWin(pGridWin[i]); 183 pDrawView->DeleteWindowFromPaintView(pGridWin[i]); 184 } 185 186 pDrawView->HideSdrPage(); 187 delete pDrawView; 188 } 189 190 delete pSelEngine; 191 192 for (i=0; i<4; i++) 193 delete pGridWin[i]; 194 195 delete pHdrSelEng; 196 197 for (i=0; i<2; i++) 198 { 199 delete pColBar[i]; 200 delete pRowBar[i]; 201 delete pColOutline[i]; 202 delete pRowOutline[i]; 203 } 204 205 delete pHSplitter; 206 delete pVSplitter; 207 208 delete pTabControl; 209 } 210 211 void ScTabView::MakeDrawView( sal_uInt8 nForceDesignMode ) 212 { 213 if (!pDrawView) 214 { 215 ScDrawLayer* pLayer = aViewData.GetDocument()->GetDrawLayer(); 216 DBG_ASSERT(pLayer, "wo ist der Draw Layer ??"); 217 218 sal_uInt16 i; 219 pDrawView = new ScDrawView( pGridWin[SC_SPLIT_BOTTOMLEFT], &aViewData ); 220 for (i=0; i<4; i++) 221 if (pGridWin[i]) 222 { 223 if ( SC_SPLIT_BOTTOMLEFT != (ScSplitPos)i ) 224 pDrawView->AddWindowToPaintView(pGridWin[i]); 225 pDrawView->VCAddWin(pGridWin[i]); 226 } 227 pDrawView->RecalcScale(); 228 for (i=0; i<4; i++) 229 if (pGridWin[i]) 230 { 231 pGridWin[i]->SetMapMode(pGridWin[i]->GetDrawMapMode()); 232 233 pGridWin[i]->Update(); // wegen Invalidate im DrawView ctor (ShowPage), 234 // damit gleich gezeichnet werden kann 235 } 236 SfxRequest aSfxRequest(SID_OBJECT_SELECT, 0,aViewData.GetViewShell()->GetPool()); 237 SetDrawFuncPtr(new FuSelection( aViewData.GetViewShell(), GetActiveWin(), pDrawView, 238 pLayer,aSfxRequest)); 239 240 // #106334# used when switching back from page preview: restore saved design mode state 241 // (otherwise, keep the default from the draw view ctor) 242 if ( nForceDesignMode != SC_FORCEMODE_NONE ) 243 pDrawView->SetDesignMode( (sal_Bool)nForceDesignMode ); 244 245 // an der FormShell anmelden 246 FmFormShell* pFormSh = aViewData.GetViewShell()->GetFormShell(); 247 if (pFormSh) 248 pFormSh->SetView(pDrawView); 249 250 if (aViewData.GetViewShell()->HasAccessibilityObjects()) 251 aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_MAKEDRAWLAYER)); 252 253 } 254 } 255 256 void ScTabView::DoAddWin( ScGridWindow* pWin ) 257 { 258 if (pDrawView) 259 { 260 pDrawView->AddWindowToPaintView(pWin); 261 pDrawView->VCAddWin(pWin); 262 263 // #114409# 264 pWin->DrawLayerCreated(); 265 } 266 } 267 268 //================================================================== 269 270 void ScTabView::TabChanged( bool bSameTabButMoved ) 271 { 272 if (pDrawView) 273 { 274 DrawDeselectAll(); // beendet auch Text-Edit-Modus 275 276 sal_uInt16 i; 277 for (i=0; i<4; i++) 278 if (pGridWin[i]) 279 pDrawView->VCRemoveWin(pGridWin[i]); // fuer alte Page 280 281 SCTAB nTab = aViewData.GetTabNo(); 282 pDrawView->HideSdrPage(); 283 pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab)); 284 285 UpdateLayerLocks(); 286 287 pDrawView->RecalcScale(); 288 pDrawView->UpdateWorkArea(); // #54782# PageSize ist pro Page unterschiedlich 289 290 for (i=0; i<4; i++) 291 if (pGridWin[i]) 292 pDrawView->VCAddWin(pGridWin[i]); // fuer neue Page 293 } 294 295 SfxBindings& rBindings = aViewData.GetBindings(); 296 297 // Es gibt keine einfache Moeglichkeit, alle Slots der FormShell zu invalidieren 298 // (fuer disablete Slots auf geschuetzten Tabellen), darum hier einfach alles... 299 rBindings.InvalidateAll(sal_False); 300 301 #if 0 302 rBindings.Invalidate( SID_SELECT_SCENARIO ); 303 rBindings.Invalidate( FID_PROTECT_TABLE ); 304 rBindings.Invalidate( FID_DELETE_TABLE ); 305 rBindings.Invalidate( FID_TABLE_SHOW ); 306 rBindings.Invalidate( FID_TABLE_HIDE ); 307 308 // Auswirkungen von geschuetzten Tabellen. 309 rBindings.Invalidate( FID_TAB_RENAME ); 310 rBindings.Invalidate( FID_TAB_MOVE ); 311 rBindings.Invalidate( SID_DEL_ROWS ); 312 rBindings.Invalidate( SID_DEL_COLS ); 313 rBindings.Invalidate( FID_INS_ROW ); 314 rBindings.Invalidate( FID_INS_COLUMN ); 315 rBindings.Invalidate( FID_INS_CELL ); 316 rBindings.Invalidate( FID_INS_CELLSDOWN ); 317 rBindings.Invalidate( FID_INS_CELLSRIGHT ); 318 rBindings.Invalidate( FID_DELETE_CELL ); 319 320 rBindings.Invalidate( SID_OPENDLG_CHART ); 321 rBindings.Invalidate( SID_INSERT_OBJECT ); 322 rBindings.Invalidate( SID_INSERT_DIAGRAM ); 323 rBindings.Invalidate( SID_INSERT_SMATH ); 324 rBindings.Invalidate( SID_INSERT_GRAPHIC ); 325 #endif 326 327 if (aViewData.GetViewShell()->HasAccessibilityObjects()) 328 { 329 SfxSimpleHint aAccHint(SC_HINT_ACC_TABLECHANGED); 330 aViewData.GetViewShell()->BroadcastAccessibility(aAccHint); 331 } 332 333 // notification for XActivationBroadcaster 334 SfxViewFrame* pViewFrame = aViewData.GetViewShell()->GetViewFrame(); 335 if (pViewFrame) 336 { 337 uno::Reference<frame::XController> xController = pViewFrame->GetFrame().GetController(); 338 if (xController.is()) 339 { 340 ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController ); 341 if (pImp) 342 pImp->SheetChanged( bSameTabButMoved ); 343 } 344 } 345 } 346 347 void ScTabView::UpdateLayerLocks() 348 { 349 if (pDrawView) 350 { 351 SCTAB nTab = aViewData.GetTabNo(); 352 sal_Bool bEx = aViewData.GetViewShell()->IsDrawSelMode(); 353 sal_Bool bProt = aViewData.GetDocument()->IsTabProtected( nTab ) || 354 aViewData.GetSfxDocShell()->IsReadOnly(); 355 sal_Bool bShared = aViewData.GetDocShell()->IsDocShared(); 356 357 SdrLayer* pLayer; 358 SdrLayerAdmin& rAdmin = pDrawView->GetModel()->GetLayerAdmin(); 359 pLayer = rAdmin.GetLayerPerID(SC_LAYER_BACK); 360 if (pLayer) 361 pDrawView->SetLayerLocked( pLayer->GetName(), bProt || !bEx || bShared ); 362 pLayer = rAdmin.GetLayerPerID(SC_LAYER_INTERN); 363 if (pLayer) 364 pDrawView->SetLayerLocked( pLayer->GetName(), sal_True ); 365 pLayer = rAdmin.GetLayerPerID(SC_LAYER_FRONT); 366 if (pLayer) 367 pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared ); 368 pLayer = rAdmin.GetLayerPerID(SC_LAYER_CONTROLS); 369 if (pLayer) 370 pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared ); 371 pLayer = rAdmin.GetLayerPerID(SC_LAYER_HIDDEN); 372 if (pLayer) 373 { 374 pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared ); 375 pDrawView->SetLayerVisible( pLayer->GetName(), sal_False); 376 } 377 } 378 } 379 380 void ScTabView::DrawDeselectAll() 381 { 382 if (pDrawView) 383 { 384 ScTabViewShell* pViewSh = aViewData.GetViewShell(); 385 if ( pDrawActual && 386 ( pViewSh->IsDrawTextShell() || pDrawActual->GetSlotID() == SID_DRAW_NOTEEDIT ) ) 387 { 388 // end text edit (as if escape pressed, in FuDraw) 389 aViewData.GetDispatcher().Execute( pDrawActual->GetSlotID(), 390 SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD ); 391 } 392 393 pDrawView->ScEndTextEdit(); 394 pDrawView->UnmarkAll(); 395 396 if (!pViewSh->IsDrawSelMode()) 397 pViewSh->SetDrawShell( sal_False ); 398 } 399 } 400 401 sal_Bool ScTabView::IsDrawTextEdit() const 402 { 403 if (pDrawView) 404 return pDrawView->IsTextEdit(); 405 else 406 return sal_False; 407 } 408 409 //UNUSED2008-05 String ScTabView::GetSelectedChartName() const 410 //UNUSED2008-05 { 411 //UNUSED2008-05 if (pDrawView) 412 //UNUSED2008-05 return pDrawView->GetSelectedChartName(); 413 //UNUSED2008-05 else 414 //UNUSED2008-05 return EMPTY_STRING; 415 //UNUSED2008-05 } 416 417 SvxZoomType ScTabView::GetZoomType() const 418 { 419 return aViewData.GetZoomType(); 420 } 421 422 void ScTabView::SetZoomType( SvxZoomType eNew, sal_Bool bAll ) 423 { 424 aViewData.SetZoomType( eNew, bAll ); 425 } 426 427 void ScTabView::SetZoom( const Fraction& rNewX, const Fraction& rNewY, sal_Bool bAll ) 428 { 429 aViewData.SetZoom( rNewX, rNewY, bAll ); 430 if (pDrawView) 431 pDrawView->RecalcScale(); 432 ZoomChanged(); // einzeln wegen CLOOKs 433 } 434 435 void ScTabView::RefreshZoom() 436 { 437 aViewData.RefreshZoom(); 438 if (pDrawView) 439 pDrawView->RecalcScale(); 440 ZoomChanged(); 441 } 442 443 void ScTabView::SetPagebreakMode( sal_Bool bSet ) 444 { 445 aViewData.SetPagebreakMode(bSet); 446 if (pDrawView) 447 pDrawView->RecalcScale(); 448 ZoomChanged(); // einzeln wegen CLOOKs 449 } 450 451 void ScTabView::ResetDrawDragMode() 452 { 453 if (pDrawView) 454 pDrawView->SetDragMode( SDRDRAG_MOVE ); 455 } 456 457 void ScTabView::ViewOptionsHasChanged( sal_Bool bHScrollChanged, sal_Bool bGraphicsChanged ) 458 { 459 // DrawView erzeugen, wenn Gitter angezeigt werden soll 460 if ( !pDrawView && aViewData.GetOptions().GetGridOptions().GetGridVisible() ) 461 MakeDrawLayer(); 462 463 if (pDrawView) 464 pDrawView->UpdateUserViewOptions(); 465 466 if (bGraphicsChanged) 467 DrawEnableAnim(sal_True); // DrawEnableAnim checks the options state 468 469 // if TabBar is set to visible, make sure its size is not 0 470 sal_Bool bGrow = ( aViewData.IsTabMode() && pTabControl->GetSizePixel().Width() <= 0 ); 471 472 // if ScrollBar is set to visible, TabBar must make room 473 sal_Bool bShrink = ( bHScrollChanged && aViewData.IsTabMode() && aViewData.IsHScrollMode() && 474 pTabControl->GetSizePixel().Width() > SC_TABBAR_DEFWIDTH ); 475 476 if ( bGrow || bShrink ) 477 { 478 Size aSize = pTabControl->GetSizePixel(); 479 aSize.Width() = SC_TABBAR_DEFWIDTH; // initial size 480 pTabControl->SetSizePixel(aSize); // DoResize is called later... 481 } 482 } 483 484 // Helper-Funktion gegen das Include des Drawing Layers 485 486 SdrView* ScTabView::GetSdrView() 487 { 488 return pDrawView; 489 } 490 491 void ScTabView::DrawMarkListHasChanged() 492 { 493 if ( pDrawView ) 494 pDrawView->MarkListHasChanged(); 495 } 496 497 void ScTabView::UpdateAnchorHandles() 498 { 499 if ( pDrawView ) 500 pDrawView->AdjustMarkHdl(); 501 } 502 503 void ScTabView::UpdateIMap( SdrObject* pObj ) 504 { 505 if ( pDrawView ) 506 pDrawView->UpdateIMap( pObj ); 507 } 508 509 void ScTabView::DrawMarkRect( const Rectangle& rRect ) 510 { 511 //! store rectangle for repaint during drag 512 513 for (sal_uInt16 i=0; i<4; i++) 514 { 515 if ( pGridWin[i] && pGridWin[i]->IsVisible() ) 516 { 517 RasterOp aROp = pGridWin[i]->GetRasterOp(); 518 sal_Bool bHasLine = pGridWin[i]->IsLineColor(); 519 Color aLine = pGridWin[i]->GetLineColor(); 520 sal_Bool bHasFill = pGridWin[i]->IsFillColor(); 521 Color aFill = pGridWin[i]->GetFillColor(); 522 523 pGridWin[i]->SetRasterOp( ROP_INVERT ); 524 pGridWin[i]->SetLineColor( COL_BLACK ); 525 pGridWin[i]->SetFillColor(); 526 527 pGridWin[i]->DrawRect(rRect); 528 529 pGridWin[i]->SetRasterOp(aROp); 530 if (bHasLine) 531 pGridWin[i]->SetLineColor(aLine); 532 else 533 pGridWin[i]->SetLineColor(); 534 if (bHasFill) 535 pGridWin[i]->SetFillColor(aFill); 536 else 537 pGridWin[i]->SetFillColor(); 538 } 539 } 540 } 541 542 void ScTabView::DrawEnableAnim(sal_Bool bSet) 543 { 544 sal_uInt16 i; 545 if ( pDrawView ) 546 { 547 // #71040# dont start animations if display of graphics is disabled 548 // graphics are controlled by VOBJ_TYPE_OLE 549 if ( bSet && aViewData.GetOptions().GetObjMode(VOBJ_TYPE_OLE) == VOBJ_MODE_SHOW ) 550 { 551 if ( !pDrawView->IsAnimationEnabled() ) 552 { 553 pDrawView->SetAnimationEnabled(sal_True); 554 555 // Animierte GIFs muessen wieder gestartet werden: 556 ScDocument* pDoc = aViewData.GetDocument(); 557 for (i=0; i<4; i++) 558 if ( pGridWin[i] && pGridWin[i]->IsVisible() ) 559 pDoc->StartAnimations( aViewData.GetTabNo(), pGridWin[i] ); 560 } 561 } 562 else 563 { 564 pDrawView->SetAnimationEnabled(sal_False); 565 } 566 } 567 } 568 569 //HMHvoid ScTabView::DrawShowMarkHdl(sal_Bool bShow) 570 //HMH{ 571 //HMHif (!pDrawView) 572 //HMH return; 573 574 //HMHif (bShow) 575 //HMH{ 576 //HMH if (!pDrawView->IsDisableHdl()) 577 //HMH pDrawView->ShowMarkHdl(); 578 //HMH} 579 //HMHelse 580 //HMH pDrawView->HideMarkHdl(); 581 //HMH} 582 583 void ScTabView::UpdateDrawTextOutliner() 584 { 585 if ( pDrawView ) 586 { 587 Outliner* pOL = pDrawView->GetTextEditOutliner(); 588 if (pOL) 589 aViewData.UpdateOutlinerFlags( *pOL ); 590 } 591 } 592 593 void ScTabView::DigitLanguageChanged() 594 { 595 LanguageType eNewLang = SC_MOD()->GetOptDigitLanguage(); 596 for (sal_uInt16 i=0; i<4; i++) 597 if ( pGridWin[i] ) 598 pGridWin[i]->SetDigitLanguage( eNewLang ); 599 } 600 601 //--------------------------------------------------------------- 602 603 void ScTabView::ScrollToObject( SdrObject* pDrawObj ) 604 { 605 if ( pDrawObj ) 606 { 607 // #i118524# use the BoundRect, this defines the visible area 608 MakeVisible(pDrawObj->GetCurrentBoundRect()); 609 } 610 } 611 612 void ScTabView::MakeVisible( const Rectangle& rHMMRect ) 613 { 614 Window* pWin = GetActiveWin(); 615 Size aWinSize = pWin->GetOutputSizePixel(); 616 SCTAB nTab = aViewData.GetTabNo(); 617 618 Rectangle aRect = pWin->LogicToPixel( rHMMRect ); 619 620 long nScrollX=0, nScrollY=0; // Pixel 621 622 if ( aRect.Right() >= aWinSize.Width() ) // rechts raus 623 { 624 nScrollX = aRect.Right() - aWinSize.Width() + 1; // rechter Rand sichtbar 625 if ( aRect.Left() < nScrollX ) 626 nScrollX = aRect.Left(); // links sichtbar (falls zu gross) 627 } 628 if ( aRect.Bottom() >= aWinSize.Height() ) // unten raus 629 { 630 nScrollY = aRect.Bottom() - aWinSize.Height() + 1; // unterer Rand sichtbar 631 if ( aRect.Top() < nScrollY ) 632 nScrollY = aRect.Top(); // oben sichtbar (falls zu gross) 633 } 634 635 if ( aRect.Left() < 0 ) // links raus 636 nScrollX = aRect.Left(); // linker Rand sichtbar 637 if ( aRect.Top() < 0 ) // oben raus 638 nScrollY = aRect.Top(); // oberer Rand sichtbar 639 640 if (nScrollX || nScrollY) 641 { 642 ScDocument* pDoc = aViewData.GetDocument(); 643 if ( pDoc->IsNegativePage( nTab ) ) 644 nScrollX = -nScrollX; 645 646 double nPPTX = aViewData.GetPPTX(); 647 double nPPTY = aViewData.GetPPTY(); 648 ScSplitPos eWhich = aViewData.GetActivePart(); 649 SCCOL nPosX = aViewData.GetPosX(WhichH(eWhich)); 650 SCROW nPosY = aViewData.GetPosY(WhichV(eWhich)); 651 652 long nLinesX=0, nLinesY=0; // Spalten/Zeilen - um mindestens nScrollX/Y scrollen 653 654 if (nScrollX > 0) 655 while (nScrollX > 0 && nPosX < MAXCOL) 656 { 657 nScrollX -= (long) ( pDoc->GetColWidth(nPosX, nTab) * nPPTX ); 658 ++nPosX; 659 ++nLinesX; 660 } 661 else if (nScrollX < 0) 662 while (nScrollX < 0 && nPosX > 0) 663 { 664 --nPosX; 665 nScrollX += (long) ( pDoc->GetColWidth(nPosX, nTab) * nPPTX ); 666 --nLinesX; 667 } 668 669 if (nScrollY > 0) 670 while (nScrollY > 0 && nPosY < MAXROW) 671 { 672 nScrollY -= (long) ( pDoc->GetRowHeight(nPosY, nTab) * nPPTY ); 673 ++nPosY; 674 ++nLinesY; 675 } 676 else if (nScrollY < 0) 677 while (nScrollY < 0 && nPosY > 0) 678 { 679 --nPosY; 680 nScrollY += (long) ( pDoc->GetRowHeight(nPosY, nTab) * nPPTY ); 681 --nLinesY; 682 } 683 684 ScrollLines( nLinesX, nLinesY ); // ausfuehren 685 } 686 } 687 688 //--------------------------------------------------------------- 689 690 void ScTabView::SetBrushDocument( ScDocument* pNew, sal_Bool bLock ) 691 { 692 delete pBrushDocument; 693 delete pDrawBrushSet; 694 695 pBrushDocument = pNew; 696 pDrawBrushSet = NULL; 697 698 bLockPaintBrush = bLock; 699 700 aViewData.GetBindings().Invalidate(SID_FORMATPAINTBRUSH); 701 } 702 703 void ScTabView::SetDrawBrushSet( SfxItemSet* pNew, sal_Bool bLock ) 704 { 705 delete pBrushDocument; 706 delete pDrawBrushSet; 707 708 pBrushDocument = NULL; 709 pDrawBrushSet = pNew; 710 711 bLockPaintBrush = bLock; 712 713 aViewData.GetBindings().Invalidate(SID_FORMATPAINTBRUSH); 714 } 715 716 void ScTabView::ResetBrushDocument() 717 { 718 if ( HasPaintBrush() ) 719 { 720 SetBrushDocument( NULL, sal_False ); 721 SetActivePointer( Pointer( POINTER_ARROW ) ); // switch pointers also when ended with escape key 722 } 723 } 724 725 726