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 336 : void ScTabView::HideTip()
39 : {
40 336 : if ( nTipVisible )
41 : {
42 0 : Help::HideTip( nTipVisible );
43 0 : nTipVisible = 0;
44 : }
45 336 : }
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 0 : QuickHelpFlags nFlags = ( bLeft ? QuickHelpFlags::Right : QuickHelpFlags::Left ) |
79 0 : ( bTop ? QuickHelpFlags::Bottom : QuickHelpFlags::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 & ~QuickHelpFlags::Top ) | QuickHelpFlags::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 : QuickHelpFlags nAlign = QuickHelpFlags::Left|QuickHelpFlags::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 5812 : void ScTabView::SetScrollBar( ScrollBar& rScroll, long nRangeMax, long nVisible, long nPos, bool bLayoutRTL )
313 : {
314 5812 : if ( nVisible == 0 )
315 1488 : nVisible = 1; // #i59893# don't use visible size 0
316 :
317 5812 : rScroll.SetRange( Range( 0, nRangeMax ) );
318 5812 : rScroll.SetVisibleSize( nVisible );
319 5812 : rScroll.SetThumbPos( nPos );
320 :
321 5812 : rScroll.EnableRTL( bLayoutRTL );
322 5812 : }
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 5812 : static long lcl_UpdateBar( ScrollBar& rScroll, SCCOLROW nSize ) // Size = (komplette) Zellen
332 : {
333 : long nOldPos;
334 : long nNewPos;
335 :
336 5812 : nOldPos = rScroll.GetThumbPos();
337 5812 : rScroll.SetPageSize( static_cast<long>(nSize) );
338 5812 : nNewPos = rScroll.GetThumbPos();
339 : #ifndef UNX
340 : rScroll.SetPageSize( 1 ); // immer moeglich !
341 : #endif
342 :
343 5812 : return nNewPos - nOldPos;
344 : }
345 :
346 5812 : 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 5812 : ++nVis;
351 5812 : ++nMax; // for partially visible cells
352 5812 : SCCOLROW nEnd = std::max(nDocEnd, (SCCOLROW)(nPos+nVis)) + nVis;
353 5812 : if (nEnd > nMax)
354 25 : nEnd = nMax;
355 :
356 5812 : return ( nEnd - nStart ); // for range starting at 0
357 : }
358 :
359 2897 : void ScTabView::UpdateScrollBars()
360 : {
361 : long nDiff;
362 2897 : bool bTop = ( aViewData.GetVSplitMode() != SC_SPLIT_NONE );
363 2897 : bool bRight = ( aViewData.GetHSplitMode() != SC_SPLIT_NONE );
364 2897 : ScDocument* pDoc = aViewData.GetDocument();
365 2897 : SCTAB nTab = aViewData.GetTabNo();
366 2897 : bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
367 : SCCOL nUsedX;
368 : SCROW nUsedY;
369 2897 : pDoc->GetTableArea( nTab, nUsedX, nUsedY ); //! cachen !!!!!!!!!!!!!!!
370 :
371 2897 : SCCOL nVisXL = 0;
372 2897 : SCCOL nVisXR = 0;
373 2897 : SCROW nVisYB = 0;
374 2897 : SCROW nVisYT = 0;
375 :
376 2897 : SCCOL nStartX = 0;
377 2897 : SCROW nStartY = 0;
378 2897 : if (aViewData.GetHSplitMode()==SC_SPLIT_FIX)
379 1 : nStartX = aViewData.GetFixPosX();
380 2897 : if (aViewData.GetVSplitMode()==SC_SPLIT_FIX)
381 2 : nStartY = aViewData.GetFixPosY();
382 :
383 2897 : nVisXL = aViewData.VisibleCellsX( SC_SPLIT_LEFT );
384 2897 : long nMaxXL = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_LEFT), nVisXL, MAXCOL, 0 );
385 2897 : SetScrollBar( *aHScrollLeft.get(), nMaxXL, nVisXL, aViewData.GetPosX( SC_SPLIT_LEFT ), bLayoutRTL );
386 :
387 2897 : nVisYB = aViewData.VisibleCellsY( SC_SPLIT_BOTTOM );
388 2897 : long nMaxYB = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_BOTTOM), nVisYB, MAXROW, nStartY );
389 2897 : SetScrollBar( *aVScrollBottom.get(), nMaxYB, nVisYB, aViewData.GetPosY( SC_SPLIT_BOTTOM ) - nStartY, bLayoutRTL );
390 :
391 2897 : if (bRight)
392 : {
393 6 : nVisXR = aViewData.VisibleCellsX( SC_SPLIT_RIGHT );
394 6 : long nMaxXR = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_RIGHT), nVisXR, MAXCOL, nStartX );
395 6 : SetScrollBar( *aHScrollRight.get(), nMaxXR, nVisXR, aViewData.GetPosX( SC_SPLIT_RIGHT ) - nStartX, bLayoutRTL );
396 : }
397 :
398 2897 : if (bTop)
399 : {
400 12 : nVisYT = aViewData.VisibleCellsY( SC_SPLIT_TOP );
401 12 : long nMaxYT = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_TOP), nVisYT, MAXROW, 0 );
402 12 : SetScrollBar( *aVScrollTop.get(), nMaxYT, nVisYT, aViewData.GetPosY( SC_SPLIT_TOP ), bLayoutRTL );
403 : }
404 :
405 : // Bereich testen
406 :
407 2897 : nDiff = lcl_UpdateBar( *aHScrollLeft.get(), nVisXL );
408 2897 : if (nDiff) ScrollX( nDiff, SC_SPLIT_LEFT );
409 2897 : if (bRight)
410 : {
411 6 : nDiff = lcl_UpdateBar( *aHScrollRight.get(), nVisXR );
412 6 : if (nDiff) ScrollX( nDiff, SC_SPLIT_RIGHT );
413 : }
414 :
415 2897 : nDiff = lcl_UpdateBar( *aVScrollBottom.get(), nVisYB );
416 2897 : if (nDiff) ScrollY( nDiff, SC_SPLIT_BOTTOM );
417 2897 : if (bTop)
418 : {
419 12 : nDiff = lcl_UpdateBar( *aVScrollTop.get(), nVisYT );
420 12 : if (nDiff) ScrollY( nDiff, SC_SPLIT_TOP );
421 : }
422 :
423 : // set visible area for online spelling
424 :
425 2897 : if ( aViewData.IsActive() )
426 : {
427 2895 : if (UpdateVisibleRange())
428 1227 : SC_MOD()->AnythingChanged(); // if visible area has changed
429 : }
430 2897 : }
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 2786 : 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 2786 : ScDocument* pDoc = aViewData.GetDocument();
472 2786 : if ( !pDoc->GetAutoCalc() )
473 2786 : return;
474 :
475 2786 : SCTAB nTab = aViewData.GetTabNo();
476 13930 : 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 11144 : if (pGridWin[i])
482 : {
483 2894 : ScHSplitPos eHWhich = WhichH( ScSplitPos(i) );
484 2894 : ScVSplitPos eVWhich = WhichV( ScSplitPos(i) );
485 :
486 2894 : SCCOL nX1 = SanitizeCol( aViewData.GetPosX( eHWhich ));
487 2894 : SCROW nY1 = SanitizeRow( aViewData.GetPosY( eVWhich ));
488 2894 : SCCOL nX2 = SanitizeCol( nX1 + aViewData.VisibleCellsX( eHWhich ));
489 2894 : SCROW nY2 = SanitizeRow( nY1 + aViewData.VisibleCellsY( eVWhich ));
490 :
491 2894 : pDoc->InterpretDirtyCells(ScRange(nX1, nY1, nTab, nX2, nY2, nTab));
492 : }
493 : }
494 :
495 : // #i65047# repaint during the above loop may have set the bNeedsRepaint flag
496 2786 : CheckNeedsRepaint();
497 156 : }
498 :
499 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|