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