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