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