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 //------------------------------------------------------------------ 30 31 // INCLUDE --------------------------------------------------------------- 32 33 #include <vcl/help.hxx> 34 #include <vcl/svapp.hxx> 35 36 #include "tabview.hxx" 37 #include "document.hxx" 38 #include "docsh.hxx" 39 #include "scmod.hxx" 40 #include "gridwin.hxx" 41 #include "globstr.hrc" 42 #include "cell.hxx" 43 #include "dociter.hxx" 44 45 extern sal_uInt16 nScFillModeMouseModifier; // global.cxx 46 47 // STATIC DATA ----------------------------------------------------------- 48 49 //================================================================== 50 51 // 52 // --- Referenz-Eingabe / Fill-Cursor 53 // 54 55 void ScTabView::HideTip() 56 { 57 if ( nTipVisible ) 58 { 59 Help::HideTip( nTipVisible ); 60 nTipVisible = 0; 61 } 62 } 63 64 void ScTabView::ShowRefTip() 65 { 66 sal_Bool bDone = sal_False; 67 if ( aViewData.GetRefType() == SC_REFTYPE_REF && Help::IsQuickHelpEnabled() ) 68 { 69 SCCOL nStartX = aViewData.GetRefStartX(); 70 SCROW nStartY = aViewData.GetRefStartY(); 71 SCCOL nEndX = aViewData.GetRefEndX(); 72 SCROW nEndY = aViewData.GetRefEndY(); 73 if ( nEndX != nStartX || nEndY != nStartY ) // nicht fuer einzelne Zelle 74 { 75 sal_Bool bLeft = ( nEndX < nStartX ); 76 sal_Bool bTop = ( nEndY < nStartY ); 77 PutInOrder( nStartX, nEndX ); 78 PutInOrder( nStartY, nEndY ); 79 SCCOL nCols = nEndX+1-nStartX; 80 SCROW nRows = nEndY+1-nStartY; 81 82 String aHelp = ScGlobal::GetRscString( STR_QUICKHELP_REF ); 83 aHelp.SearchAndReplace( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("%1")), 84 String::CreateFromInt32(nRows) ); 85 aHelp.SearchAndReplace( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("%2")), 86 String::CreateFromInt32(nCols) ); 87 88 ScSplitPos eWhich = aViewData.GetActivePart(); 89 Window* pWin = pGridWin[eWhich]; 90 if ( pWin ) 91 { 92 Point aStart = aViewData.GetScrPos( nStartX, nStartY, eWhich ); 93 Point aEnd = aViewData.GetScrPos( nEndX+1, nEndY+1, eWhich ); 94 95 Point aPos( bLeft ? aStart.X() : ( aEnd.X() + 3 ), 96 bTop ? aStart.Y() : ( aEnd.Y() + 3 ) ); 97 sal_uInt16 nFlags = ( bLeft ? QUICKHELP_RIGHT : QUICKHELP_LEFT ) | 98 ( bTop ? QUICKHELP_BOTTOM : QUICKHELP_TOP ); 99 100 // nicht ueber die editierte Formel 101 if ( !bTop && aViewData.HasEditView( eWhich ) && 102 nEndY+1 == aViewData.GetEditViewRow() ) 103 { 104 // dann an der oberen Kante der editierten Zelle ausrichten 105 aPos.Y() -= 2; // die 3 von oben 106 nFlags = ( nFlags & ~QUICKHELP_TOP ) | QUICKHELP_BOTTOM; 107 } 108 109 Rectangle aRect( pWin->OutputToScreenPixel( aPos ), Size(1,1) ); 110 111 //! Test, ob geaendert ?? 112 113 HideTip(); 114 nTipVisible = Help::ShowTip( pWin, aRect, aHelp, nFlags ); 115 bDone = sal_True; 116 } 117 } 118 } 119 120 if (!bDone) 121 HideTip(); 122 } 123 124 void ScTabView::StopRefMode() 125 { 126 if (aViewData.IsRefMode()) 127 { 128 aViewData.SetRefMode( sal_False, SC_REFTYPE_NONE ); 129 130 HideTip(); 131 UpdateShrinkOverlay(); 132 133 if ( aViewData.GetTabNo() >= aViewData.GetRefStartZ() && 134 aViewData.GetTabNo() <= aViewData.GetRefEndZ() ) 135 { 136 ScDocument* pDoc = aViewData.GetDocument(); 137 SCCOL nStartX = aViewData.GetRefStartX(); 138 SCROW nStartY = aViewData.GetRefStartY(); 139 SCCOL nEndX = aViewData.GetRefEndX(); 140 SCROW nEndY = aViewData.GetRefEndY(); 141 if ( nStartX == nEndX && nStartY == nEndY ) 142 pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, aViewData.GetTabNo() ); 143 144 PaintArea( nStartX,nStartY,nEndX,nEndY, SC_UPDATE_MARKS ); 145 } 146 147 pSelEngine->Reset(); 148 pSelEngine->SetAddMode( sal_False ); //! sollte das nicht bei Reset passieren? 149 150 ScSplitPos eOld = pSelEngine->GetWhich(); 151 ScSplitPos eNew = aViewData.GetActivePart(); 152 if ( eNew != eOld ) 153 { 154 pSelEngine->SetWindow( pGridWin[ eNew ] ); 155 pSelEngine->SetWhich( eNew ); 156 pSelEngine->SetVisibleArea( Rectangle(Point(), 157 pGridWin[eNew]->GetOutputSizePixel()) ); 158 pGridWin[eOld]->MoveMouseStatus(*pGridWin[eNew]); 159 } 160 } 161 162 // AlignToCursor(SC_FOLLOW_NONE): Only switch active part. 163 // This must also be done if no RefMode was active (for RangeFinder dragging), 164 // but if RefMode was set, AlignToCursor must be after SelectionEngine reset, 165 // so the SelectionEngine SetWindow call from AlignToCursor doesn't capture 166 // the mouse again when called from Tracking/MouseButtonUp (#94562#). 167 AlignToCursor( aViewData.GetCurX(), aViewData.GetCurY(), SC_FOLLOW_NONE ); 168 } 169 170 void ScTabView::DoneRefMode( sal_Bool bContinue ) 171 { 172 ScDocument* pDoc = aViewData.GetDocument(); 173 if ( aViewData.GetRefType() == SC_REFTYPE_REF && bContinue ) 174 SC_MOD()->AddRefEntry(); 175 176 sal_Bool bWasRef = aViewData.IsRefMode(); 177 aViewData.SetRefMode( sal_False, SC_REFTYPE_NONE ); 178 179 HideTip(); 180 UpdateShrinkOverlay(); 181 182 // Paint: 183 if ( bWasRef && aViewData.GetTabNo() >= aViewData.GetRefStartZ() && 184 aViewData.GetTabNo() <= aViewData.GetRefEndZ() ) 185 { 186 SCCOL nStartX = aViewData.GetRefStartX(); 187 SCROW nStartY = aViewData.GetRefStartY(); 188 SCCOL nEndX = aViewData.GetRefEndX(); 189 SCROW nEndY = aViewData.GetRefEndY(); 190 if ( nStartX == nEndX && nStartY == nEndY ) 191 pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, aViewData.GetTabNo() ); 192 193 PaintArea( nStartX,nStartY,nEndX,nEndY, SC_UPDATE_MARKS ); 194 } 195 } 196 197 void ScTabView::UpdateRef( SCCOL nCurX, SCROW nCurY, SCTAB nCurZ ) 198 { 199 ScDocument* pDoc = aViewData.GetDocument(); 200 201 if (!aViewData.IsRefMode()) 202 { 203 // Das kommt vor, wenn bei einem Referenz-Dialog als erstes mit Control in die 204 // die Tabelle geklickt wird. Dann die neue Referenz an den alten Inhalt anhaengen: 205 206 ScModule* pScMod = SC_MOD(); 207 if (pScMod->IsFormulaMode()) 208 pScMod->AddRefEntry(); 209 210 InitRefMode( nCurX, nCurY, nCurZ, SC_REFTYPE_REF ); 211 } 212 213 if ( nCurX != aViewData.GetRefEndX() || nCurY != aViewData.GetRefEndY() || 214 nCurZ != aViewData.GetRefEndZ() ) 215 { 216 ScMarkData& rMark = aViewData.GetMarkData(); 217 SCTAB nTab = aViewData.GetTabNo(); 218 219 SCCOL nStartX = aViewData.GetRefStartX(); 220 SCROW nStartY = aViewData.GetRefStartY(); 221 SCCOL nEndX = aViewData.GetRefEndX(); 222 SCROW nEndY = aViewData.GetRefEndY(); 223 if ( nStartX == nEndX && nStartY == nEndY ) 224 pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, nTab ); 225 ScUpdateRect aRect( nStartX, nStartY, nEndX, nEndY ); 226 227 aViewData.SetRefEnd( nCurX, nCurY, nCurZ ); 228 229 nStartX = aViewData.GetRefStartX(); 230 nStartY = aViewData.GetRefStartY(); 231 nEndX = aViewData.GetRefEndX(); 232 nEndY = aViewData.GetRefEndY(); 233 if ( nStartX == nEndX && nStartY == nEndY ) 234 pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, nTab ); 235 aRect.SetNew( nStartX, nStartY, nEndX, nEndY ); 236 237 ScRefType eType = aViewData.GetRefType(); 238 if ( eType == SC_REFTYPE_REF ) 239 { 240 ScRange aRef( 241 aViewData.GetRefStartX(), aViewData.GetRefStartY(), aViewData.GetRefStartZ(), 242 aViewData.GetRefEndX(), aViewData.GetRefEndY(), aViewData.GetRefEndZ() ); 243 SC_MOD()->SetReference( aRef, pDoc, &rMark ); 244 ShowRefTip(); 245 } 246 else if ( eType == SC_REFTYPE_EMBED_LT || eType == SC_REFTYPE_EMBED_RB ) 247 { 248 PutInOrder(nStartX,nEndX); 249 PutInOrder(nStartY,nEndY); 250 pDoc->SetEmbedded( ScRange(nStartX,nStartY,nTab, nEndX,nEndY,nTab) ); 251 ScDocShell* pDocSh = aViewData.GetDocShell(); 252 pDocSh->UpdateOle( &aViewData, sal_True ); 253 pDocSh->SetDocumentModified(); 254 } 255 256 SCCOL nPaintStartX; 257 SCROW nPaintStartY; 258 SCCOL nPaintEndX; 259 SCROW nPaintEndY; 260 if (aRect.GetDiff( nPaintStartX, nPaintStartY, nPaintEndX, nPaintEndY )) 261 PaintArea( nPaintStartX, nPaintStartY, nPaintEndX, nPaintEndY, SC_UPDATE_MARKS ); 262 } 263 264 // Tip-Hilfe fuer Auto-Fill 265 266 if ( aViewData.GetRefType() == SC_REFTYPE_FILL && Help::IsQuickHelpEnabled() ) 267 { 268 String aHelpStr; 269 ScRange aMarkRange; 270 aViewData.GetSimpleArea( aMarkRange ); 271 SCCOL nEndX = aViewData.GetRefEndX(); 272 SCROW nEndY = aViewData.GetRefEndY(); 273 ScRange aDelRange; 274 if ( aViewData.GetFillMode() == SC_FILL_MATRIX && !(nScFillModeMouseModifier & KEY_MOD1) ) 275 { 276 aHelpStr = ScGlobal::GetRscString( STR_TIP_RESIZEMATRIX ); 277 SCCOL nCols = nEndX + 1 - aViewData.GetRefStartX(); // Reihenfolge ist richtig 278 SCROW nRows = nEndY + 1 - aViewData.GetRefStartY(); 279 aHelpStr.SearchAndReplace( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("%1")), 280 String::CreateFromInt32(nRows) ); 281 aHelpStr.SearchAndReplace( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("%2")), 282 String::CreateFromInt32(nCols) ); 283 } 284 else if ( aViewData.GetDelMark( aDelRange ) ) 285 aHelpStr = ScGlobal::GetRscString( STR_QUICKHELP_DELETE ); 286 else if ( nEndX != aMarkRange.aEnd.Col() || nEndY != aMarkRange.aEnd.Row() ) 287 aHelpStr = pDoc->GetAutoFillPreview( aMarkRange, nEndX, nEndY ); 288 289 // je nach Richtung die obere oder untere Ecke: 290 SCCOL nAddX = ( nEndX >= aMarkRange.aEnd.Col() ) ? 1 : 0; 291 SCROW nAddY = ( nEndY >= aMarkRange.aEnd.Row() ) ? 1 : 0; 292 Point aPos = aViewData.GetScrPos( nEndX+nAddX, nEndY+nAddY, aViewData.GetActivePart() ); 293 aPos.X() += 8; 294 aPos.Y() += 4; 295 Window* pWin = GetActiveWin(); 296 if ( pWin ) 297 aPos = pWin->OutputToScreenPixel( aPos ); 298 Rectangle aRect( aPos, aPos ); 299 sal_uInt16 nAlign = QUICKHELP_LEFT|QUICKHELP_TOP; 300 Help::ShowQuickHelp(pWin, aRect, aHelpStr, nAlign); 301 } 302 } 303 304 void ScTabView::InitRefMode( SCCOL nCurX, SCROW nCurY, SCTAB nCurZ, ScRefType eType, sal_Bool bPaint ) 305 { 306 ScDocument* pDoc = aViewData.GetDocument(); 307 ScMarkData& rMark = aViewData.GetMarkData(); 308 if (!aViewData.IsRefMode()) 309 { 310 aViewData.SetRefMode( sal_True, eType ); 311 aViewData.SetRefStart( nCurX, nCurY, nCurZ ); 312 aViewData.SetRefEnd( nCurX, nCurY, nCurZ ); 313 314 if (nCurZ == aViewData.GetTabNo() && bPaint) 315 { 316 SCCOL nStartX = nCurX; 317 SCROW nStartY = nCurY; 318 SCCOL nEndX = nCurX; 319 SCROW nEndY = nCurY; 320 pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, aViewData.GetTabNo() ); 321 322 //! nur Markierung ueber Inhalte zeichnen! 323 PaintArea( nStartX,nStartY,nEndX,nEndY, SC_UPDATE_MARKS ); 324 325 // SetReference ohne Merge-Anpassung 326 ScRange aRef( nCurX,nCurY,nCurZ, nCurX,nCurY,nCurZ ); 327 SC_MOD()->SetReference( aRef, pDoc, &rMark ); 328 } 329 } 330 } 331 332 //UNUSED2008-05 void ScTabView::EndSelection() 333 //UNUSED2008-05 { 334 //UNUSED2008-05 ScModule* pScMod = SC_MOD(); 335 //UNUSED2008-05 sal_Bool bRefMode = pScMod->IsFormulaMode(); 336 //UNUSED2008-05 if ( bRefMode ) 337 //UNUSED2008-05 pScMod->EndReference(); 338 //UNUSED2008-05 } 339 340 // static 341 void ScTabView::SetScrollBar( ScrollBar& rScroll, long nRangeMax, long nVisible, long nPos, sal_Bool bLayoutRTL ) 342 { 343 if ( nVisible == 0 ) 344 nVisible = 1; // #i59893# don't use visible size 0 345 346 // RTL layout uses a negative range to simulate a mirrored scroll bar. 347 // SetScrollBar/GetScrollBarPos hide this so outside of these functions normal cell 348 // addresses can be used. 349 350 if ( bLayoutRTL ) 351 { 352 rScroll.SetRange( Range( -nRangeMax, 0 ) ); 353 rScroll.SetVisibleSize( nVisible ); 354 rScroll.SetThumbPos( -nPos - nVisible ); 355 } 356 else 357 { 358 rScroll.SetRange( Range( 0, nRangeMax ) ); 359 rScroll.SetVisibleSize( nVisible ); 360 rScroll.SetThumbPos( nPos ); 361 } 362 } 363 364 // static 365 long ScTabView::GetScrollBarPos( ScrollBar& rScroll, sal_Bool bLayoutRTL ) 366 { 367 if ( bLayoutRTL ) 368 return -rScroll.GetThumbPos() - rScroll.GetVisibleSize(); 369 else 370 return rScroll.GetThumbPos(); 371 } 372 373 // UpdateScrollBars - sichtbaren Bereich und Scrollweite der Scrollbars einstellen 374 375 long lcl_UpdateBar( ScrollBar& rScroll, SCCOLROW nSize ) // Size = (komplette) Zellen 376 { 377 long nOldPos; 378 long nNewPos; 379 380 nOldPos = rScroll.GetThumbPos(); 381 rScroll.SetPageSize( static_cast<long>(nSize) ); 382 nNewPos = rScroll.GetThumbPos(); 383 #ifndef UNX 384 rScroll.SetPageSize( 1 ); // immer moeglich ! 385 #endif 386 387 return nNewPos - nOldPos; 388 } 389 390 long lcl_GetScrollRange( SCCOLROW nDocEnd, SCCOLROW nPos, SCCOLROW nVis, SCCOLROW nMax, SCCOLROW nStart ) 391 { 392 // get the end (positive) of a scroll bar range that always starts at 0 393 394 ++nVis; 395 ++nMax; // for partially visible cells 396 SCCOLROW nEnd = Max(nDocEnd, (SCCOLROW)(nPos+nVis)) + nVis; 397 if (nEnd > nMax) 398 nEnd = nMax; 399 400 return ( nEnd - nStart ); // for range starting at 0 401 } 402 403 void ScTabView::UpdateScrollBars() 404 { 405 long nDiff; 406 sal_Bool bTop = ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ); 407 sal_Bool bRight = ( aViewData.GetHSplitMode() != SC_SPLIT_NONE ); 408 ScDocument* pDoc = aViewData.GetDocument(); 409 SCTAB nTab = aViewData.GetTabNo(); 410 sal_Bool bMirror = pDoc->IsLayoutRTL( nTab ) != Application::GetSettings().GetLayoutRTL(); 411 SCCOL nUsedX; 412 SCROW nUsedY; 413 pDoc->GetTableArea( nTab, nUsedX, nUsedY ); //! cachen !!!!!!!!!!!!!!! 414 415 SCCOL nVisXL = 0; 416 SCCOL nVisXR = 0; 417 SCROW nVisYB = 0; 418 SCROW nVisYT = 0; 419 420 SCCOL nStartX = 0; 421 SCROW nStartY = 0; 422 if (aViewData.GetHSplitMode()==SC_SPLIT_FIX) 423 nStartX = aViewData.GetFixPosX(); 424 if (aViewData.GetVSplitMode()==SC_SPLIT_FIX) 425 nStartY = aViewData.GetFixPosY(); 426 427 nVisXL = aViewData.VisibleCellsX( SC_SPLIT_LEFT ); 428 long nMaxXL = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_LEFT), nVisXL, MAXCOL, 0 ); 429 SetScrollBar( aHScrollLeft, nMaxXL, nVisXL, aViewData.GetPosX( SC_SPLIT_LEFT ), bMirror ); 430 431 nVisYB = aViewData.VisibleCellsY( SC_SPLIT_BOTTOM ); 432 long nMaxYB = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_BOTTOM), nVisYB, MAXROW, nStartY ); 433 SetScrollBar( aVScrollBottom, nMaxYB, nVisYB, aViewData.GetPosY( SC_SPLIT_BOTTOM ) - nStartY, sal_False ); 434 435 if (bRight) 436 { 437 nVisXR = aViewData.VisibleCellsX( SC_SPLIT_RIGHT ); 438 long nMaxXR = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_RIGHT), nVisXR, MAXCOL, nStartX ); 439 SetScrollBar( aHScrollRight, nMaxXR, nVisXR, aViewData.GetPosX( SC_SPLIT_RIGHT ) - nStartX, bMirror ); 440 } 441 442 if (bTop) 443 { 444 nVisYT = aViewData.VisibleCellsY( SC_SPLIT_TOP ); 445 long nMaxYT = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_TOP), nVisYT, MAXROW, 0 ); 446 SetScrollBar( aVScrollTop, nMaxYT, nVisYT, aViewData.GetPosY( SC_SPLIT_TOP ), sal_False ); 447 } 448 449 // Bereich testen 450 451 nDiff = lcl_UpdateBar( aHScrollLeft, nVisXL ); 452 if (nDiff) ScrollX( nDiff, SC_SPLIT_LEFT ); 453 if (bRight) 454 { 455 nDiff = lcl_UpdateBar( aHScrollRight, nVisXR ); 456 if (nDiff) ScrollX( nDiff, SC_SPLIT_RIGHT ); 457 } 458 459 nDiff = lcl_UpdateBar( aVScrollBottom, nVisYB ); 460 if (nDiff) ScrollY( nDiff, SC_SPLIT_BOTTOM ); 461 if (bTop) 462 { 463 nDiff = lcl_UpdateBar( aVScrollTop, nVisYT ); 464 if (nDiff) ScrollY( nDiff, SC_SPLIT_TOP ); 465 } 466 467 // set visible area for online spelling 468 469 if ( aViewData.IsActive() ) 470 { 471 ScSplitPos eActive = aViewData.GetActivePart(); 472 ScHSplitPos eHWhich = WhichH( eActive ); 473 ScVSplitPos eVWhich = WhichV( eActive ); 474 SCCOL nPosX = aViewData.GetPosX(eHWhich); 475 SCROW nPosY = aViewData.GetPosY(eVWhich); 476 SCCOL nEndX = nPosX + ( ( eHWhich == SC_SPLIT_LEFT ) ? nVisXL : nVisXR ); 477 SCROW nEndY = nPosY + ( ( eVWhich == SC_SPLIT_TOP ) ? nVisYT : nVisYB ); 478 if ( nEndX > MAXCOL ) nEndX = MAXCOL; 479 if ( nEndY > MAXROW ) nEndY = MAXROW; 480 ScRange aVisible( nPosX, nPosY, nTab, nEndX, nEndY, nTab ); 481 if ( pDoc->SetVisibleSpellRange( aVisible ) ) 482 SC_MOD()->AnythingChanged(); // if visible area has changed 483 } 484 } 485 486 #ifndef HDR_SLIDERSIZE 487 #define HDR_SLIDERSIZE 2 488 #endif 489 490 void ScTabView::InvertHorizontal( ScVSplitPos eWhich, long nDragPos ) 491 { 492 for (sal_uInt16 i=0; i<4; i++) 493 if (WhichV((ScSplitPos)i)==eWhich) 494 { 495 ScGridWindow* pWin = pGridWin[i]; 496 if (pWin) 497 { 498 Rectangle aRect( 0,nDragPos, pWin->GetOutputSizePixel().Width()-1,nDragPos+HDR_SLIDERSIZE-1 ); 499 pWin->Update(); 500 pWin->DoInvertRect( aRect ); // Pixel 501 } 502 } 503 } 504 505 void ScTabView::InvertVertical( ScHSplitPos eWhich, long nDragPos ) 506 { 507 for (sal_uInt16 i=0; i<4; i++) 508 if (WhichH((ScSplitPos)i)==eWhich) 509 { 510 ScGridWindow* pWin = pGridWin[i]; 511 if (pWin) 512 { 513 Rectangle aRect( nDragPos,0, nDragPos+HDR_SLIDERSIZE-1,pWin->GetOutputSizePixel().Height()-1 ); 514 pWin->Update(); 515 pWin->DoInvertRect( aRect ); // Pixel 516 } 517 } 518 } 519 520 //================================================================== 521 522 void ScTabView::InterpretVisible() 523 { 524 // make sure all visible cells are interpreted, 525 // so the next paint will not execute a macro function 526 527 ScDocument* pDoc = aViewData.GetDocument(); 528 if ( !pDoc->GetAutoCalc() ) 529 return; 530 531 SCTAB nTab = aViewData.GetTabNo(); 532 for (sal_uInt16 i=0; i<4; i++) 533 { 534 // rely on gridwin pointers to find used panes 535 // no IsVisible test in case the whole view is not yet shown 536 537 if (pGridWin[i]) 538 { 539 ScHSplitPos eHWhich = WhichH( ScSplitPos(i) ); 540 ScVSplitPos eVWhich = WhichV( ScSplitPos(i) ); 541 542 SCCOL nX1 = aViewData.GetPosX( eHWhich ); 543 SCROW nY1 = aViewData.GetPosY( eVWhich ); 544 SCCOL nX2 = nX1 + aViewData.VisibleCellsX( eHWhich ); 545 SCROW nY2 = nY1 + aViewData.VisibleCellsY( eVWhich ); 546 547 if (nX2 > MAXCOL) nX2 = MAXCOL; 548 if (nY2 > MAXROW) nY2 = MAXROW; 549 550 ScCellIterator aIter( pDoc, nX1, nY1, nTab, nX2, nY2, nTab ); 551 ScBaseCell* pCell = aIter.GetFirst(); 552 while ( pCell ) 553 { 554 if ( pCell->GetCellType() == CELLTYPE_FORMULA && ((ScFormulaCell*)pCell)->GetDirty() ) 555 ((ScFormulaCell*)pCell)->Interpret(); 556 557 pCell = aIter.GetNext(); 558 } 559 } 560 } 561 562 // #i65047# repaint during the above loop may have set the bNeedsRepaint flag 563 CheckNeedsRepaint(); 564 } 565 566 567 568 569 570