xref: /AOO41X/main/sc/source/ui/view/tabview4.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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 
HideTip()55 void ScTabView::HideTip()
56 {
57     if ( nTipVisible )
58     {
59         Help::HideTip( nTipVisible );
60         nTipVisible = 0;
61     }
62 }
63 
ShowRefTip()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 
StopRefMode()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 
DoneRefMode(sal_Bool bContinue)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 
UpdateRef(SCCOL nCurX,SCROW nCurY,SCTAB nCurZ)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 
InitRefMode(SCCOL nCurX,SCROW nCurY,SCTAB nCurZ,ScRefType eType,sal_Bool bPaint)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
SetScrollBar(ScrollBar & rScroll,long nRangeMax,long nVisible,long nPos,sal_Bool bLayoutRTL)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
GetScrollBarPos(ScrollBar & rScroll,sal_Bool bLayoutRTL)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 
lcl_UpdateBar(ScrollBar & rScroll,SCCOLROW nSize)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 
lcl_GetScrollRange(SCCOLROW nDocEnd,SCCOLROW nPos,SCCOLROW nVis,SCCOLROW nMax,SCCOLROW nStart)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 
UpdateScrollBars()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 
InvertHorizontal(ScVSplitPos eWhich,long nDragPos)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 
InvertVertical(ScHSplitPos eWhich,long nDragPos)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 
InterpretVisible()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