Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <vcl/help.hxx>
21 : #include <vcl/svapp.hxx>
22 :
23 : #include "tabview.hxx"
24 : #include "document.hxx"
25 : #include "docsh.hxx"
26 : #include "scmod.hxx"
27 : #include "gridwin.hxx"
28 : #include "globstr.hrc"
29 : #include "formulacell.hxx"
30 : #include "dociter.hxx"
31 :
32 : extern sal_uInt16 nScFillModeMouseModifier; // global.cxx
33 :
34 : // STATIC DATA -----------------------------------------------------------
35 :
36 : // --- Referenz-Eingabe / Fill-Cursor
37 :
38 542 : void ScTabView::HideTip()
39 : {
40 542 : if ( nTipVisible )
41 : {
42 0 : Help::HideTip( nTipVisible );
43 0 : nTipVisible = 0;
44 : }
45 542 : }
46 :
47 0 : void ScTabView::ShowRefTip()
48 : {
49 0 : bool bDone = false;
50 0 : if ( aViewData.GetRefType() == SC_REFTYPE_REF && Help::IsQuickHelpEnabled() )
51 : {
52 0 : SCCOL nStartX = aViewData.GetRefStartX();
53 0 : SCROW nStartY = aViewData.GetRefStartY();
54 0 : SCCOL nEndX = aViewData.GetRefEndX();
55 0 : SCROW nEndY = aViewData.GetRefEndY();
56 0 : if ( nEndX != nStartX || nEndY != nStartY ) // nicht fuer einzelne Zelle
57 : {
58 0 : bool bLeft = ( nEndX < nStartX );
59 0 : bool bTop = ( nEndY < nStartY );
60 0 : PutInOrder( nStartX, nEndX );
61 0 : PutInOrder( nStartY, nEndY );
62 0 : SCCOL nCols = nEndX+1-nStartX;
63 0 : SCROW nRows = nEndY+1-nStartY;
64 :
65 0 : OUString aHelp = ScGlobal::GetRscString( STR_QUICKHELP_REF );
66 0 : aHelp = aHelp.replaceFirst("%1", OUString::number(nRows) );
67 0 : aHelp = aHelp.replaceFirst("%2", OUString::number(nCols) );
68 :
69 0 : ScSplitPos eWhich = aViewData.GetActivePart();
70 0 : vcl::Window* pWin = pGridWin[eWhich];
71 0 : if ( pWin )
72 : {
73 0 : Point aStart = aViewData.GetScrPos( nStartX, nStartY, eWhich );
74 0 : Point aEnd = aViewData.GetScrPos( nEndX+1, nEndY+1, eWhich );
75 :
76 0 : Point aPos( bLeft ? aStart.X() : ( aEnd.X() + 3 ),
77 0 : bTop ? aStart.Y() : ( aEnd.Y() + 3 ) );
78 : sal_uInt16 nFlags = ( bLeft ? QUICKHELP_RIGHT : QUICKHELP_LEFT ) |
79 0 : ( bTop ? QUICKHELP_BOTTOM : QUICKHELP_TOP );
80 :
81 : // nicht ueber die editierte Formel
82 0 : if ( !bTop && aViewData.HasEditView( eWhich ) &&
83 0 : nEndY+1 == aViewData.GetEditViewRow() )
84 : {
85 : // dann an der oberen Kante der editierten Zelle ausrichten
86 0 : aPos.Y() -= 2; // die 3 von oben
87 0 : nFlags = ( nFlags & ~QUICKHELP_TOP ) | QUICKHELP_BOTTOM;
88 : }
89 :
90 0 : Rectangle aRect( pWin->OutputToScreenPixel( aPos ), Size(1,1) );
91 :
92 : //! Test, ob geaendert ??
93 :
94 0 : HideTip();
95 0 : nTipVisible = Help::ShowTip( pWin, aRect, aHelp, nFlags );
96 0 : bDone = true;
97 0 : }
98 : }
99 : }
100 :
101 0 : if (!bDone)
102 0 : HideTip();
103 0 : }
104 :
105 0 : void ScTabView::StopRefMode()
106 : {
107 0 : if (aViewData.IsRefMode())
108 : {
109 0 : aViewData.SetRefMode( false, SC_REFTYPE_NONE );
110 :
111 0 : HideTip();
112 0 : UpdateShrinkOverlay();
113 :
114 0 : if ( aViewData.GetTabNo() >= aViewData.GetRefStartZ() &&
115 0 : aViewData.GetTabNo() <= aViewData.GetRefEndZ() )
116 : {
117 0 : ScDocument* pDoc = aViewData.GetDocument();
118 0 : SCCOL nStartX = aViewData.GetRefStartX();
119 0 : SCROW nStartY = aViewData.GetRefStartY();
120 0 : SCCOL nEndX = aViewData.GetRefEndX();
121 0 : SCROW nEndY = aViewData.GetRefEndY();
122 0 : if ( nStartX == nEndX && nStartY == nEndY )
123 0 : pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, aViewData.GetTabNo() );
124 :
125 0 : PaintArea( nStartX,nStartY,nEndX,nEndY, SC_UPDATE_MARKS );
126 : }
127 :
128 0 : pSelEngine->Reset();
129 0 : pSelEngine->SetAddMode( false ); //! sollte das nicht bei Reset passieren?
130 :
131 0 : ScSplitPos eOld = pSelEngine->GetWhich();
132 0 : ScSplitPos eNew = aViewData.GetActivePart();
133 0 : if ( eNew != eOld )
134 : {
135 0 : pSelEngine->SetWindow( pGridWin[ eNew ] );
136 0 : pSelEngine->SetWhich( eNew );
137 : pSelEngine->SetVisibleArea( Rectangle(Point(),
138 0 : pGridWin[eNew]->GetOutputSizePixel()) );
139 0 : pGridWin[eOld]->MoveMouseStatus(*pGridWin[eNew]);
140 : }
141 : }
142 :
143 : // AlignToCursor(SC_FOLLOW_NONE): Only switch active part.
144 : // This must also be done if no RefMode was active (for RangeFinder dragging),
145 : // but if RefMode was set, AlignToCursor must be after SelectionEngine reset,
146 : // so the SelectionEngine SetWindow call from AlignToCursor doesn't capture
147 : // the mouse again when called from Tracking/MouseButtonUp (#94562#).
148 0 : AlignToCursor( aViewData.GetCurX(), aViewData.GetCurY(), SC_FOLLOW_NONE );
149 0 : }
150 :
151 0 : void ScTabView::DoneRefMode( bool bContinue )
152 : {
153 0 : ScDocument* pDoc = aViewData.GetDocument();
154 0 : if ( aViewData.GetRefType() == SC_REFTYPE_REF && bContinue )
155 0 : SC_MOD()->AddRefEntry();
156 :
157 0 : bool bWasRef = aViewData.IsRefMode();
158 0 : aViewData.SetRefMode( false, SC_REFTYPE_NONE );
159 :
160 0 : HideTip();
161 0 : UpdateShrinkOverlay();
162 :
163 : // Paint:
164 0 : if ( bWasRef && aViewData.GetTabNo() >= aViewData.GetRefStartZ() &&
165 0 : aViewData.GetTabNo() <= aViewData.GetRefEndZ() )
166 : {
167 0 : SCCOL nStartX = aViewData.GetRefStartX();
168 0 : SCROW nStartY = aViewData.GetRefStartY();
169 0 : SCCOL nEndX = aViewData.GetRefEndX();
170 0 : SCROW nEndY = aViewData.GetRefEndY();
171 0 : if ( nStartX == nEndX && nStartY == nEndY )
172 0 : pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, aViewData.GetTabNo() );
173 :
174 0 : PaintArea( nStartX,nStartY,nEndX,nEndY, SC_UPDATE_MARKS );
175 : }
176 0 : }
177 :
178 0 : void ScTabView::UpdateRef( SCCOL nCurX, SCROW nCurY, SCTAB nCurZ )
179 : {
180 0 : ScDocument* pDoc = aViewData.GetDocument();
181 :
182 0 : if (!aViewData.IsRefMode())
183 : {
184 : // Das kommt vor, wenn bei einem Referenz-Dialog als erstes mit Control in die
185 : // die Tabelle geklickt wird. Dann die neue Referenz an den alten Inhalt anhaengen:
186 :
187 0 : ScModule* pScMod = SC_MOD();
188 0 : if (pScMod->IsFormulaMode())
189 0 : pScMod->AddRefEntry();
190 :
191 0 : InitRefMode( nCurX, nCurY, nCurZ, SC_REFTYPE_REF );
192 : }
193 :
194 0 : if ( nCurX != aViewData.GetRefEndX() || nCurY != aViewData.GetRefEndY() ||
195 0 : nCurZ != aViewData.GetRefEndZ() )
196 : {
197 0 : ScMarkData& rMark = aViewData.GetMarkData();
198 0 : SCTAB nTab = aViewData.GetTabNo();
199 :
200 0 : SCCOL nStartX = aViewData.GetRefStartX();
201 0 : SCROW nStartY = aViewData.GetRefStartY();
202 0 : SCCOL nEndX = aViewData.GetRefEndX();
203 0 : SCROW nEndY = aViewData.GetRefEndY();
204 0 : if ( nStartX == nEndX && nStartY == nEndY )
205 0 : pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, nTab );
206 0 : ScUpdateRect aRect( nStartX, nStartY, nEndX, nEndY );
207 :
208 0 : aViewData.SetRefEnd( nCurX, nCurY, nCurZ );
209 :
210 0 : nStartX = aViewData.GetRefStartX();
211 0 : nStartY = aViewData.GetRefStartY();
212 0 : nEndX = aViewData.GetRefEndX();
213 0 : nEndY = aViewData.GetRefEndY();
214 0 : if ( nStartX == nEndX && nStartY == nEndY )
215 0 : pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, nTab );
216 0 : aRect.SetNew( nStartX, nStartY, nEndX, nEndY );
217 :
218 0 : ScRefType eType = aViewData.GetRefType();
219 0 : if ( eType == SC_REFTYPE_REF )
220 : {
221 : ScRange aRef(
222 0 : aViewData.GetRefStartX(), aViewData.GetRefStartY(), aViewData.GetRefStartZ(),
223 0 : aViewData.GetRefEndX(), aViewData.GetRefEndY(), aViewData.GetRefEndZ() );
224 0 : SC_MOD()->SetReference( aRef, pDoc, &rMark );
225 0 : ShowRefTip();
226 : }
227 0 : else if ( eType == SC_REFTYPE_EMBED_LT || eType == SC_REFTYPE_EMBED_RB )
228 : {
229 0 : PutInOrder(nStartX,nEndX);
230 0 : PutInOrder(nStartY,nEndY);
231 0 : pDoc->SetEmbedded( ScRange(nStartX,nStartY,nTab, nEndX,nEndY,nTab) );
232 0 : ScDocShell* pDocSh = aViewData.GetDocShell();
233 0 : pDocSh->UpdateOle( &aViewData, true );
234 0 : pDocSh->SetDocumentModified();
235 : }
236 :
237 : SCCOL nPaintStartX;
238 : SCROW nPaintStartY;
239 : SCCOL nPaintEndX;
240 : SCROW nPaintEndY;
241 0 : if (aRect.GetDiff( nPaintStartX, nPaintStartY, nPaintEndX, nPaintEndY ))
242 0 : PaintArea( nPaintStartX, nPaintStartY, nPaintEndX, nPaintEndY, SC_UPDATE_MARKS );
243 : }
244 :
245 : // Tip-Hilfe fuer Auto-Fill
246 0 : if ( aViewData.GetRefType() == SC_REFTYPE_FILL && Help::IsQuickHelpEnabled() )
247 : {
248 0 : vcl::Window* pWin = GetActiveWin();
249 0 : if ( pWin )
250 : {
251 0 : OUString aHelpStr;
252 0 : ScRange aMarkRange;
253 0 : aViewData.GetSimpleArea( aMarkRange );
254 0 : SCCOL nEndX = aViewData.GetRefEndX();
255 0 : SCROW nEndY = aViewData.GetRefEndY();
256 0 : ScRange aDelRange;
257 0 : if ( aViewData.GetFillMode() == SC_FILL_MATRIX && !(nScFillModeMouseModifier & KEY_MOD1) )
258 : {
259 0 : aHelpStr = ScGlobal::GetRscString( STR_TIP_RESIZEMATRIX );
260 0 : SCCOL nCols = nEndX + 1 - aViewData.GetRefStartX(); // Reihenfolge ist richtig
261 0 : SCROW nRows = nEndY + 1 - aViewData.GetRefStartY();
262 0 : aHelpStr = aHelpStr.replaceFirst("%1", OUString::number(nRows) );
263 0 : aHelpStr = aHelpStr.replaceFirst("%2", OUString::number(nCols) );
264 : }
265 0 : else if ( aViewData.GetDelMark( aDelRange ) )
266 0 : aHelpStr = ScGlobal::GetRscString( STR_QUICKHELP_DELETE );
267 0 : else if ( nEndX != aMarkRange.aEnd.Col() || nEndY != aMarkRange.aEnd.Row() )
268 0 : aHelpStr = pDoc->GetAutoFillPreview( aMarkRange, nEndX, nEndY );
269 :
270 : // je nach Richtung die obere oder untere Ecke:
271 0 : SCCOL nAddX = ( nEndX >= aMarkRange.aEnd.Col() ) ? 1 : 0;
272 0 : SCROW nAddY = ( nEndY >= aMarkRange.aEnd.Row() ) ? 1 : 0;
273 0 : Point aPos = aViewData.GetScrPos( nEndX+nAddX, nEndY+nAddY, aViewData.GetActivePart() );
274 0 : aPos.X() += 8;
275 0 : aPos.Y() += 4;
276 0 : aPos = pWin->OutputToScreenPixel( aPos );
277 0 : Rectangle aRect( aPos, aPos );
278 0 : sal_uInt16 nAlign = QUICKHELP_LEFT|QUICKHELP_TOP;
279 0 : Help::ShowQuickHelp(pWin, aRect, aHelpStr, nAlign);
280 : }
281 : }
282 0 : }
283 :
284 0 : void ScTabView::InitRefMode( SCCOL nCurX, SCROW nCurY, SCTAB nCurZ, ScRefType eType, bool bPaint )
285 : {
286 0 : ScDocument* pDoc = aViewData.GetDocument();
287 0 : ScMarkData& rMark = aViewData.GetMarkData();
288 0 : if (!aViewData.IsRefMode())
289 : {
290 0 : aViewData.SetRefMode( true, eType );
291 0 : aViewData.SetRefStart( nCurX, nCurY, nCurZ );
292 0 : aViewData.SetRefEnd( nCurX, nCurY, nCurZ );
293 :
294 0 : if (nCurZ == aViewData.GetTabNo() && bPaint)
295 : {
296 0 : SCCOL nStartX = nCurX;
297 0 : SCROW nStartY = nCurY;
298 0 : SCCOL nEndX = nCurX;
299 0 : SCROW nEndY = nCurY;
300 0 : pDoc->ExtendMerge( nStartX, nStartY, nEndX, nEndY, aViewData.GetTabNo() );
301 :
302 : //! nur Markierung ueber Inhalte zeichnen!
303 0 : PaintArea( nStartX,nStartY,nEndX,nEndY, SC_UPDATE_MARKS );
304 :
305 : // SetReference ohne Merge-Anpassung
306 0 : ScRange aRef( nCurX,nCurY,nCurZ, nCurX,nCurY,nCurZ );
307 0 : SC_MOD()->SetReference( aRef, pDoc, &rMark );
308 : }
309 : }
310 0 : }
311 :
312 7490 : void ScTabView::SetScrollBar( ScrollBar& rScroll, long nRangeMax, long nVisible, long nPos, bool bLayoutRTL )
313 : {
314 7490 : if ( nVisible == 0 )
315 2580 : nVisible = 1; // #i59893# don't use visible size 0
316 :
317 7490 : rScroll.SetRange( Range( 0, nRangeMax ) );
318 7490 : rScroll.SetVisibleSize( nVisible );
319 7490 : rScroll.SetThumbPos( nPos );
320 :
321 7490 : rScroll.EnableRTL( bLayoutRTL );
322 7490 : }
323 :
324 0 : long ScTabView::GetScrollBarPos( ScrollBar& rScroll )
325 : {
326 0 : return rScroll.GetThumbPos();
327 : }
328 :
329 : // UpdateScrollBars - sichtbaren Bereich und Scrollweite der Scrollbars einstellen
330 :
331 7490 : static long lcl_UpdateBar( ScrollBar& rScroll, SCCOLROW nSize ) // Size = (komplette) Zellen
332 : {
333 : long nOldPos;
334 : long nNewPos;
335 :
336 7490 : nOldPos = rScroll.GetThumbPos();
337 7490 : rScroll.SetPageSize( static_cast<long>(nSize) );
338 7490 : nNewPos = rScroll.GetThumbPos();
339 : #ifndef UNX
340 : rScroll.SetPageSize( 1 ); // immer moeglich !
341 : #endif
342 :
343 7490 : return nNewPos - nOldPos;
344 : }
345 :
346 7490 : static long lcl_GetScrollRange( SCCOLROW nDocEnd, SCCOLROW nPos, SCCOLROW nVis, SCCOLROW nMax, SCCOLROW nStart )
347 : {
348 : // get the end (positive) of a scroll bar range that always starts at 0
349 :
350 7490 : ++nVis;
351 7490 : ++nMax; // for partially visible cells
352 7490 : SCCOLROW nEnd = std::max(nDocEnd, (SCCOLROW)(nPos+nVis)) + nVis;
353 7490 : if (nEnd > nMax)
354 2 : nEnd = nMax;
355 :
356 7490 : return ( nEnd - nStart ); // for range starting at 0
357 : }
358 :
359 3724 : void ScTabView::UpdateScrollBars()
360 : {
361 : long nDiff;
362 3724 : bool bTop = ( aViewData.GetVSplitMode() != SC_SPLIT_NONE );
363 3724 : bool bRight = ( aViewData.GetHSplitMode() != SC_SPLIT_NONE );
364 3724 : ScDocument* pDoc = aViewData.GetDocument();
365 3724 : SCTAB nTab = aViewData.GetTabNo();
366 3724 : bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
367 : SCCOL nUsedX;
368 : SCROW nUsedY;
369 3724 : pDoc->GetTableArea( nTab, nUsedX, nUsedY ); //! cachen !!!!!!!!!!!!!!!
370 :
371 3724 : SCCOL nVisXL = 0;
372 3724 : SCCOL nVisXR = 0;
373 3724 : SCROW nVisYB = 0;
374 3724 : SCROW nVisYT = 0;
375 :
376 3724 : SCCOL nStartX = 0;
377 3724 : SCROW nStartY = 0;
378 3724 : if (aViewData.GetHSplitMode()==SC_SPLIT_FIX)
379 2 : nStartX = aViewData.GetFixPosX();
380 3724 : if (aViewData.GetVSplitMode()==SC_SPLIT_FIX)
381 4 : nStartY = aViewData.GetFixPosY();
382 :
383 3724 : nVisXL = aViewData.VisibleCellsX( SC_SPLIT_LEFT );
384 3724 : long nMaxXL = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_LEFT), nVisXL, MAXCOL, 0 );
385 3724 : SetScrollBar( aHScrollLeft, nMaxXL, nVisXL, aViewData.GetPosX( SC_SPLIT_LEFT ), bLayoutRTL );
386 :
387 3724 : nVisYB = aViewData.VisibleCellsY( SC_SPLIT_BOTTOM );
388 3724 : long nMaxYB = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_BOTTOM), nVisYB, MAXROW, nStartY );
389 3724 : SetScrollBar( aVScrollBottom, nMaxYB, nVisYB, aViewData.GetPosY( SC_SPLIT_BOTTOM ) - nStartY, bLayoutRTL );
390 :
391 3724 : if (bRight)
392 : {
393 18 : nVisXR = aViewData.VisibleCellsX( SC_SPLIT_RIGHT );
394 18 : long nMaxXR = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_RIGHT), nVisXR, MAXCOL, nStartX );
395 18 : SetScrollBar( aHScrollRight, nMaxXR, nVisXR, aViewData.GetPosX( SC_SPLIT_RIGHT ) - nStartX, bLayoutRTL );
396 : }
397 :
398 3724 : if (bTop)
399 : {
400 24 : nVisYT = aViewData.VisibleCellsY( SC_SPLIT_TOP );
401 24 : long nMaxYT = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_TOP), nVisYT, MAXROW, 0 );
402 24 : SetScrollBar( aVScrollTop, nMaxYT, nVisYT, aViewData.GetPosY( SC_SPLIT_TOP ), bLayoutRTL );
403 : }
404 :
405 : // Bereich testen
406 :
407 3724 : nDiff = lcl_UpdateBar( aHScrollLeft, nVisXL );
408 3724 : if (nDiff) ScrollX( nDiff, SC_SPLIT_LEFT );
409 3724 : if (bRight)
410 : {
411 18 : nDiff = lcl_UpdateBar( aHScrollRight, nVisXR );
412 18 : if (nDiff) ScrollX( nDiff, SC_SPLIT_RIGHT );
413 : }
414 :
415 3724 : nDiff = lcl_UpdateBar( aVScrollBottom, nVisYB );
416 3724 : if (nDiff) ScrollY( nDiff, SC_SPLIT_BOTTOM );
417 3724 : if (bTop)
418 : {
419 24 : nDiff = lcl_UpdateBar( aVScrollTop, nVisYT );
420 24 : if (nDiff) ScrollY( nDiff, SC_SPLIT_TOP );
421 : }
422 :
423 : // set visible area for online spelling
424 :
425 3724 : if ( aViewData.IsActive() )
426 : {
427 3720 : if (UpdateVisibleRange())
428 1492 : SC_MOD()->AnythingChanged(); // if visible area has changed
429 : }
430 3724 : }
431 :
432 : #ifndef HDR_SLIDERSIZE
433 : #define HDR_SLIDERSIZE 2
434 : #endif
435 :
436 0 : void ScTabView::InvertHorizontal( ScVSplitPos eWhich, long nDragPos )
437 : {
438 0 : for (sal_uInt16 i=0; i<4; i++)
439 0 : if (WhichV((ScSplitPos)i)==eWhich)
440 : {
441 0 : ScGridWindow* pWin = pGridWin[i];
442 0 : if (pWin)
443 : {
444 0 : Rectangle aRect( 0,nDragPos, pWin->GetOutputSizePixel().Width()-1,nDragPos+HDR_SLIDERSIZE-1 );
445 0 : pWin->Update();
446 0 : pWin->DoInvertRect( aRect ); // Pixel
447 : }
448 : }
449 0 : }
450 :
451 0 : void ScTabView::InvertVertical( ScHSplitPos eWhich, long nDragPos )
452 : {
453 0 : for (sal_uInt16 i=0; i<4; i++)
454 0 : if (WhichH((ScSplitPos)i)==eWhich)
455 : {
456 0 : ScGridWindow* pWin = pGridWin[i];
457 0 : if (pWin)
458 : {
459 0 : Rectangle aRect( nDragPos,0, nDragPos+HDR_SLIDERSIZE-1,pWin->GetOutputSizePixel().Height()-1 );
460 0 : pWin->Update();
461 0 : pWin->DoInvertRect( aRect ); // Pixel
462 : }
463 : }
464 0 : }
465 :
466 3616 : void ScTabView::InterpretVisible()
467 : {
468 : // make sure all visible cells are interpreted,
469 : // so the next paint will not execute a macro function
470 :
471 3616 : ScDocument* pDoc = aViewData.GetDocument();
472 3616 : if ( !pDoc->GetAutoCalc() )
473 3616 : return;
474 :
475 3616 : SCTAB nTab = aViewData.GetTabNo();
476 18080 : for (sal_uInt16 i=0; i<4; i++)
477 : {
478 : // rely on gridwin pointers to find used panes
479 : // no IsVisible test in case the whole view is not yet shown
480 :
481 14464 : if (pGridWin[i])
482 : {
483 3856 : ScHSplitPos eHWhich = WhichH( ScSplitPos(i) );
484 3856 : ScVSplitPos eVWhich = WhichV( ScSplitPos(i) );
485 :
486 3856 : SCCOL nX1 = aViewData.GetPosX( eHWhich );
487 3856 : SCROW nY1 = aViewData.GetPosY( eVWhich );
488 3856 : SCCOL nX2 = nX1 + aViewData.VisibleCellsX( eHWhich );
489 3856 : SCROW nY2 = nY1 + aViewData.VisibleCellsY( eVWhich );
490 :
491 3856 : if (nX2 > MAXCOL) nX2 = MAXCOL;
492 3856 : if (nY2 > MAXROW) nY2 = MAXROW;
493 :
494 3856 : pDoc->InterpretDirtyCells(ScRange(nX1, nY1, nTab, nX2, nY2, nTab));
495 : }
496 : }
497 :
498 : // #i65047# repaint during the above loop may have set the bNeedsRepaint flag
499 3616 : CheckNeedsRepaint();
500 228 : }
501 :
502 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|