xref: /AOO41X/main/sc/source/ui/view/tabview.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 #if 0
31 #define _MACRODLG_HXX
32 #define _BIGINT_HXX
33 #define _SVCONTNR_HXX
34 #define BASIC_NODIALOGS
35 #define _SFXMNUITEM_HXX
36 #define _SVDXOUT_HXX
37 #define _SVDATTR_HXX
38 #define _SFXMNUITEM_HXX
39 #define _DLGCFG_HXX
40 #define _SFXMNUMGR_HXX
41 #define _SFXBASIC_HXX
42 #define _MODALDLG_HXX
43 #define _SFX_TEMPLDLG_HXX
44 #define _SFXSTBMGR_HXX
45 #define _SFXTBXMGR_HXX
46 #define _BASE_DLGS_HXX
47 #define _SFXIMGMGR_HXX
48 #define _SFXMNUMGR_HXX
49 #define _SFXSTBITEM_HXX
50 #define _SFXTBXCTRL_HXX
51 #define _PASSWD_HXX
52 //#define _SFXFILEDLG_HXX
53 //#define _SFXREQUEST_HXX
54 #define _SFXOBJFACE_HXX
55 
56 #define _SDR_NOTRANSFORM
57 #define _SVDXOUT_HXX
58 #endif
59 #include <vcl/svapp.hxx>
60 
61 ///////////////////////////////////////////////////////////////////////////
62 // NODRAW.HXX
63 // Erweiterte Konstanten, um CLOKs mit SVDRAW.HXX zu vermeiden
64 // Die u.a. Aenderungen nehmen vorgeschlagene Konstante vorweg
65 ///////////////////////////////////////////////////////////////////////////
66 
67 #if 0
68 #define _SDR_NOTRANSFORM        // Transformationen, selten verwendet
69 #define _SDR_NOTOUCH            // Hit-Tests, selten verwendet
70 
71 #define _SDR_NOUNDO             // Undo-Objekte
72 #define _SDR_NOPAGEOBJ          // SdrPageObj
73 #define _SDR_NOVIRTOBJ          // SdrVirtObj
74 #define _SDR_NOGROUPOBJ         // SdrGroupObj
75 #define _SDR_NOTEXTOBJ          // SdrTextObj
76 #define _SDR_NOPATHOBJ          // SdrPathObj
77 #define _SDR_NOEDGEOBJ          // SdrEdgeObj
78 #define _SDR_NORECTOBJ          // SdrRectObj
79 #define _SDR_NOCAPTIONOBJ       // SdrCaptionObj
80 #define _SDR_NOCIRCLEOBJ        // SdrCircleObj
81 #define _SDR_NOGRAFOBJ          // SdrGrafObj
82 #define _SDR_NOOLE2OBJ          // SdrOle2Obj
83 #endif
84 
85 // Dieses define entfernt die VCControls aus SI.HXX
86 
87 #define _SI_HXX                 // VCControls
88 
89 ////////////////////// Umsetzen der Standard-Defines //////////////////////
90 
91 //#define _SVDDRAG_HXX      // SdrDragStat
92 #define _SVDPAGE_HXX        // SdrPage
93 
94 #ifdef _SDR_NOSURROGATEOBJ
95     #undef _SDR_NOSURROGATEOBJ
96     #define _SVDSURO_HXX
97 #endif
98 
99 #ifdef _SDR_NOPAGEOBJ
100     #undef _SDR_NOPAGEOBJ
101     #define _SVDOPAGE_HXX
102 #endif
103 
104 #ifdef _SDR_NOVIRTOBJ
105     #undef _SDR_NOVIRTOBJ
106     #define _SVDOVIRT_HXX
107 #endif
108 
109 #ifdef _SDR_NOGROUPOBJ
110     #undef _SDR_NOGROUPOBJ
111     #define _SVDOGRP_HXX
112 #endif
113 
114 #ifdef _SDR_NOTEXTOBJ
115     #undef _SDR_NOTEXTOBJ
116     #define _SVDOTEXT_HXX
117 #endif
118 
119 #ifdef _SDR_NOPATHOBJ
120     #undef _SDR_NOPATHOBJ
121     #define _SVDOPATH_HXX
122 #endif
123 
124 #ifdef _SDR_NOEDGEOBJ
125     #undef _SDR_NOEDGEOBJ
126     #define _SVDOEDGE_HXX
127 #endif
128 
129 #ifdef _SDR_NORECTOBJ
130     #undef _SDR_NORECTOBJ
131     #define _SVDORECT_HXX
132 #else
133     #undef _SDVOTEXT_OBJ
134 #endif
135 
136 #ifdef _SDR_NOCAPTIONOBJ
137     #undef _SDR_NOCAPTIONOBJ
138     #define _SVDCAPT_HXX
139 #endif
140 
141 #ifdef _SDR_NOCIRCLEOBJ
142     #undef _SDR_NOCIRCLEOBJ
143     #define _SVDOCIRC_HXX
144 #endif
145 
146 #ifdef _SDR_NOGRAFOBJ
147     #undef _SDR_NOGRAFOBJ
148     #define _SVDOGRAF_HXX
149 #else
150     #undef _SVDOTEXT_HXX
151     #undef _SVDORECT_HXX
152 #endif
153 
154 #ifdef _SDR_NOOLE2OBJ
155     #undef _SDR_NOOLE2OBJ
156     #define _SVDOOLE2_HXX
157 #else
158     #undef _SVDOTEXT_HXX
159     #undef _SVDORECT_HXX
160 #endif
161 
162 //#ifdef _SDR_NOVIEWS
163 //  #define _SVDDRAG_HXX
164 //#endif
165 
166 ////////////////////// Ende der SVDRAW-Modifikationen /////////////////////
167 
168 
169 // INCLUDE ---------------------------------------------------------------
170 
171 #include "scitems.hxx"
172 #include <sfx2/viewfrm.hxx>
173 #include <sfx2/bindings.hxx>
174 #include <vcl/help.hxx>
175 #include <rtl/logfile.hxx>
176 
177 #include "tabview.hxx"
178 #include "tabvwsh.hxx"
179 #include "document.hxx"
180 #include "gridwin.hxx"
181 #include "olinewin.hxx"
182 #include "olinetab.hxx"
183 #include "tabsplit.hxx"
184 #include "colrowba.hxx"
185 #include "tabcont.hxx"
186 #include "scmod.hxx"
187 #include "sc.hrc"
188 #include "viewutil.hxx"
189 #include "globstr.hrc"
190 #include "drawview.hxx"
191 #include "docsh.hxx"
192 #include "viewuno.hxx"
193 #include "AccessibilityHints.hxx"
194 #include "appoptio.hxx"
195 
196 #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
197 
198 #include <string>
199 #include <algorithm>
200 
201 #define SPLIT_MARGIN    30
202 #define SC_ICONSIZE     36
203 
204 #define SC_SCROLLBAR_MIN    30
205 #define SC_TABBAR_MIN       6
206 
207 //  fuer Rad-Maus
208 #define SC_DELTA_ZOOM   10
209 
210 using namespace ::com::sun::star;
211 
212 // STATIC DATA -----------------------------------------------------------
213 
214 
215 //==================================================================
216 
217 //  Corner-Button
218 
ScCornerButton(Window * pParent,ScViewData * pData,sal_Bool bAdditional)219 ScCornerButton::ScCornerButton( Window* pParent, ScViewData* pData, sal_Bool bAdditional ) :
220     Window( pParent, WinBits( 0 ) ),
221     pViewData( pData ),
222     bAdd( bAdditional )
223 {
224     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
225     SetBackground( rStyleSettings.GetFaceColor() );
226     EnableRTL( sal_False );
227 }
228 
~ScCornerButton()229 __EXPORT ScCornerButton::~ScCornerButton()
230 {
231 }
232 
Paint(const Rectangle & rRect)233 void __EXPORT ScCornerButton::Paint( const Rectangle& rRect )
234 {
235     Size aSize = GetOutputSizePixel();
236     long nPosX = aSize.Width()-1;
237     long nPosY = aSize.Height()-1;
238 
239     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
240 
241     Window::Paint(rRect);
242 
243     sal_Bool bLayoutRTL = pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() );
244     long nDarkX = bLayoutRTL ? 0 : nPosX;
245 
246     if ( !bAdd && !rStyleSettings.GetHighContrastMode() )
247     {
248         // match the shaded look of column/row headers
249 
250         Color aFace( rStyleSettings.GetFaceColor() );
251         Color aWhite( COL_WHITE );
252         Color aCenter( aFace );
253         aCenter.Merge( aWhite, 0xd0 );          // lighten up a bit
254         Color aOuter( aFace );
255         aOuter.Merge( aWhite, 0xa0 );           // lighten up more
256 
257         long nCenterX = (aSize.Width() / 2) - 1;
258         long nCenterY = (aSize.Height() / 2) - 1;
259 
260         SetLineColor();
261         SetFillColor(aCenter);
262         DrawRect( Rectangle( nCenterX, nCenterY, nCenterX, nPosY ) );
263         DrawRect( Rectangle( nCenterX, nCenterY, nDarkX, nCenterY ) );
264         SetFillColor(aOuter);
265         DrawRect( Rectangle( 0, 0, nPosX, nCenterY-1 ) );
266         if ( bLayoutRTL )
267             DrawRect( Rectangle( nCenterX+1, nCenterY, nPosX, nPosY ) );
268         else
269             DrawRect( Rectangle( 0, nCenterY, nCenterX-1, nPosY ) );
270     }
271 
272     //  both buttons have the same look now - only dark right/bottom lines
273     SetLineColor( rStyleSettings.GetDarkShadowColor() );
274     DrawLine( Point(0,nPosY), Point(nPosX,nPosY) );
275     DrawLine( Point(nDarkX,0), Point(nDarkX,nPosY) );
276 }
277 
StateChanged(StateChangedType nType)278 void ScCornerButton::StateChanged( StateChangedType nType )
279 {
280     Window::StateChanged( nType );
281 
282     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
283     SetBackground( rStyleSettings.GetFaceColor() );
284     Invalidate();
285 }
286 
287 // -----------------------------------------------------------------------
288 
DataChanged(const DataChangedEvent & rDCEvt)289 void ScCornerButton::DataChanged( const DataChangedEvent& rDCEvt )
290 {
291     Window::DataChanged( rDCEvt );
292 
293     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
294     SetBackground( rStyleSettings.GetFaceColor() );
295     Invalidate();
296 }
297 
298 
Resize()299 void __EXPORT ScCornerButton::Resize()
300 {
301     Invalidate();
302 }
303 
MouseButtonDown(const MouseEvent & rMEvt)304 void __EXPORT ScCornerButton::MouseButtonDown( const MouseEvent& rMEvt )
305 {
306     ScModule* pScMod = SC_MOD();
307     sal_Bool bDisable = pScMod->IsFormulaMode() || pScMod->IsModalMode();
308     if (!bDisable)
309     {
310         ScTabViewShell* pViewSh = pViewData->GetViewShell();
311         pViewSh->SetActive();                                   // Appear und SetViewFrame
312         pViewSh->ActiveGrabFocus();
313 
314         sal_Bool bControl = rMEvt.IsMod1();
315         pViewSh->SelectAll( bControl );
316     }
317 }
318 
319 //==================================================================
320 
lcl_HasColOutline(const ScViewData & rViewData)321 sal_Bool lcl_HasColOutline( const ScViewData& rViewData )
322 {
323     const ScOutlineTable* pTable = rViewData.GetDocument()->GetOutlineTable(rViewData.GetTabNo());
324     if (pTable)
325     {
326         const ScOutlineArray* pArray = pTable->GetColArray();
327         if ( pArray->GetDepth() > 0 )
328             return sal_True;
329     }
330     return sal_False;
331 }
332 
lcl_HasRowOutline(const ScViewData & rViewData)333 sal_Bool lcl_HasRowOutline( const ScViewData& rViewData )
334 {
335     const ScOutlineTable* pTable = rViewData.GetDocument()->GetOutlineTable(rViewData.GetTabNo());
336     if (pTable)
337     {
338         const ScOutlineArray* pArray = pTable->GetRowArray();
339         if ( pArray->GetDepth() > 0 )
340             return sal_True;
341     }
342     return sal_False;
343 }
344 
345 //==================================================================
346 
347 //  Init und Konstruktoren
348 //  ScTabView::Init() in tabview5.cxx wegen out of keys
349 
350 
351 #define TABVIEW_INIT    \
352             pSelEngine( NULL ),                                             \
353             aFunctionSet( &aViewData ),                                     \
354             pHdrSelEng( NULL ),                                             \
355             aHdrFunc( &aViewData ),                                         \
356             pDrawView( NULL ),                                              \
357             bDrawSelMode( sal_False ),                                          \
358             aVScrollTop( pFrameWin, WinBits( WB_VSCROLL | WB_DRAG ) ),      \
359             aVScrollBottom( pFrameWin, WinBits( WB_VSCROLL | WB_DRAG ) ),   \
360             aHScrollLeft( pFrameWin, WinBits( WB_HSCROLL | WB_DRAG ) ),     \
361             aHScrollRight( pFrameWin, WinBits( WB_HSCROLL | WB_DRAG ) ),    \
362             aCornerButton( pFrameWin, &aViewData, sal_False ),                  \
363             aTopButton( pFrameWin, &aViewData, sal_True ),                      \
364             aScrollBarBox( pFrameWin, WB_SIZEABLE ),                        \
365             pInputHintWindow( NULL ),                                       \
366             pPageBreakData( NULL ),                                         \
367             pHighlightRanges( NULL ),                                       \
368             pBrushDocument( NULL ),                                         \
369             pDrawBrushSet( NULL ),                                          \
370             bLockPaintBrush( sal_False ),                                       \
371             pTimerWindow( NULL ),                                           \
372             nTipVisible( 0 ),                                               \
373             bDragging( sal_False ),                                             \
374             bIsBlockMode( sal_False ),                                          \
375             bBlockNeg( sal_False ),                                             \
376             bBlockCols( sal_False ),                                            \
377             bBlockRows( sal_False ),                                            \
378             mfPendingTabBarWidth( -1.0 ),                                   \
379             bMinimized( sal_False ),                                            \
380             bInUpdateHeader( sal_False ),                                       \
381             bInActivatePart( sal_False ),                                       \
382             bInZoomUpdate( sal_False ),                                         \
383             bMoveIsShift( sal_False ),                                          \
384             bNewStartIfMarking( sal_False )
385 
386 
ScTabView(Window * pParent,ScDocShell & rDocSh,ScTabViewShell * pViewShell)387 ScTabView::ScTabView( Window* pParent, ScDocShell& rDocSh, ScTabViewShell* pViewShell ) :
388             pFrameWin( pParent ),
389             aViewData( &rDocSh, pViewShell ),
390             TABVIEW_INIT
391 {
392     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScTabView::ScTabView" );
393 
394     Init();
395 }
396 
397 //UNUSED2009-05 ScTabView::ScTabView( Window* pParent, const ScTabView& rScTabView, ScTabViewShell* pViewShell ) :
398 //UNUSED2009-05             pFrameWin( pParent ),
399 //UNUSED2009-05             aViewData( rScTabView.aViewData ),
400 //UNUSED2009-05             TABVIEW_INIT
401 //UNUSED2009-05 {
402 //UNUSED2009-05     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScTabView::ScTabView" );
403 //UNUSED2009-05
404 //UNUSED2009-05     aViewData.SetViewShell( pViewShell );
405 //UNUSED2009-05     Init();
406 //UNUSED2009-05
407 //UNUSED2009-05     UpdateShow();
408 //UNUSED2009-05     if ( aViewData.GetActivePart() != SC_SPLIT_BOTTOMLEFT )
409 //UNUSED2009-05         pGridWin[SC_SPLIT_BOTTOMLEFT]->Show();
410 //UNUSED2009-05
411 //UNUSED2009-05     InvalidateSplit();
412 //UNUSED2009-05 }
413 
414 void ScTabView::InitScrollBar( ScrollBar& rScrollBar, long nMaxVal )
415 {
416     rScrollBar.SetRange( Range( 0, nMaxVal ) );
417     rScrollBar.SetLineSize( 1 );
418     rScrollBar.SetPageSize( 1 );                // wird getrennt abgefragt
419     rScrollBar.SetVisibleSize( 10 );            // wird bei Resize neu gesetzt
420 
421     rScrollBar.SetScrollHdl( LINK(this, ScTabView, ScrollHdl) );
422     rScrollBar.SetEndScrollHdl( LINK(this, ScTabView, EndScrollHdl) );
423 }
424 
425 //  Scroll-Timer
426 
SetTimer(ScGridWindow * pWin,const MouseEvent & rMEvt)427 void ScTabView::SetTimer( ScGridWindow* pWin, const MouseEvent& rMEvt )
428 {
429     pTimerWindow = pWin;
430     aTimerMEvt   = rMEvt;
431     aScrollTimer.Start();
432 }
433 
ResetTimer()434 void ScTabView::ResetTimer()
435 {
436     aScrollTimer.Stop();
437     pTimerWindow = NULL;
438 }
439 
IMPL_LINK(ScTabView,TimerHdl,Timer *,EMPTYARG)440 IMPL_LINK( ScTabView, TimerHdl, Timer*, EMPTYARG )
441 {
442 //  aScrollTimer.Stop();
443     if (pTimerWindow)
444         pTimerWindow->MouseMove( aTimerMEvt );
445 
446     return 0;
447 }
448 
449 // --- Resize ---------------------------------------------------------------------
450 
lcl_SetPosSize(Window & rWindow,const Point & rPos,const Size & rSize,long nTotalWidth,sal_Bool bLayoutRTL)451 void lcl_SetPosSize( Window& rWindow, const Point& rPos, const Size& rSize,
452                         long nTotalWidth, sal_Bool bLayoutRTL )
453 {
454     Point aNewPos = rPos;
455     if ( bLayoutRTL )
456     {
457         aNewPos.X() = nTotalWidth - rPos.X() - rSize.Width();
458         if ( aNewPos == rWindow.GetPosPixel() && rSize.Width() != rWindow.GetSizePixel().Width() )
459         {
460             //  Document windows are manually painted right-to-left, so they need to
461             //  be repainted if the size changes.
462             rWindow.Invalidate();
463         }
464     }
465     rWindow.SetPosSizePixel( aNewPos, rSize );
466 }
467 
DoResize(const Point & rOffset,const Size & rSize,sal_Bool bInner)468 void ScTabView::DoResize( const Point& rOffset, const Size& rSize, sal_Bool bInner )
469 {
470     HideListBox();
471 
472     sal_Bool bHasHint = ( pInputHintWindow != NULL );
473     if (bHasHint)
474         RemoveHintWindow();
475 
476     sal_Bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() );
477     long nTotalWidth = rSize.Width();
478     if ( bLayoutRTL )
479         nTotalWidth += 2*rOffset.X();
480 
481     sal_Bool bVScroll    = aViewData.IsVScrollMode();
482     sal_Bool bHScroll    = aViewData.IsHScrollMode();
483     sal_Bool bTabControl = aViewData.IsTabMode();
484     sal_Bool bHeaders    = aViewData.IsHeaderMode();
485     sal_Bool bOutlMode   = aViewData.IsOutlineMode();
486     sal_Bool bHOutline   = bOutlMode && lcl_HasColOutline(aViewData);
487     sal_Bool bVOutline   = bOutlMode && lcl_HasRowOutline(aViewData);
488 
489     //  Scrollbar-Einstellungen koennen vom Sfx ueberschrieben werden:
490     SfxScrollingMode eMode = aViewData.GetViewShell()->GetScrollingMode();
491     if ( eMode == SCROLLING_NO )
492         bHScroll = bVScroll = sal_False;
493     else if ( eMode == SCROLLING_YES || eMode == SCROLLING_AUTO )   //! Auto ???
494         bHScroll = bVScroll = sal_True;
495 
496     if ( aViewData.GetDocShell()->IsPreview() )
497         bHScroll = bVScroll = bTabControl = bHeaders = bOutlMode = bHOutline = bVOutline = sal_False;
498 
499     long nBarX = 0;
500     long nBarY = 0;
501     long nOutlineX = 0;
502     long nOutlineY = 0;
503     long nOutPosX;
504     long nOutPosY;
505 
506     long nPosX = rOffset.X();
507     long nPosY = rOffset.Y();
508     long nSizeX = rSize.Width();
509     long nSizeY = rSize.Height();
510     long nSize1;
511 
512     bMinimized = ( nSizeX<=SC_ICONSIZE || nSizeY<=SC_ICONSIZE );
513     if ( bMinimized )
514         return;
515 
516     long nSplitSizeX = SPLIT_HANDLE_SIZE;
517     if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX )
518         nSplitSizeX = 1;
519     long nSplitSizeY = SPLIT_HANDLE_SIZE;
520     if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX )
521         nSplitSizeY = 1;
522 
523     const long nOverlap = 0;    // ScrollBar::GetWindowOverlapPixel();
524 
525     aBorderPos = rOffset;
526     aFrameSize = rSize;
527 
528     if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE )
529         if ( aViewData.GetHSplitPos() > nSizeX - SPLIT_MARGIN )
530         {
531             aViewData.SetHSplitMode( SC_SPLIT_NONE );
532             if ( WhichH( aViewData.GetActivePart() ) == SC_SPLIT_RIGHT )
533                 ActivatePart( SC_SPLIT_BOTTOMLEFT );
534             InvalidateSplit();
535 //          UpdateShow();
536         }
537     if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE )
538         if ( aViewData.GetVSplitPos() > nSizeY - SPLIT_MARGIN )
539         {
540             aViewData.SetVSplitMode( SC_SPLIT_NONE );
541             if ( WhichV( aViewData.GetActivePart() ) == SC_SPLIT_TOP )
542                 ActivatePart( SC_SPLIT_BOTTOMLEFT );
543             InvalidateSplit();
544 //          UpdateShow();
545         }
546 
547     UpdateShow();
548 
549     if (bHScroll || bVScroll)       // Scrollbars horizontal oder vertikal
550     {
551         long nScrollBarSize = pFrameWin->GetSettings().GetStyleSettings().GetScrollBarSize();
552         if (bVScroll)
553         {
554 //          nBarX = aVScrollBottom.GetSizePixel().Width();
555             nBarX = nScrollBarSize;
556             nSizeX -= nBarX - nOverlap;
557         }
558         if (bHScroll)
559         {
560 //          nBarY = aHScrollLeft.GetSizePixel().Height();
561             nBarY = nScrollBarSize;
562             nSizeY -= nBarY - nOverlap;
563         }
564 
565         //  window at the bottom right
566         lcl_SetPosSize( aScrollBarBox, Point( nPosX+nSizeX, nPosY+nSizeY ), Size( nBarX, nBarY ),
567                         nTotalWidth, bLayoutRTL );
568 
569         if (bHScroll)                               // Scrollbars horizontal
570         {
571             long nSizeLt = 0;       // left scroll bar
572             long nSizeRt = 0;       // right scroll bar
573             long nSizeSp = 0;       // splitter
574 
575             switch (aViewData.GetHSplitMode())
576             {
577                 case SC_SPLIT_NONE:
578                     nSizeSp = nSplitSizeX;
579                     nSizeLt = nSizeX - nSizeSp + nOverlap;          // Ecke ueberdecken
580                     break;
581                 case SC_SPLIT_NORMAL:
582                     nSizeSp = nSplitSizeX;
583                     nSizeLt = aViewData.GetHSplitPos();
584                     break;
585                 case SC_SPLIT_FIX:
586                     nSizeSp = 0;
587                     nSizeLt = 0;
588                     break;
589             }
590             nSizeRt = nSizeX - nSizeLt - nSizeSp;
591 
592             long nTabSize = 0;
593             if (bTabControl)
594             {
595                 // pending relative tab bar width from extended document options
596                 if( mfPendingTabBarWidth >= 0.0 )
597                 {
598                     SetRelTabBarWidth( mfPendingTabBarWidth );
599                     mfPendingTabBarWidth = -1.0;
600                 }
601 
602                 nTabSize = pTabControl->GetSizePixel().Width()-nOverlap;
603 
604                 if ( aViewData.GetHSplitMode() != SC_SPLIT_FIX )    // bei linkem Scrollbar
605                 {
606                     if (nTabSize > nSizeLt-SC_SCROLLBAR_MIN) nTabSize = nSizeLt-SC_SCROLLBAR_MIN;
607                     if (nTabSize < SC_TABBAR_MIN) nTabSize = SC_TABBAR_MIN;
608                     nSizeLt -= nTabSize;
609                 }
610                 else                                                // bei rechtem Scrollbar
611                 {
612                     if (nTabSize > nSizeRt-SC_SCROLLBAR_MIN) nTabSize = nSizeRt-SC_SCROLLBAR_MIN;
613                     if (nTabSize < SC_TABBAR_MIN) nTabSize = SC_TABBAR_MIN;
614                     nSizeRt -= nTabSize;
615                 }
616             }
617 
618             lcl_SetPosSize( *pTabControl, Point(nPosX-nOverlap, nPosY+nSizeY),
619                                                 Size(nTabSize+nOverlap, nBarY), nTotalWidth, bLayoutRTL );
620             pTabControl->SetSheetLayoutRTL( bLayoutRTL );
621 
622             lcl_SetPosSize( aHScrollLeft, Point(nPosX+nTabSize-nOverlap, nPosY+nSizeY),
623                                                 Size(nSizeLt+2*nOverlap, nBarY), nTotalWidth, bLayoutRTL );
624             lcl_SetPosSize( *pHSplitter, Point( nPosX+nTabSize+nSizeLt, nPosY+nSizeY ),
625                                             Size( nSizeSp, nBarY ), nTotalWidth, bLayoutRTL );
626             lcl_SetPosSize( aHScrollRight, Point(nPosX+nTabSize+nSizeLt+nSizeSp-nOverlap,
627                                                     nPosY+nSizeY),
628                                             Size(nSizeRt+2*nOverlap, nBarY), nTotalWidth, bLayoutRTL );
629 
630             //  SetDragRectPixel is done below
631         }
632 
633         if (bVScroll)                               // Scrollbars vertikal
634         {
635             long nSizeUp = 0;       // upper scroll bar
636             long nSizeSp = 0;       // splitter
637             long nSizeDn;           // unterer Scrollbar
638 
639             switch (aViewData.GetVSplitMode())
640             {
641                 case SC_SPLIT_NONE:
642                     nSizeUp = 0;
643                     nSizeSp = nSplitSizeY;
644                     break;
645                 case SC_SPLIT_NORMAL:
646                     nSizeUp = aViewData.GetVSplitPos();
647                     nSizeSp = nSplitSizeY;
648                     break;
649                 case SC_SPLIT_FIX:
650                     nSizeUp = 0;
651                     nSizeSp = 0;
652                     break;
653             }
654             nSizeDn = nSizeY - nSizeUp - nSizeSp;
655 
656             lcl_SetPosSize( aVScrollTop, Point(nPosX+nSizeX, nPosY-nOverlap),
657                                             Size(nBarX,nSizeUp+2*nOverlap), nTotalWidth, bLayoutRTL );
658             lcl_SetPosSize( *pVSplitter, Point( nPosX+nSizeX, nPosY+nSizeUp ),
659                                             Size( nBarX, nSizeSp ), nTotalWidth, bLayoutRTL );
660             lcl_SetPosSize( aVScrollBottom, Point(nPosX+nSizeX,
661                                                 nPosY+nSizeUp+nSizeSp-nOverlap),
662                                             Size(nBarX, nSizeDn+2*nOverlap), nTotalWidth, bLayoutRTL );
663 
664             //  SetDragRectPixel is done below
665         }
666     }
667 
668     //  SetDragRectPixel auch ohne Scrollbars etc., wenn schon gesplittet ist
669     if ( bHScroll || aViewData.GetHSplitMode() != SC_SPLIT_NONE )
670         pHSplitter->SetDragRectPixel(
671             Rectangle( nPosX, nPosY, nPosX+nSizeX, nPosY+nSizeY ), pFrameWin );
672     if ( bVScroll || aViewData.GetVSplitMode() != SC_SPLIT_NONE )
673         pVSplitter->SetDragRectPixel(
674             Rectangle( nPosX, nPosY, nPosX+nSizeX, nPosY+nSizeY ), pFrameWin );
675 
676     if (bTabControl && ! bHScroll )
677     {
678         nBarY = aHScrollLeft.GetSizePixel().Height();
679         nBarX = aVScrollBottom.GetSizePixel().Width();
680 
681         nSize1 = nSizeX + nOverlap;
682 
683         long nTabSize = nSize1;
684         if (nTabSize < 0) nTabSize = 0;
685 
686         lcl_SetPosSize( *pTabControl, Point(nPosX-nOverlap, nPosY+nSizeY-nBarY),
687                                         Size(nTabSize+nOverlap, nBarY), nTotalWidth, bLayoutRTL );
688         nSizeY -= nBarY - nOverlap;
689         lcl_SetPosSize( aScrollBarBox, Point( nPosX+nSizeX, nPosY+nSizeY ), Size( nBarX, nBarY ),
690                                         nTotalWidth, bLayoutRTL );
691 
692         if( bVScroll )
693         {
694             Size aVScrSize = aVScrollBottom.GetSizePixel();
695             aVScrSize.Height() -= nBarY;
696             aVScrollBottom.SetSizePixel( aVScrSize );
697         }
698     }
699 
700     nOutPosX = nPosX;
701     nOutPosY = nPosY;
702 
703     // Outline-Controls
704     if (bVOutline && pRowOutline[SC_SPLIT_BOTTOM])
705     {
706         nOutlineX = pRowOutline[SC_SPLIT_BOTTOM]->GetDepthSize();
707         nSizeX -= nOutlineX;
708         nPosX += nOutlineX;
709     }
710     if (bHOutline && pColOutline[SC_SPLIT_LEFT])
711     {
712         nOutlineY = pColOutline[SC_SPLIT_LEFT]->GetDepthSize();
713         nSizeY -= nOutlineY;
714         nPosY += nOutlineY;
715     }
716 
717     if (bHeaders)                               // Spalten/Zeilen-Header
718     {
719         nBarX = pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width();
720         nBarY = pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height();
721         nSizeX -= nBarX;
722         nSizeY -= nBarY;
723         nPosX += nBarX;
724         nPosY += nBarY;
725     }
726     else
727         nBarX = nBarY = 0;
728 
729         //
730         //      Splitter auswerten
731         //
732 
733     long nLeftSize   = nSizeX;
734     long nRightSize  = 0;
735     long nTopSize    = 0;
736     long nBottomSize = nSizeY;
737     long nSplitPosX  = nPosX;
738     long nSplitPosY  = nPosY;
739 
740     if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE )
741     {
742         long nSplitHeight = rSize.Height();
743         if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX )
744         {
745             //  Fixier-Splitter nicht mit Scrollbar/TabBar ueberlappen lassen
746             if ( bHScroll )
747                 nSplitHeight -= aHScrollLeft.GetSizePixel().Height();
748             else if ( bTabControl && pTabControl )
749                 nSplitHeight -= pTabControl->GetSizePixel().Height();
750         }
751         nSplitPosX = aViewData.GetHSplitPos();
752         lcl_SetPosSize( *pHSplitter,
753             Point( nSplitPosX, nOutPosY ), Size( nSplitSizeX, nSplitHeight ), nTotalWidth, bLayoutRTL );
754         nLeftSize = nSplitPosX - nPosX;
755         nSplitPosX += nSplitSizeX;
756         nRightSize = nSizeX - nLeftSize - nSplitSizeX;
757     }
758     if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE )
759     {
760         long nSplitWidth = rSize.Width();
761         if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX && bVScroll )
762             nSplitWidth -= aVScrollBottom.GetSizePixel().Width();
763         nSplitPosY = aViewData.GetVSplitPos();
764         lcl_SetPosSize( *pVSplitter,
765             Point( nOutPosX, nSplitPosY ), Size( nSplitWidth, nSplitSizeY ), nTotalWidth, bLayoutRTL );
766         nTopSize = nSplitPosY - nPosY;
767         nSplitPosY += nSplitSizeY;
768         nBottomSize = nSizeY - nTopSize - nSplitSizeY;
769     }
770 
771     //  ShowHide fuer pColOutline / pRowOutline passiert in UpdateShow
772 
773     if (bHOutline)                              // Outline-Controls
774     {
775         if (pColOutline[SC_SPLIT_LEFT])
776         {
777             pColOutline[SC_SPLIT_LEFT]->SetHeaderSize( nBarX );
778             lcl_SetPosSize( *pColOutline[SC_SPLIT_LEFT],
779                     Point(nPosX-nBarX,nOutPosY), Size(nLeftSize+nBarX,nOutlineY), nTotalWidth, bLayoutRTL );
780         }
781         if (pColOutline[SC_SPLIT_RIGHT])
782         {
783             pColOutline[SC_SPLIT_RIGHT]->SetHeaderSize( 0 );    // always call to update RTL flag
784             lcl_SetPosSize( *pColOutline[SC_SPLIT_RIGHT],
785                     Point(nSplitPosX,nOutPosY), Size(nRightSize,nOutlineY), nTotalWidth, bLayoutRTL );
786         }
787     }
788     if (bVOutline)
789     {
790         if (nTopSize)
791         {
792             if (pRowOutline[SC_SPLIT_TOP] && pRowOutline[SC_SPLIT_BOTTOM])
793             {
794                 pRowOutline[SC_SPLIT_TOP]->SetHeaderSize( nBarY );
795                 lcl_SetPosSize( *pRowOutline[SC_SPLIT_TOP],
796                         Point(nOutPosX,nPosY-nBarY), Size(nOutlineX,nTopSize+nBarY), nTotalWidth, bLayoutRTL );
797                 pRowOutline[SC_SPLIT_BOTTOM]->SetHeaderSize( 0 );
798                 lcl_SetPosSize( *pRowOutline[SC_SPLIT_BOTTOM],
799                         Point(nOutPosX,nSplitPosY), Size(nOutlineX,nBottomSize), nTotalWidth, bLayoutRTL );
800             }
801         }
802         else if (pRowOutline[SC_SPLIT_BOTTOM])
803         {
804             pRowOutline[SC_SPLIT_BOTTOM]->SetHeaderSize( nBarY );
805             lcl_SetPosSize( *pRowOutline[SC_SPLIT_BOTTOM],
806                     Point(nOutPosX,nSplitPosY-nBarY), Size(nOutlineX,nBottomSize+nBarY), nTotalWidth, bLayoutRTL );
807         }
808     }
809     if (bHOutline && bVOutline)
810     {
811         lcl_SetPosSize( aTopButton, Point(nOutPosX,nOutPosY), Size(nOutlineX,nOutlineY), nTotalWidth, bLayoutRTL );
812         aTopButton.Show();
813     }
814     else
815         aTopButton.Hide();
816 
817     if (bHeaders)                               // Spalten/Zeilen-Header
818     {
819         lcl_SetPosSize( *pColBar[SC_SPLIT_LEFT],
820             Point(nPosX,nPosY-nBarY), Size(nLeftSize,nBarY), nTotalWidth, bLayoutRTL );
821         if (pColBar[SC_SPLIT_RIGHT])
822             lcl_SetPosSize( *pColBar[SC_SPLIT_RIGHT],
823                 Point(nSplitPosX,nPosY-nBarY), Size(nRightSize,nBarY), nTotalWidth, bLayoutRTL );
824 
825         if (pRowBar[SC_SPLIT_TOP])
826             lcl_SetPosSize( *pRowBar[SC_SPLIT_TOP],
827                 Point(nPosX-nBarX,nPosY), Size(nBarX,nTopSize), nTotalWidth, bLayoutRTL );
828         lcl_SetPosSize( *pRowBar[SC_SPLIT_BOTTOM],
829             Point(nPosX-nBarX,nSplitPosY), Size(nBarX,nBottomSize), nTotalWidth, bLayoutRTL );
830 
831         lcl_SetPosSize( aCornerButton, Point(nPosX-nBarX,nPosY-nBarY), Size(nBarX,nBarY), nTotalWidth, bLayoutRTL );
832         aCornerButton.Show();
833         pColBar[SC_SPLIT_LEFT]->Show();
834         pRowBar[SC_SPLIT_BOTTOM]->Show();
835     }
836     else
837     {
838         aCornerButton.Hide();
839         pColBar[SC_SPLIT_LEFT]->Hide();         // immer da
840         pRowBar[SC_SPLIT_BOTTOM]->Hide();
841     }
842 
843 
844                                             // Grid-Windows
845 
846     if (bInner)
847     {
848         long nInnerPosX = bLayoutRTL ? ( nTotalWidth - nPosX - nLeftSize ) : nPosX;
849         pGridWin[SC_SPLIT_BOTTOMLEFT]->SetPosPixel( Point(nInnerPosX,nSplitPosY) );
850     }
851     else
852     {
853         lcl_SetPosSize( *pGridWin[SC_SPLIT_BOTTOMLEFT],
854             Point(nPosX,nSplitPosY), Size(nLeftSize,nBottomSize), nTotalWidth, bLayoutRTL );
855         if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE )
856             lcl_SetPosSize( *pGridWin[SC_SPLIT_BOTTOMRIGHT],
857                 Point(nSplitPosX,nSplitPosY), Size(nRightSize,nBottomSize), nTotalWidth, bLayoutRTL );
858         if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE )
859             lcl_SetPosSize( *pGridWin[SC_SPLIT_TOPLEFT],
860                 Point(nPosX,nPosY), Size(nLeftSize,nTopSize), nTotalWidth, bLayoutRTL );
861         if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE && aViewData.GetVSplitMode() != SC_SPLIT_NONE )
862             lcl_SetPosSize( *pGridWin[SC_SPLIT_TOPRIGHT],
863                 Point(nSplitPosX,nPosY), Size(nRightSize,nTopSize), nTotalWidth, bLayoutRTL );
864     }
865 
866                 //
867                 //  Scrollbars updaten
868                 //
869 
870     if (!bInUpdateHeader)
871     {
872         UpdateScrollBars();     // Scrollbars nicht beim Scrollen neu setzen
873         UpdateHeaderWidth();
874 
875         InterpretVisible();     // #69343# have everything calculated before painting
876     }
877 
878     if (bHasHint)
879         TestHintWindow();       // neu positionieren
880 
881     UpdateVarZoom();    //  update variable zoom types (after resizing GridWindows)
882 
883     if (aViewData.GetViewShell()->HasAccessibilityObjects())
884         aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_WINDOWRESIZED));
885 }
886 
UpdateVarZoom()887 void ScTabView::UpdateVarZoom()
888 {
889     //  update variable zoom types
890 
891     SvxZoomType eZoomType = GetZoomType();
892     if ( eZoomType != SVX_ZOOM_PERCENT && !bInZoomUpdate )
893     {
894         bInZoomUpdate = sal_True;
895         const Fraction& rOldX = GetViewData()->GetZoomX();
896         const Fraction& rOldY = GetViewData()->GetZoomY();
897         long nOldPercent = ( rOldY.GetNumerator() * 100 ) / rOldY.GetDenominator();
898         sal_uInt16 nNewZoom = CalcZoom( eZoomType, (sal_uInt16)nOldPercent );
899         Fraction aNew( nNewZoom, 100 );
900 
901         if ( aNew != rOldX || aNew != rOldY )
902         {
903             SetZoom( aNew, aNew, sal_False );   // always separately per sheet
904             PaintGrid();
905             PaintTop();
906             PaintLeft();
907             aViewData.GetViewShell()->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
908             aViewData.GetViewShell()->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
909         }
910         bInZoomUpdate = sal_False;
911     }
912 }
913 
UpdateFixPos()914 void ScTabView::UpdateFixPos()
915 {
916     sal_Bool bResize = sal_False;
917     if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX )
918         if (aViewData.UpdateFixX())
919             bResize = sal_True;
920     if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX )
921         if (aViewData.UpdateFixY())
922             bResize = sal_True;
923     if (bResize)
924         RepeatResize(sal_False);
925 }
926 
RepeatResize(sal_Bool bUpdateFix)927 void ScTabView::RepeatResize( sal_Bool bUpdateFix )
928 {
929     if ( bUpdateFix )
930     {
931         ScSplitMode eHSplit = aViewData.GetHSplitMode();
932         ScSplitMode eVSplit = aViewData.GetVSplitMode();
933 
934         // #i46796# UpdateFixX / UpdateFixY uses GetGridOffset, which requires the
935         // outline windows to be available. So UpdateShow has to be called before
936         // (also called from DoResize).
937         if ( eHSplit == SC_SPLIT_FIX || eVSplit == SC_SPLIT_FIX )
938             UpdateShow();
939 
940         if ( eHSplit == SC_SPLIT_FIX )
941             aViewData.UpdateFixX();
942         if ( eVSplit == SC_SPLIT_FIX )
943             aViewData.UpdateFixY();
944     }
945 
946     DoResize( aBorderPos, aFrameSize );
947 
948     //! Border muss neu gesetzt werden ???
949 }
950 
GetBorderSize(SvBorder & rBorder,const Size &)951 void ScTabView::GetBorderSize( SvBorder& rBorder, const Size& /* rSize */ )
952 {
953     sal_Bool bScrollBars = aViewData.IsVScrollMode();
954     sal_Bool bHeaders    = aViewData.IsHeaderMode();
955     sal_Bool bOutlMode   = aViewData.IsOutlineMode();
956     sal_Bool bHOutline   = bOutlMode && lcl_HasColOutline(aViewData);
957     sal_Bool bVOutline   = bOutlMode && lcl_HasRowOutline(aViewData);
958     sal_Bool bLayoutRTL  = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() );
959 
960     rBorder = SvBorder();
961 
962     if (bScrollBars)                            // Scrollbars horizontal oder vertikal
963     {
964         rBorder.Right()  += aVScrollBottom.GetSizePixel().Width();
965         rBorder.Bottom() += aHScrollLeft.GetSizePixel().Height();
966     }
967 
968     // Outline-Controls
969     if (bVOutline && pRowOutline[SC_SPLIT_BOTTOM])
970         rBorder.Left() += pRowOutline[SC_SPLIT_BOTTOM]->GetDepthSize();
971     if (bHOutline && pColOutline[SC_SPLIT_LEFT])
972         rBorder.Top()  += pColOutline[SC_SPLIT_LEFT]->GetDepthSize();
973 
974     if (bHeaders)                               // Spalten/Zeilen-Header
975     {
976         rBorder.Left() += pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width();
977         rBorder.Top()  += pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height();
978     }
979 
980     if ( bLayoutRTL )
981         ::std::swap( rBorder.Left(), rBorder.Right() );
982 }
983 
IMPL_LINK(ScTabView,TabBarResize,void *,EMPTYARG)984 IMPL_LINK( ScTabView, TabBarResize, void*, EMPTYARG )
985 {
986     sal_Bool bHScrollMode = aViewData.IsHScrollMode();
987 
988     //  Scrollbar-Einstellungen koennen vom Sfx ueberschrieben werden:
989     SfxScrollingMode eMode = aViewData.GetViewShell()->GetScrollingMode();
990     if ( eMode == SCROLLING_NO )
991         bHScrollMode = sal_False;
992     else if ( eMode == SCROLLING_YES || eMode == SCROLLING_AUTO )   //! Auto ???
993         bHScrollMode = sal_True;
994 
995     if( bHScrollMode )
996     {
997         const long nOverlap = 0;    // ScrollBar::GetWindowOverlapPixel();
998         long nSize = pTabControl->GetSplitSize();
999 
1000         if (aViewData.GetHSplitMode() != SC_SPLIT_FIX)
1001         {
1002             long nMax = pHSplitter->GetPosPixel().X();
1003             if( pTabControl->IsEffectiveRTL() )
1004                 nMax = pFrameWin->GetSizePixel().Width() - nMax;
1005             --nMax;
1006             if (nSize>nMax) nSize = nMax;
1007         }
1008 
1009         if ( nSize != pTabControl->GetSizePixel().Width() )
1010         {
1011             pTabControl->SetSizePixel( Size( nSize+nOverlap,
1012                                         pTabControl->GetSizePixel().Height() ) );
1013             RepeatResize();
1014         }
1015     }
1016 
1017     return 0;
1018 }
1019 
SetTabBarWidth(long nNewWidth)1020 void ScTabView::SetTabBarWidth( long nNewWidth )
1021 {
1022     Size aSize = pTabControl->GetSizePixel();
1023 
1024     if ( aSize.Width() != nNewWidth )
1025     {
1026         aSize.Width() = nNewWidth;
1027         pTabControl->SetSizePixel( aSize );
1028     }
1029 }
1030 
SetRelTabBarWidth(double fRelTabBarWidth)1031 void ScTabView::SetRelTabBarWidth( double fRelTabBarWidth )
1032 {
1033     if( (0.0 <= fRelTabBarWidth) && (fRelTabBarWidth <= 1.0) )
1034         if( long nFrameWidth = pFrameWin->GetSizePixel().Width() )
1035             SetTabBarWidth( static_cast< long >( fRelTabBarWidth * nFrameWidth + 0.5 ) );
1036 }
1037 
SetPendingRelTabBarWidth(double fRelTabBarWidth)1038 void ScTabView::SetPendingRelTabBarWidth( double fRelTabBarWidth )
1039 {
1040     mfPendingTabBarWidth = fRelTabBarWidth;
1041     SetRelTabBarWidth( fRelTabBarWidth );
1042 }
1043 
GetTabBarWidth() const1044 long ScTabView::GetTabBarWidth() const
1045 {
1046     return pTabControl->GetSizePixel().Width();
1047 }
1048 
GetRelTabBarWidth() const1049 double ScTabView::GetRelTabBarWidth() const
1050 {
1051     if( long nFrameWidth = pFrameWin->GetSizePixel().Width() )
1052         return static_cast< double >( GetTabBarWidth() ) / nFrameWidth;
1053     return 0.0;
1054 }
1055 
GetPendingRelTabBarWidth() const1056 double ScTabView::GetPendingRelTabBarWidth() const
1057 {
1058     return mfPendingTabBarWidth;
1059 }
1060 
GetActiveWin()1061 Window* ScTabView::GetActiveWin()
1062 {
1063     ScSplitPos ePos = aViewData.GetActivePart();
1064     DBG_ASSERT(pGridWin[ePos],"kein aktives Fenster");
1065     return pGridWin[ePos];
1066 }
1067 
GetWindowByPos(ScSplitPos ePos)1068 Window* ScTabView::GetWindowByPos( ScSplitPos ePos )
1069 {
1070     return pGridWin[ePos];
1071 }
1072 
SetActivePointer(const Pointer & rPointer)1073 void ScTabView::SetActivePointer( const Pointer& rPointer )
1074 {
1075     for (sal_uInt16 i=0; i<4; i++)
1076         if (pGridWin[i])
1077             pGridWin[i]->SetPointer( rPointer );
1078 
1079 /*  ScSplitPos ePos = aViewData.GetActivePart();
1080     if (pGridWin[ePos])
1081         pGridWin[ePos]->SetPointer( rPointer );
1082 */
1083 }
1084 
1085 //UNUSED2008-05  void ScTabView::SetActivePointer( const ResId& )
1086 //UNUSED2008-05  {
1087 //UNUSED2008-05      DBG_ERRORFILE( "keine Pointer mit ResId!" );
1088 //UNUSED2008-05  }
1089 
ActiveGrabFocus()1090 void ScTabView::ActiveGrabFocus()
1091 {
1092     ScSplitPos ePos = aViewData.GetActivePart();
1093     if (pGridWin[ePos])
1094         pGridWin[ePos]->GrabFocus();
1095 }
1096 
1097 //UNUSED2008-05  void ScTabView::ActiveCaptureMouse()
1098 //UNUSED2008-05  {
1099 //UNUSED2008-05      ScSplitPos ePos = aViewData.GetActivePart();
1100 //UNUSED2008-05      if (pGridWin[ePos])
1101 //UNUSED2008-05          pGridWin[ePos]->CaptureMouse();
1102 //UNUSED2008-05  }
1103 //UNUSED2008-05
1104 //UNUSED2008-05  void ScTabView::ActiveReleaseMouse()
1105 //UNUSED2008-05  {
1106 //UNUSED2008-05      ScSplitPos ePos = aViewData.GetActivePart();
1107 //UNUSED2008-05      if (pGridWin[ePos])
1108 //UNUSED2008-05          pGridWin[ePos]->ReleaseMouse();
1109 //UNUSED2008-05  }
1110 //UNUSED2008-05
1111 //UNUSED2008-05  Point ScTabView::ActivePixelToLogic( const Point& rDevicePoint )
1112 //UNUSED2008-05  {
1113 //UNUSED2008-05      ScSplitPos ePos = aViewData.GetActivePart();
1114 //UNUSED2008-05      if (pGridWin[ePos])
1115 //UNUSED2008-05          return pGridWin[ePos]->PixelToLogic(rDevicePoint);
1116 //UNUSED2008-05      else
1117 //UNUSED2008-05          return Point();
1118 //UNUSED2008-05  }
1119 
FindWindow(Window * pWindow) const1120 ScSplitPos ScTabView::FindWindow( Window* pWindow ) const
1121 {
1122     ScSplitPos eVal = SC_SPLIT_BOTTOMLEFT;      // Default
1123     for (sal_uInt16 i=0; i<4; i++)
1124         if ( pGridWin[i] == pWindow )
1125             eVal = (ScSplitPos) i;
1126 
1127     return eVal;
1128 }
1129 
GetGridOffset() const1130 Point ScTabView::GetGridOffset() const
1131 {
1132     Point aPos;
1133 
1134         // Groessen hier wie in DoResize
1135 
1136     sal_Bool bHeaders    = aViewData.IsHeaderMode();
1137     sal_Bool bOutlMode   = aViewData.IsOutlineMode();
1138     sal_Bool bHOutline   = bOutlMode && lcl_HasColOutline(aViewData);
1139     sal_Bool bVOutline   = bOutlMode && lcl_HasRowOutline(aViewData);
1140 
1141     // Outline-Controls
1142     if (bVOutline && pRowOutline[SC_SPLIT_BOTTOM])
1143         aPos.X() += pRowOutline[SC_SPLIT_BOTTOM]->GetDepthSize();
1144     if (bHOutline && pColOutline[SC_SPLIT_LEFT])
1145         aPos.Y() += pColOutline[SC_SPLIT_LEFT]->GetDepthSize();
1146 
1147     if (bHeaders)                               // Spalten/Zeilen-Header
1148     {
1149         if (pRowBar[SC_SPLIT_BOTTOM])
1150             aPos.X() += pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width();
1151         if (pColBar[SC_SPLIT_LEFT])
1152             aPos.Y() += pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height();
1153     }
1154 
1155     return aPos;
1156 }
1157 
1158 // ---  Scroll-Bars  --------------------------------------------------------
1159 
ScrollCommand(const CommandEvent & rCEvt,ScSplitPos ePos)1160 sal_Bool ScTabView::ScrollCommand( const CommandEvent& rCEvt, ScSplitPos ePos )
1161 {
1162     HideNoteMarker();
1163 
1164     sal_Bool bDone = sal_False;
1165     const CommandWheelData* pData = rCEvt.GetWheelData();
1166     if ( pData && pData->GetMode() == COMMAND_WHEEL_ZOOM )
1167     {
1168         if ( !aViewData.GetViewShell()->GetViewFrame()->GetFrame().IsInPlace() )
1169         {
1170             //  for ole inplace editing, the scale is defined by the visarea and client size
1171             //  and can't be changed directly
1172 
1173             const Fraction& rOldY = aViewData.GetZoomY();
1174             long nOld = (long)(( rOldY.GetNumerator() * 100 ) / rOldY.GetDenominator());
1175             long nNew = nOld;
1176             if ( pData->GetDelta() < 0 )
1177                 nNew = Max( (long) MINZOOM, (long)( nOld - SC_DELTA_ZOOM ) );
1178             else
1179                 nNew = Min( (long) MAXZOOM, (long)( nOld + SC_DELTA_ZOOM ) );
1180 
1181             if ( nNew != nOld )
1182             {
1183                 // scroll wheel doesn't set the AppOptions default
1184 
1185                 sal_Bool bSyncZoom = SC_MOD()->GetAppOptions().GetSynchronizeZoom();
1186                 SetZoomType( SVX_ZOOM_PERCENT, bSyncZoom );
1187                 Fraction aFract( nNew, 100 );
1188                 SetZoom( aFract, aFract, bSyncZoom );
1189                 PaintGrid();
1190                 PaintTop();
1191                 PaintLeft();
1192                 aViewData.GetBindings().Invalidate( SID_ATTR_ZOOM );
1193                 aViewData.GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
1194             }
1195 
1196             bDone = sal_True;
1197         }
1198     }
1199     else
1200     {
1201         ScHSplitPos eHPos = WhichH(ePos);
1202         ScVSplitPos eVPos = WhichV(ePos);
1203         ScrollBar* pHScroll = ( eHPos == SC_SPLIT_LEFT ) ? &aHScrollLeft : &aHScrollRight;
1204         ScrollBar* pVScroll = ( eVPos == SC_SPLIT_TOP )  ? &aVScrollTop  : &aVScrollBottom;
1205         if ( pGridWin[ePos] )
1206             bDone = pGridWin[ePos]->HandleScrollCommand( rCEvt, pHScroll, pVScroll );
1207     }
1208     return bDone;
1209 }
1210 
IMPL_LINK(ScTabView,EndScrollHdl,ScrollBar *,pScroll)1211 IMPL_LINK( ScTabView, EndScrollHdl, ScrollBar*, pScroll )
1212 {
1213     sal_Bool bOnlineScroll = sal_True;      //! Optionen
1214 
1215     if ( bDragging )
1216     {
1217         if ( bOnlineScroll )                // nur Ranges aktualisieren
1218             UpdateScrollBars();
1219         else
1220         {
1221             long nScrollMin = 0;        // RangeMin simulieren
1222             if ( aViewData.GetHSplitMode()==SC_SPLIT_FIX && pScroll == &aHScrollRight )
1223                 nScrollMin = aViewData.GetFixPosX();
1224             if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == &aVScrollBottom )
1225                 nScrollMin = aViewData.GetFixPosY();
1226 
1227             if ( pScroll == &aHScrollLeft || pScroll == &aHScrollRight )
1228             {
1229                 sal_Bool bMirror = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ) != Application::GetSettings().GetLayoutRTL();
1230                 ScHSplitPos eWhich = (pScroll == &aHScrollLeft) ? SC_SPLIT_LEFT : SC_SPLIT_RIGHT;
1231                 long nDelta = GetScrollBarPos( *pScroll, bMirror ) + nScrollMin - aViewData.GetPosX(eWhich);
1232                 if (nDelta) ScrollX( nDelta, eWhich );
1233             }
1234             else                            // VScroll...
1235             {
1236                 ScVSplitPos eWhich = (pScroll == &aVScrollTop) ? SC_SPLIT_TOP : SC_SPLIT_BOTTOM;
1237                 long nDelta = GetScrollBarPos( *pScroll, sal_False ) + nScrollMin - aViewData.GetPosY(eWhich);
1238                 if (nDelta) ScrollY( nDelta, eWhich );
1239             }
1240         }
1241         bDragging = sal_False;
1242     }
1243     return 0;
1244 }
1245 
IMPL_LINK(ScTabView,ScrollHdl,ScrollBar *,pScroll)1246 IMPL_LINK( ScTabView, ScrollHdl, ScrollBar*, pScroll )
1247 {
1248     sal_Bool bOnlineScroll = sal_True;      //! Optionen
1249 
1250     sal_Bool bHoriz = ( pScroll == &aHScrollLeft || pScroll == &aHScrollRight );
1251     long nViewPos;
1252     if ( bHoriz )
1253         nViewPos = aViewData.GetPosX( (pScroll == &aHScrollLeft) ?
1254                                         SC_SPLIT_LEFT : SC_SPLIT_RIGHT );
1255     else
1256         nViewPos = aViewData.GetPosY( (pScroll == &aVScrollTop) ?
1257                                         SC_SPLIT_TOP : SC_SPLIT_BOTTOM );
1258 
1259     sal_Bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() );
1260     sal_Bool bMirror = bHoriz && (bLayoutRTL != Application::GetSettings().GetLayoutRTL());
1261 
1262     ScrollType eType = pScroll->GetType();
1263     if ( eType == SCROLL_DRAG )
1264     {
1265         if (!bDragging)
1266         {
1267             bDragging = sal_True;
1268             nPrevDragPos = nViewPos;
1269         }
1270 
1271         //  Scroll-Position anzeigen
1272         //  (nur QuickHelp, in der Statuszeile gibt es keinen Eintrag dafuer)
1273 
1274         if (Help::IsQuickHelpEnabled())
1275         {
1276             Size aSize = pScroll->GetSizePixel();
1277 
1278             /*  Convert scrollbar mouse position to screen position. If RTL
1279                 mode of scrollbar differs from RTL mode of its parent, then the
1280                 direct call to Window::OutputToNormalizedScreenPixel() will
1281                 give unusable results, because calcualtion of screen position
1282                 is based on parent orientation and expects equal orientation of
1283                 the child position. Need to mirror mouse position before. */
1284             Point aMousePos = pScroll->GetPointerPosPixel();
1285             if( pScroll->IsRTLEnabled() != pScroll->GetParent()->IsRTLEnabled() )
1286                 aMousePos.X() = aSize.Width() - aMousePos.X() - 1;
1287             aMousePos = pScroll->OutputToNormalizedScreenPixel( aMousePos );
1288 
1289             // convert top-left position of scrollbar to screen position
1290             Point aPos = pScroll->OutputToNormalizedScreenPixel( Point() );
1291 
1292             // get scrollbar scroll position for help text (row number/column name)
1293             long nScrollMin = 0;        // RangeMin simulieren
1294             if ( aViewData.GetHSplitMode()==SC_SPLIT_FIX && pScroll == &aHScrollRight )
1295                 nScrollMin = aViewData.GetFixPosX();
1296             if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == &aVScrollBottom )
1297                 nScrollMin = aViewData.GetFixPosY();
1298             long nScrollPos = GetScrollBarPos( *pScroll, bMirror ) + nScrollMin;
1299 
1300             String aHelpStr;
1301             Rectangle aRect;
1302             sal_uInt16 nAlign;
1303             if (bHoriz)
1304             {
1305                 aHelpStr = ScGlobal::GetRscString(STR_COLUMN);
1306                 aHelpStr += ' ';
1307                 aHelpStr += ScColToAlpha((SCCOL) nScrollPos);
1308 
1309                 aRect.Left() = aMousePos.X();
1310                 aRect.Top()  = aPos.Y() - 4;
1311                 nAlign       = QUICKHELP_BOTTOM|QUICKHELP_CENTER;
1312             }
1313             else
1314             {
1315                 aHelpStr = ScGlobal::GetRscString(STR_ROW);
1316                 aHelpStr += ' ';
1317                 aHelpStr += String::CreateFromInt32(nScrollPos + 1);
1318 
1319                 // show quicktext always inside sheet area
1320                 aRect.Left() = bLayoutRTL ? (aPos.X() + aSize.Width() + 8) : (aPos.X() - 8);
1321                 aRect.Top()  = aMousePos.Y();
1322                 nAlign       = (bLayoutRTL ? QUICKHELP_LEFT : QUICKHELP_RIGHT) | QUICKHELP_VCENTER;
1323             }
1324             aRect.Right()   = aRect.Left();
1325             aRect.Bottom()  = aRect.Top();
1326 
1327             Help::ShowQuickHelp(pScroll->GetParent(), aRect, aHelpStr, nAlign);
1328         }
1329     }
1330 
1331     if ( bOnlineScroll || eType != SCROLL_DRAG )
1332     {
1333         if ( bMirror )
1334         {
1335             // change scroll type so visible/previous cells calculation below remains the same
1336             switch ( eType )
1337             {
1338                 case SCROLL_LINEUP:     eType = SCROLL_LINEDOWN;    break;
1339                 case SCROLL_LINEDOWN:   eType = SCROLL_LINEUP;      break;
1340                 case SCROLL_PAGEUP:     eType = SCROLL_PAGEDOWN;    break;
1341                 case SCROLL_PAGEDOWN:   eType = SCROLL_PAGEUP;      break;
1342                 default:
1343                 {
1344                     // added to avoid warnings
1345                 }
1346             }
1347         }
1348         long nDelta = pScroll->GetDelta();
1349         switch ( eType )
1350         {
1351             case SCROLL_LINEUP:
1352                 nDelta = -1;
1353                 break;
1354             case SCROLL_LINEDOWN:
1355                 nDelta = 1;
1356                 break;
1357             case SCROLL_PAGEUP:
1358                 if ( pScroll == &aHScrollLeft ) nDelta = -(long) aViewData.PrevCellsX( SC_SPLIT_LEFT );
1359                 if ( pScroll == &aHScrollRight ) nDelta = -(long) aViewData.PrevCellsX( SC_SPLIT_RIGHT );
1360                 if ( pScroll == &aVScrollTop ) nDelta = -(long) aViewData.PrevCellsY( SC_SPLIT_TOP );
1361                 if ( pScroll == &aVScrollBottom ) nDelta = -(long) aViewData.PrevCellsY( SC_SPLIT_BOTTOM );
1362                 if (nDelta==0) nDelta=-1;
1363                 break;
1364             case SCROLL_PAGEDOWN:
1365                 if ( pScroll == &aHScrollLeft ) nDelta = aViewData.VisibleCellsX( SC_SPLIT_LEFT );
1366                 if ( pScroll == &aHScrollRight ) nDelta = aViewData.VisibleCellsX( SC_SPLIT_RIGHT );
1367                 if ( pScroll == &aVScrollTop ) nDelta = aViewData.VisibleCellsY( SC_SPLIT_TOP );
1368                 if ( pScroll == &aVScrollBottom ) nDelta = aViewData.VisibleCellsY( SC_SPLIT_BOTTOM );
1369                 if (nDelta==0) nDelta=1;
1370                 break;
1371             case SCROLL_DRAG:
1372                 {
1373                     //  nur in die richtige Richtung scrollen, nicht um ausgeblendete
1374                     //  Bereiche herumzittern
1375 
1376                     long nScrollMin = 0;        // RangeMin simulieren
1377                     if ( aViewData.GetHSplitMode()==SC_SPLIT_FIX && pScroll == &aHScrollRight )
1378                         nScrollMin = aViewData.GetFixPosX();
1379                     if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == &aVScrollBottom )
1380                         nScrollMin = aViewData.GetFixPosY();
1381 
1382                     long nScrollPos = GetScrollBarPos( *pScroll, bMirror ) + nScrollMin;
1383                     nDelta = nScrollPos - nViewPos;
1384                     if ( nScrollPos > nPrevDragPos )
1385                     {
1386                         if (nDelta<0) nDelta=0;
1387                     }
1388                     else if ( nScrollPos < nPrevDragPos )
1389                     {
1390                         if (nDelta>0) nDelta=0;
1391                     }
1392                     else
1393                         nDelta = 0;
1394                     nPrevDragPos = nScrollPos;
1395                 }
1396                 break;
1397             default:
1398             {
1399                 // added to avoid warnings
1400             }
1401         }
1402 
1403         if (nDelta)
1404         {
1405             sal_Bool bUpdate = ( eType != SCROLL_DRAG );    // bei Drag die Ranges nicht aendern
1406             if ( bHoriz )
1407                 ScrollX( nDelta, (pScroll == &aHScrollLeft) ? SC_SPLIT_LEFT : SC_SPLIT_RIGHT, bUpdate );
1408             else
1409                 ScrollY( nDelta, (pScroll == &aVScrollTop) ? SC_SPLIT_TOP : SC_SPLIT_BOTTOM, bUpdate );
1410         }
1411     }
1412 
1413     return 0;
1414 }
1415 
ScrollX(long nDeltaX,ScHSplitPos eWhich,sal_Bool bUpdBars)1416 void ScTabView::ScrollX( long nDeltaX, ScHSplitPos eWhich, sal_Bool bUpdBars )
1417 {
1418     sal_Bool bHasHint = ( pInputHintWindow != NULL );
1419     if (bHasHint)
1420         RemoveHintWindow();
1421 
1422     SCCOL nOldX = aViewData.GetPosX(eWhich);
1423     SCsCOL nNewX = static_cast<SCsCOL>(nOldX) + static_cast<SCsCOL>(nDeltaX);
1424     if ( nNewX < 0 )
1425     {
1426         nDeltaX -= nNewX;
1427         nNewX = 0;
1428     }
1429     if ( nNewX > MAXCOL )
1430     {
1431         nDeltaX -= nNewX - MAXCOL;
1432         nNewX = MAXCOL;
1433     }
1434 
1435     SCsCOL nDir = ( nDeltaX > 0 ) ? 1 : -1;
1436     ScDocument* pDoc = aViewData.GetDocument();
1437     SCTAB nTab = aViewData.GetTabNo();
1438     while ( pDoc->ColHidden(nNewX, nTab) &&
1439             nNewX+nDir >= 0 && nNewX+nDir <= MAXCOL )
1440         nNewX = sal::static_int_cast<SCsCOL>( nNewX + nDir );
1441 
1442     //  Fixierung
1443 
1444     if (aViewData.GetHSplitMode() == SC_SPLIT_FIX)
1445     {
1446         if (eWhich == SC_SPLIT_LEFT)
1447             nNewX = static_cast<SCsCOL>(nOldX);                             // links immer stehenlassen
1448         else
1449         {
1450             SCsCOL nFixX = static_cast<SCsCOL>(aViewData.GetFixPosX());
1451             if (nNewX < nFixX)
1452                 nNewX = nFixX;
1453         }
1454     }
1455     if (nNewX == static_cast<SCsCOL>(nOldX))
1456         return;
1457 
1458     HideAllCursors();
1459 
1460     if ( nNewX >= 0 && nNewX <= MAXCOL && nDeltaX )
1461     {
1462         SCCOL nTrackX = std::max( nOldX, static_cast<SCCOL>(nNewX) );
1463 
1464             //  Mit VCL wirkt Update() im Moment immer auf alle Fenster, beim Update
1465             //  nach dem Scrollen des GridWindow's wuerde darum der Col-/RowBar evtl.
1466             //  mit schon geaenderter Pos. gepainted werden -
1467             //  darum vorher einmal Update am Col-/RowBar
1468 
1469         if (pColBar[eWhich])
1470             pColBar[eWhich]->Update();
1471 
1472         long nOldPos = aViewData.GetScrPos( nTrackX, 0, eWhich ).X();
1473         aViewData.SetPosX( eWhich, static_cast<SCCOL>(nNewX) );
1474         long nDiff = aViewData.GetScrPos( nTrackX, 0, eWhich ).X() - nOldPos;
1475 
1476         if ( eWhich==SC_SPLIT_LEFT )
1477         {
1478             pGridWin[SC_SPLIT_BOTTOMLEFT]->ScrollPixel( nDiff, 0 );
1479             if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE )
1480                 pGridWin[SC_SPLIT_TOPLEFT]->ScrollPixel( nDiff, 0 );
1481         }
1482         else
1483         {
1484             pGridWin[SC_SPLIT_BOTTOMRIGHT]->ScrollPixel( nDiff, 0 );
1485             if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE )
1486                 pGridWin[SC_SPLIT_TOPRIGHT]->ScrollPixel( nDiff, 0 );
1487         }
1488         if (pColBar[eWhich])     { pColBar[eWhich]->Scroll( nDiff,0 ); pColBar[eWhich]->Update(); }
1489         if (pColOutline[eWhich]) pColOutline[eWhich]->ScrollPixel( nDiff );
1490         if (bUpdBars)
1491             UpdateScrollBars();
1492     }
1493 
1494     if (nDeltaX==1 || nDeltaX==-1)
1495         pGridWin[aViewData.GetActivePart()]->Update();
1496 
1497     ShowAllCursors();
1498 
1499     SetNewVisArea();            // MapMode muss schon gesetzt sein
1500 
1501     if (bHasHint)
1502         TestHintWindow();       // neu positionieren
1503 }
1504 
ScrollY(long nDeltaY,ScVSplitPos eWhich,sal_Bool bUpdBars)1505 void ScTabView::ScrollY( long nDeltaY, ScVSplitPos eWhich, sal_Bool bUpdBars )
1506 {
1507     sal_Bool bHasHint = ( pInputHintWindow != NULL );
1508     if (bHasHint)
1509         RemoveHintWindow();
1510 
1511     SCROW nOldY = aViewData.GetPosY(eWhich);
1512     SCsROW nNewY = static_cast<SCsROW>(nOldY) + static_cast<SCsROW>(nDeltaY);
1513     if ( nNewY < 0 )
1514     {
1515         nDeltaY -= nNewY;
1516         nNewY = 0;
1517     }
1518     if ( nNewY > MAXROW )
1519     {
1520         nDeltaY -= nNewY - MAXROW;
1521         nNewY = MAXROW;
1522     }
1523 
1524     SCsROW nDir = ( nDeltaY > 0 ) ? 1 : -1;
1525     ScDocument* pDoc = aViewData.GetDocument();
1526     SCTAB nTab = aViewData.GetTabNo();
1527     while ( pDoc->RowHidden(nNewY, nTab) &&
1528             nNewY+nDir >= 0 && nNewY+nDir <= MAXROW )
1529         nNewY += nDir;
1530 
1531     //  Fixierung
1532 
1533     if (aViewData.GetVSplitMode() == SC_SPLIT_FIX)
1534     {
1535         if (eWhich == SC_SPLIT_TOP)
1536             nNewY = static_cast<SCsROW>(nOldY);                             // oben immer stehenlassen
1537         else
1538         {
1539             SCsROW nFixY = static_cast<SCsROW>(aViewData.GetFixPosY());
1540             if (nNewY < nFixY)
1541                 nNewY = nFixY;
1542         }
1543     }
1544     if (nNewY == static_cast<SCsROW>(nOldY))
1545         return;
1546 
1547     HideAllCursors();
1548 
1549     if ( nNewY >= 0 && nNewY <= MAXROW && nDeltaY )
1550     {
1551         SCROW nTrackY = std::max( nOldY, static_cast<SCROW>(nNewY) );
1552 
1553         //  Zeilenkoepfe anpassen vor dem eigentlichen Scrolling, damit nicht
1554         //  doppelt gepainted werden muss
1555         //  PosY darf dann auch noch nicht umgesetzt sein, neuen Wert uebergeben
1556         SCROW nUNew = static_cast<SCROW>(nNewY);
1557         UpdateHeaderWidth( &eWhich, &nUNew );               // Zeilenkoepfe anpassen
1558 
1559         if (pRowBar[eWhich])
1560             pRowBar[eWhich]->Update();
1561 
1562         long nOldPos = aViewData.GetScrPos( 0, nTrackY, eWhich ).Y();
1563         aViewData.SetPosY( eWhich, static_cast<SCROW>(nNewY) );
1564         long nDiff = aViewData.GetScrPos( 0, nTrackY, eWhich ).Y() - nOldPos;
1565 
1566         if ( eWhich==SC_SPLIT_TOP )
1567         {
1568             pGridWin[SC_SPLIT_TOPLEFT]->ScrollPixel( 0, nDiff );
1569             if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE )
1570                 pGridWin[SC_SPLIT_TOPRIGHT]->ScrollPixel( 0, nDiff );
1571         }
1572         else
1573         {
1574             pGridWin[SC_SPLIT_BOTTOMLEFT]->ScrollPixel( 0, nDiff );
1575             if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE )
1576                 pGridWin[SC_SPLIT_BOTTOMRIGHT]->ScrollPixel( 0, nDiff );
1577         }
1578         if (pRowBar[eWhich])     { pRowBar[eWhich]->Scroll( 0,nDiff ); pRowBar[eWhich]->Update(); }
1579         if (pRowOutline[eWhich]) pRowOutline[eWhich]->ScrollPixel( nDiff );
1580         if (bUpdBars)
1581             UpdateScrollBars();
1582     }
1583 
1584     if (nDeltaY==1 || nDeltaY==-1)
1585         pGridWin[aViewData.GetActivePart()]->Update();
1586 
1587     ShowAllCursors();
1588 
1589     SetNewVisArea();            // MapMode muss schon gesetzt sein
1590 
1591     if (bHasHint)
1592         TestHintWindow();       // neu positionieren
1593 }
1594 
ScrollLines(long nDeltaX,long nDeltaY)1595 void ScTabView::ScrollLines( long nDeltaX, long nDeltaY )
1596 {
1597     ScSplitPos eWhich = aViewData.GetActivePart();
1598     if (nDeltaX)
1599         ScrollX(nDeltaX,WhichH(eWhich));
1600     if (nDeltaY)
1601         ScrollY(nDeltaY,WhichV(eWhich));
1602 }
1603 
lcl_LastVisible(ScViewData & rViewData)1604 SCROW lcl_LastVisible( ScViewData& rViewData )
1605 {
1606     //  wenn am Dokumentende viele Zeilen ausgeblendet sind (welcher Trottel macht sowas?),
1607     //  soll dadurch nicht auf breite Zeilenkoepfe geschaltet werden
1608     //! als Member ans Dokument ???
1609 
1610     ScDocument* pDoc = rViewData.GetDocument();
1611     SCTAB nTab = rViewData.GetTabNo();
1612 
1613     SCROW nVis = MAXROW;
1614     while ( nVis > 0 && pDoc->GetRowHeight( nVis, nTab ) == 0 )
1615         --nVis;
1616     return nVis;
1617 }
1618 
UpdateHeaderWidth(const ScVSplitPos * pWhich,const SCROW * pPosY)1619 void ScTabView::UpdateHeaderWidth( const ScVSplitPos* pWhich, const SCROW* pPosY )
1620 {
1621     if ( !pRowBar[SC_SPLIT_BOTTOM] || MAXROW < 10000 )
1622         return;
1623 
1624     SCROW nEndPos = MAXROW;
1625     if ( !aViewData.GetViewShell()->GetViewFrame()->GetFrame().IsInPlace() )
1626     {
1627         //  fuer OLE Inplace immer MAXROW
1628 
1629         if ( pWhich && *pWhich == SC_SPLIT_BOTTOM && pPosY )
1630             nEndPos = *pPosY;
1631         else
1632             nEndPos = aViewData.GetPosY( SC_SPLIT_BOTTOM );
1633         nEndPos += aViewData.CellsAtY( nEndPos, 1, SC_SPLIT_BOTTOM, SC_SIZE_NONE ); // VisibleCellsY
1634         if (nEndPos > MAXROW)
1635             nEndPos = lcl_LastVisible( aViewData );
1636 
1637         if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE )
1638         {
1639             SCROW nTopEnd;
1640             if ( pWhich && *pWhich == SC_SPLIT_TOP && pPosY )
1641                 nTopEnd = *pPosY;
1642             else
1643                 nTopEnd = aViewData.GetPosY( SC_SPLIT_TOP );
1644             nTopEnd += aViewData.CellsAtY( nTopEnd, 1, SC_SPLIT_TOP, SC_SIZE_NONE );// VisibleCellsY
1645             if (nTopEnd > MAXROW)
1646                 nTopEnd = lcl_LastVisible( aViewData );
1647 
1648             if ( nTopEnd > nEndPos )
1649                 nEndPos = nTopEnd;
1650         }
1651     }
1652 
1653     long nSmall = pRowBar[SC_SPLIT_BOTTOM]->GetSmallWidth();
1654     long nBig   = pRowBar[SC_SPLIT_BOTTOM]->GetBigWidth();
1655     long nDiff  = nBig - nSmall;
1656 
1657     if (nEndPos>10000)
1658         nEndPos = 10000;
1659     else if (nEndPos<1)     // avoid extra step at 0 (when only one row is visible)
1660         nEndPos = 1;
1661     long nWidth = nBig - ( 10000 - nEndPos ) * nDiff / 10000;
1662 
1663     if ( nWidth != pRowBar[SC_SPLIT_BOTTOM]->GetWidth() && !bInUpdateHeader )
1664     {
1665         bInUpdateHeader = sal_True;
1666 
1667         pRowBar[SC_SPLIT_BOTTOM]->SetWidth( nWidth );
1668         if (pRowBar[SC_SPLIT_TOP])
1669             pRowBar[SC_SPLIT_TOP]->SetWidth( nWidth );
1670 
1671         RepeatResize();
1672 
1673         // auf VCL gibt's Update ohne Ende (jedes Update gilt fuer alle Fenster)
1674         //aCornerButton.Update();       // der bekommt sonst nie ein Update
1675 
1676         bInUpdateHeader = sal_False;
1677     }
1678 }
1679 
ShowHide(Window * pWin,sal_Bool bShow)1680 inline void ShowHide( Window* pWin, sal_Bool bShow )
1681 {
1682     DBG_ASSERT(pWin || !bShow, "Fenster ist nicht da");
1683     if (pWin)
1684         pWin->Show(bShow);
1685 }
1686 
UpdateShow()1687 void ScTabView::UpdateShow()
1688 {
1689     sal_Bool bHScrollMode = aViewData.IsHScrollMode();
1690     sal_Bool bVScrollMode = aViewData.IsVScrollMode();
1691     sal_Bool bTabMode     = aViewData.IsTabMode();
1692     sal_Bool bOutlMode    = aViewData.IsOutlineMode();
1693     sal_Bool bHOutline    = bOutlMode && lcl_HasColOutline(aViewData);
1694     sal_Bool bVOutline    = bOutlMode && lcl_HasRowOutline(aViewData);
1695     sal_Bool bHeader      = aViewData.IsHeaderMode();
1696 
1697     sal_Bool bShowH = ( aViewData.GetHSplitMode() != SC_SPLIT_NONE );
1698     sal_Bool bShowV = ( aViewData.GetVSplitMode() != SC_SPLIT_NONE );
1699 
1700     //  Scrollbar-Einstellungen koennen vom Sfx ueberschrieben werden:
1701     SfxScrollingMode eMode = aViewData.GetViewShell()->GetScrollingMode();
1702     if ( eMode == SCROLLING_NO )
1703         bHScrollMode = bVScrollMode = sal_False;
1704     else if ( eMode == SCROLLING_YES || eMode == SCROLLING_AUTO )   //! Auto ???
1705         bHScrollMode = bVScrollMode = sal_True;
1706 
1707     if ( aViewData.GetDocShell()->IsPreview() )
1708         bHScrollMode = bVScrollMode = bTabMode = bHeader = bOutlMode = bHOutline = bVOutline = sal_False;
1709 
1710         //
1711         //  Windows anlegen
1712         //
1713 
1714     if (bShowH && !pGridWin[SC_SPLIT_BOTTOMRIGHT])
1715     {
1716         pGridWin[SC_SPLIT_BOTTOMRIGHT] = new ScGridWindow( pFrameWin, &aViewData, SC_SPLIT_BOTTOMRIGHT );
1717         DoAddWin( pGridWin[SC_SPLIT_BOTTOMRIGHT] );
1718     }
1719     if (bShowV && !pGridWin[SC_SPLIT_TOPLEFT])
1720     {
1721         pGridWin[SC_SPLIT_TOPLEFT] = new ScGridWindow( pFrameWin, &aViewData, SC_SPLIT_TOPLEFT );
1722         DoAddWin( pGridWin[SC_SPLIT_TOPLEFT] );
1723     }
1724     if (bShowH && bShowV && !pGridWin[SC_SPLIT_TOPRIGHT])
1725     {
1726         pGridWin[SC_SPLIT_TOPRIGHT] = new ScGridWindow( pFrameWin, &aViewData, SC_SPLIT_TOPRIGHT );
1727         DoAddWin( pGridWin[SC_SPLIT_TOPRIGHT] );
1728     }
1729 
1730     if (bHOutline && !pColOutline[SC_SPLIT_LEFT])
1731         pColOutline[SC_SPLIT_LEFT] = new ScOutlineWindow( pFrameWin, SC_OUTLINE_HOR, &aViewData, SC_SPLIT_BOTTOMLEFT );
1732     if (bShowH && bHOutline && !pColOutline[SC_SPLIT_RIGHT])
1733         pColOutline[SC_SPLIT_RIGHT] = new ScOutlineWindow( pFrameWin, SC_OUTLINE_HOR, &aViewData, SC_SPLIT_BOTTOMRIGHT );
1734 
1735     if (bVOutline && !pRowOutline[SC_SPLIT_BOTTOM])
1736         pRowOutline[SC_SPLIT_BOTTOM] = new ScOutlineWindow( pFrameWin, SC_OUTLINE_VER, &aViewData, SC_SPLIT_BOTTOMLEFT );
1737     if (bShowV && bVOutline && !pRowOutline[SC_SPLIT_TOP])
1738         pRowOutline[SC_SPLIT_TOP] = new ScOutlineWindow( pFrameWin, SC_OUTLINE_VER, &aViewData, SC_SPLIT_TOPLEFT );
1739 
1740     if (bShowH && bHeader && !pColBar[SC_SPLIT_RIGHT])
1741         pColBar[SC_SPLIT_RIGHT] = new ScColBar( pFrameWin, &aViewData, SC_SPLIT_RIGHT,
1742                                                 &aHdrFunc, pHdrSelEng );
1743     if (bShowV && bHeader && !pRowBar[SC_SPLIT_TOP])
1744         pRowBar[SC_SPLIT_TOP] = new ScRowBar( pFrameWin, &aViewData, SC_SPLIT_TOP,
1745                                                 &aHdrFunc, pHdrSelEng );
1746 
1747         //
1748         //  Windows anzeigen
1749         //
1750 
1751     ShowHide( &aHScrollLeft, bHScrollMode );
1752     ShowHide( &aHScrollRight, bShowH && bHScrollMode );
1753     ShowHide( &aVScrollBottom, bVScrollMode );
1754     ShowHide( &aVScrollTop, bShowV && bVScrollMode );
1755     ShowHide( &aScrollBarBox, bVScrollMode || bHScrollMode );
1756 
1757     ShowHide( pHSplitter, bHScrollMode || bShowH );         // immer angelegt
1758     ShowHide( pVSplitter, bVScrollMode || bShowV );
1759     ShowHide( pTabControl, bTabMode );
1760 
1761                                                     // ab hier dynamisch angelegte
1762 
1763     ShowHide( pGridWin[SC_SPLIT_BOTTOMRIGHT], bShowH );
1764     ShowHide( pGridWin[SC_SPLIT_TOPLEFT], bShowV );
1765     ShowHide( pGridWin[SC_SPLIT_TOPRIGHT], bShowH && bShowV );
1766 
1767     ShowHide( pColOutline[SC_SPLIT_LEFT], bHOutline );
1768     ShowHide( pColOutline[SC_SPLIT_RIGHT], bShowH && bHOutline );
1769 
1770     ShowHide( pRowOutline[SC_SPLIT_BOTTOM], bVOutline );
1771     ShowHide( pRowOutline[SC_SPLIT_TOP], bShowV && bVOutline );
1772 
1773     ShowHide( pColBar[SC_SPLIT_RIGHT], bShowH && bHeader );
1774     ShowHide( pRowBar[SC_SPLIT_TOP], bShowV && bHeader );
1775 
1776 
1777     //! neue Gridwindows eintragen
1778 }
1779 
1780 // ---  Splitter  --------------------------------------------------------
1781 
IMPL_LINK(ScTabView,SplitHdl,Splitter *,pSplitter)1782 IMPL_LINK( ScTabView, SplitHdl, Splitter*, pSplitter )
1783 {
1784     if ( pSplitter == pHSplitter )
1785         DoHSplit( pHSplitter->GetSplitPosPixel() );
1786     else
1787         DoVSplit( pVSplitter->GetSplitPosPixel() );
1788 
1789     if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX || aViewData.GetVSplitMode() == SC_SPLIT_FIX )
1790         FreezeSplitters( sal_True );
1791 
1792     DoResize( aBorderPos, aFrameSize );
1793 
1794     return 0;
1795 }
1796 
DoHSplit(long nSplitPos)1797 void ScTabView::DoHSplit(long nSplitPos)
1798 {
1799     //  nSplitPos is the real pixel position on the frame window,
1800     //  mirroring for RTL has to be done here.
1801 
1802     sal_Bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() );
1803     if ( bLayoutRTL )
1804         nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1;
1805 
1806     long nMinPos;
1807     long nMaxPos;
1808     SCCOL nOldDelta;
1809     SCCOL nNewDelta;
1810 
1811     nMinPos = SPLIT_MARGIN;
1812     if ( pRowBar[SC_SPLIT_BOTTOM] && pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width() >= nMinPos )
1813         nMinPos = pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width() + 1;
1814     nMaxPos = aFrameSize.Width() - SPLIT_MARGIN;
1815 
1816     ScSplitMode aOldMode = aViewData.GetHSplitMode();
1817     ScSplitMode aNewMode = SC_SPLIT_NORMAL;
1818 
1819     aViewData.SetHSplitPos( nSplitPos );
1820     if ( nSplitPos < nMinPos || nSplitPos > nMaxPos )
1821         aNewMode = SC_SPLIT_NONE;
1822 
1823     aViewData.SetHSplitMode( aNewMode );
1824 
1825     if ( aNewMode != aOldMode )
1826     {
1827         UpdateShow();       // vor ActivatePart !!
1828 
1829         if ( aNewMode == SC_SPLIT_NONE )
1830         {
1831             if (aViewData.GetActivePart() == SC_SPLIT_TOPRIGHT)
1832                 ActivatePart( SC_SPLIT_TOPLEFT );
1833             if (aViewData.GetActivePart() == SC_SPLIT_BOTTOMRIGHT)
1834                 ActivatePart( SC_SPLIT_BOTTOMLEFT );
1835         }
1836         else
1837         {
1838             nOldDelta = aViewData.GetPosX( SC_SPLIT_LEFT );
1839 //          aViewData.SetPosX( SC_SPLIT_LEFT, nOldDelta );
1840             long nLeftWidth = nSplitPos - pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width();
1841             if ( nLeftWidth < 0 ) nLeftWidth = 0;
1842             nNewDelta = nOldDelta + aViewData.CellsAtX( nOldDelta, 1, SC_SPLIT_LEFT,
1843                             (sal_uInt16) nLeftWidth );
1844             if ( nNewDelta > MAXCOL )
1845                 nNewDelta = MAXCOL;
1846             aViewData.SetPosX( SC_SPLIT_RIGHT, nNewDelta );
1847             if ( nNewDelta > aViewData.GetCurX() )
1848                 ActivatePart( (WhichV(aViewData.GetActivePart()) == SC_SPLIT_BOTTOM) ?
1849                     SC_SPLIT_BOTTOMLEFT : SC_SPLIT_TOPLEFT );
1850             else
1851                 ActivatePart( (WhichV(aViewData.GetActivePart()) == SC_SPLIT_BOTTOM) ?
1852                     SC_SPLIT_BOTTOMRIGHT : SC_SPLIT_TOPRIGHT );
1853         }
1854 
1855         //  #61410# Form-Layer muss den sichtbaren Ausschnitt aller Fenster kennen
1856         //  dafuer muss hier schon der MapMode stimmen
1857         for (sal_uInt16 i=0; i<4; i++)
1858             if (pGridWin[i])
1859                 pGridWin[i]->SetMapMode( pGridWin[i]->GetDrawMapMode() );
1860         SetNewVisArea();
1861 
1862         PaintGrid();
1863         PaintTop();
1864 
1865         InvalidateSplit();
1866     }
1867 }
1868 
DoVSplit(long nSplitPos)1869 void ScTabView::DoVSplit(long nSplitPos)
1870 {
1871     long nMinPos;
1872     long nMaxPos;
1873     SCROW nOldDelta;
1874     SCROW nNewDelta;
1875 
1876     nMinPos = SPLIT_MARGIN;
1877     if ( pColBar[SC_SPLIT_LEFT] && pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height() >= nMinPos )
1878         nMinPos = pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height() + 1;
1879     nMaxPos = aFrameSize.Height() - SPLIT_MARGIN;
1880 
1881     ScSplitMode aOldMode = aViewData.GetVSplitMode();
1882     ScSplitMode aNewMode = SC_SPLIT_NORMAL;
1883 
1884     aViewData.SetVSplitPos( nSplitPos );
1885     if ( nSplitPos < nMinPos || nSplitPos > nMaxPos )
1886         aNewMode = SC_SPLIT_NONE;
1887 
1888     aViewData.SetVSplitMode( aNewMode );
1889 
1890     if ( aNewMode != aOldMode )
1891     {
1892         UpdateShow();       // vor ActivatePart !!
1893 
1894         if ( aNewMode == SC_SPLIT_NONE )
1895         {
1896             nOldDelta = aViewData.GetPosY( SC_SPLIT_TOP );
1897             aViewData.SetPosY( SC_SPLIT_BOTTOM, nOldDelta );
1898 
1899             if (aViewData.GetActivePart() == SC_SPLIT_TOPLEFT)
1900                 ActivatePart( SC_SPLIT_BOTTOMLEFT );
1901             if (aViewData.GetActivePart() == SC_SPLIT_TOPRIGHT)
1902                 ActivatePart( SC_SPLIT_BOTTOMRIGHT );
1903         }
1904         else
1905         {
1906             if ( aOldMode == SC_SPLIT_NONE )
1907                 nOldDelta = aViewData.GetPosY( SC_SPLIT_BOTTOM );
1908             else
1909                 nOldDelta = aViewData.GetPosY( SC_SPLIT_TOP );
1910 
1911             aViewData.SetPosY( SC_SPLIT_TOP, nOldDelta );
1912             long nTopHeight = nSplitPos - pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height();
1913             if ( nTopHeight < 0 ) nTopHeight = 0;
1914             nNewDelta = nOldDelta + aViewData.CellsAtY( nOldDelta, 1, SC_SPLIT_TOP,
1915                             (sal_uInt16) nTopHeight );
1916             if ( nNewDelta > MAXROW )
1917                 nNewDelta = MAXROW;
1918             aViewData.SetPosY( SC_SPLIT_BOTTOM, nNewDelta );
1919             if ( nNewDelta > aViewData.GetCurY() )
1920                 ActivatePart( (WhichH(aViewData.GetActivePart()) == SC_SPLIT_LEFT) ?
1921                     SC_SPLIT_TOPLEFT : SC_SPLIT_TOPRIGHT );
1922             else
1923                 ActivatePart( (WhichH(aViewData.GetActivePart()) == SC_SPLIT_LEFT) ?
1924                     SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT );
1925         }
1926 
1927         //  #61410# Form-Layer muss den sichtbaren Ausschnitt aller Fenster kennen
1928         //  dafuer muss hier schon der MapMode stimmen
1929         for (sal_uInt16 i=0; i<4; i++)
1930             if (pGridWin[i])
1931                 pGridWin[i]->SetMapMode( pGridWin[i]->GetDrawMapMode() );
1932         SetNewVisArea();
1933 
1934         PaintGrid();
1935         PaintLeft();
1936 
1937         InvalidateSplit();
1938     }
1939 }
1940 
GetInsertPos()1941 Point ScTabView::GetInsertPos()
1942 {
1943     ScDocument* pDoc = aViewData.GetDocument();
1944     SCCOL nCol = aViewData.GetCurX();
1945     SCROW nRow = aViewData.GetCurY();
1946     SCTAB nTab = aViewData.GetTabNo();
1947     long nPosX = 0;
1948     for (SCCOL i=0; i<nCol; i++)
1949         nPosX += pDoc->GetColWidth(i,nTab);
1950     nPosX = (long)(nPosX * HMM_PER_TWIPS);
1951     if ( pDoc->IsNegativePage( nTab ) )
1952         nPosX = -nPosX;
1953     long nPosY = (long) pDoc->GetRowHeight( 0, nRow-1, nTab);
1954     nPosY = (long)(nPosY * HMM_PER_TWIPS);
1955     return Point(nPosX,nPosY);
1956 }
1957 
GetChartInsertPos(const Size & rSize,const ScRange & rCellRange)1958 Point ScTabView::GetChartInsertPos( const Size& rSize, const ScRange& rCellRange )
1959 {
1960     Point aInsertPos;
1961     const long nBorder = 100;   // leave 1mm for border
1962     long nNeededWidth = rSize.Width() + 2 * nBorder;
1963     long nNeededHeight = rSize.Height() + 2 * nBorder;
1964 
1965     // use the active window, or lower/right if frozen (as in CalcZoom)
1966     ScSplitPos eUsedPart = aViewData.GetActivePart();
1967     if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX )
1968         eUsedPart = (WhichV(eUsedPart)==SC_SPLIT_TOP) ? SC_SPLIT_TOPRIGHT : SC_SPLIT_BOTTOMRIGHT;
1969     if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX )
1970         eUsedPart = (WhichH(eUsedPart)==SC_SPLIT_LEFT) ? SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT;
1971 
1972     ScGridWindow* pWin = pGridWin[eUsedPart];
1973     DBG_ASSERT( pWin, "Window not found" );
1974     if (pWin)
1975     {
1976         ActivatePart( eUsedPart );
1977 
1978         //  get the visible rectangle in logic units
1979 
1980         MapMode aDrawMode = pWin->GetDrawMapMode();
1981         Rectangle aVisible( pWin->PixelToLogic( Rectangle( Point(0,0), pWin->GetOutputSizePixel() ), aDrawMode ) );
1982 
1983         ScDocument* pDoc = aViewData.GetDocument();
1984         SCTAB nTab = aViewData.GetTabNo();
1985         sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
1986         long nLayoutSign = bLayoutRTL ? -1 : 1;
1987 
1988         long nDocX = (long)( (double) pDoc->GetColOffset( MAXCOL + 1, nTab ) * HMM_PER_TWIPS ) * nLayoutSign;
1989         long nDocY = (long)( (double) pDoc->GetRowOffset( MAXROW + 1, nTab ) * HMM_PER_TWIPS );
1990 
1991         if ( aVisible.Left() * nLayoutSign > nDocX * nLayoutSign )
1992             aVisible.Left() = nDocX;
1993         if ( aVisible.Right() * nLayoutSign > nDocX * nLayoutSign )
1994             aVisible.Right() = nDocX;
1995         if ( aVisible.Top() > nDocY )
1996             aVisible.Top() = nDocY;
1997         if ( aVisible.Bottom() > nDocY )
1998             aVisible.Bottom() = nDocY;
1999 
2000         //  get the logic position of the selection
2001 
2002         Rectangle aSelection = pDoc->GetMMRect( rCellRange.aStart.Col(), rCellRange.aStart.Row(),
2003                                                 rCellRange.aEnd.Col(), rCellRange.aEnd.Row(), nTab );
2004 
2005         long nLeftSpace = aSelection.Left() - aVisible.Left();
2006         long nRightSpace = aVisible.Right() - aSelection.Right();
2007         long nTopSpace = aSelection.Top() - aVisible.Top();
2008         long nBottomSpace = aVisible.Bottom() - aSelection.Bottom();
2009 
2010         bool bFitLeft = ( nLeftSpace >= nNeededWidth );
2011         bool bFitRight = ( nRightSpace >= nNeededWidth );
2012 
2013         if ( bFitLeft || bFitRight )
2014         {
2015             // first preference: completely left or right of the selection
2016 
2017             // if both fit, prefer left in RTL mode, right otherwise
2018             bool bPutLeft = bFitLeft && ( bLayoutRTL || !bFitRight );
2019 
2020             if ( bPutLeft )
2021                 aInsertPos.X() = aSelection.Left() - nNeededWidth;
2022             else
2023                 aInsertPos.X() = aSelection.Right() + 1;
2024 
2025             // align with top of selection (is moved again if it doesn't fit)
2026             aInsertPos.Y() = std::max( aSelection.Top(), aVisible.Top() );
2027         }
2028         else if ( nTopSpace >= nNeededHeight || nBottomSpace >= nNeededHeight )
2029         {
2030             // second preference: completely above or below the selection
2031 
2032             if ( nBottomSpace > nNeededHeight )             // bottom is preferred
2033                 aInsertPos.Y() = aSelection.Bottom() + 1;
2034             else
2035                 aInsertPos.Y() = aSelection.Top() - nNeededHeight;
2036 
2037             // align with (logic) left edge of selection (moved again if it doesn't fit)
2038             if ( bLayoutRTL )
2039                 aInsertPos.X() = std::min( aSelection.Right(), aVisible.Right() ) - nNeededWidth + 1;
2040             else
2041                 aInsertPos.X() = std::max( aSelection.Left(), aVisible.Left() );
2042         }
2043         else
2044         {
2045             // place to the (logic) right of the selection and move so it fits
2046 
2047             if ( bLayoutRTL )
2048                 aInsertPos.X() = aSelection.Left() - nNeededWidth;
2049             else
2050                 aInsertPos.X() = aSelection.Right() + 1;
2051             aInsertPos.Y() = std::max( aSelection.Top(), aVisible.Top() );
2052         }
2053 
2054         // move the position if the object doesn't fit in the screen
2055 
2056         Rectangle aCompareRect( aInsertPos, Size( nNeededWidth, nNeededHeight ) );
2057         if ( aCompareRect.Right() > aVisible.Right() )
2058             aInsertPos.X() -= aCompareRect.Right() - aVisible.Right();
2059         if ( aCompareRect.Bottom() > aVisible.Bottom() )
2060             aInsertPos.Y() -= aCompareRect.Bottom() - aVisible.Bottom();
2061 
2062         if ( aInsertPos.X() < aVisible.Left() )
2063             aInsertPos.X() = aVisible.Left();
2064         if ( aInsertPos.Y() < aVisible.Top() )
2065             aInsertPos.Y() = aVisible.Top();
2066 
2067         // nNeededWidth / nNeededHeight includes all borders - move aInsertPos to the
2068         // object position, inside the border
2069 
2070         aInsertPos.X() += nBorder;
2071         aInsertPos.Y() += nBorder;
2072     }
2073     return aInsertPos;
2074 }
2075 
GetChartDialogPos(const Size & rDialogSize,const Rectangle & rLogicChart)2076 Point ScTabView::GetChartDialogPos( const Size& rDialogSize, const Rectangle& rLogicChart )
2077 {
2078     // rDialogSize must be in pixels, rLogicChart in 1/100 mm. Return value is in pixels.
2079 
2080     Point aRet;
2081 
2082     // use the active window, or lower/right if frozen (as in CalcZoom)
2083     ScSplitPos eUsedPart = aViewData.GetActivePart();
2084     if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX )
2085         eUsedPart = (WhichV(eUsedPart)==SC_SPLIT_TOP) ? SC_SPLIT_TOPRIGHT : SC_SPLIT_BOTTOMRIGHT;
2086     if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX )
2087         eUsedPart = (WhichH(eUsedPart)==SC_SPLIT_LEFT) ? SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT;
2088 
2089     ScGridWindow* pWin = pGridWin[eUsedPart];
2090     DBG_ASSERT( pWin, "Window not found" );
2091     if (pWin)
2092     {
2093         MapMode aDrawMode = pWin->GetDrawMapMode();
2094         Rectangle aObjPixel = pWin->LogicToPixel( rLogicChart, aDrawMode );
2095         Rectangle aObjAbs( pWin->OutputToAbsoluteScreenPixel( aObjPixel.TopLeft() ),
2096                            pWin->OutputToAbsoluteScreenPixel( aObjPixel.BottomRight() ) );
2097 
2098         Rectangle aDesktop = pWin->GetDesktopRectPixel();
2099         Size aSpace = pWin->LogicToPixel( Size( 8, 12 ), MAP_APPFONT );
2100 
2101         ScDocument* pDoc = aViewData.GetDocument();
2102         SCTAB nTab = aViewData.GetTabNo();
2103         sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
2104 
2105         bool bCenterHor = false;
2106 
2107         if ( aDesktop.Bottom() - aObjAbs.Bottom() >= rDialogSize.Height() + aSpace.Height() )
2108         {
2109             // first preference: below the chart
2110 
2111             aRet.Y() = aObjAbs.Bottom() + aSpace.Height();
2112             bCenterHor = true;
2113         }
2114         else if ( aObjAbs.Top() - aDesktop.Top() >= rDialogSize.Height() + aSpace.Height() )
2115         {
2116             // second preference: above the chart
2117 
2118             aRet.Y() = aObjAbs.Top() - rDialogSize.Height() - aSpace.Height();
2119             bCenterHor = true;
2120         }
2121         else
2122         {
2123             bool bFitLeft = ( aObjAbs.Left() - aDesktop.Left() >= rDialogSize.Width() + aSpace.Width() );
2124             bool bFitRight = ( aDesktop.Right() - aObjAbs.Right() >= rDialogSize.Width() + aSpace.Width() );
2125 
2126             if ( bFitLeft || bFitRight )
2127             {
2128                 // if both fit, prefer right in RTL mode, left otherwise
2129                 bool bPutRight = bFitRight && ( bLayoutRTL || !bFitLeft );
2130                 if ( bPutRight )
2131                     aRet.X() = aObjAbs.Right() + aSpace.Width();
2132                 else
2133                     aRet.X() = aObjAbs.Left() - rDialogSize.Width() - aSpace.Width();
2134 
2135                 // center vertically
2136                 aRet.Y() = aObjAbs.Top() + ( aObjAbs.GetHeight() - rDialogSize.Height() ) / 2;
2137             }
2138             else
2139             {
2140                 // doesn't fit on any edge - put at the bottom of the screen
2141                 aRet.Y() = aDesktop.Bottom() - rDialogSize.Height();
2142                 bCenterHor = true;
2143             }
2144         }
2145         if ( bCenterHor )
2146             aRet.X() = aObjAbs.Left() + ( aObjAbs.GetWidth() - rDialogSize.Width() ) / 2;
2147 
2148         // limit to screen (centering might lead to invalid positions)
2149         if ( aRet.X() + rDialogSize.Width() - 1 > aDesktop.Right() )
2150             aRet.X() = aDesktop.Right() - rDialogSize.Width() + 1;
2151         if ( aRet.X() < aDesktop.Left() )
2152             aRet.X() = aDesktop.Left();
2153         if ( aRet.Y() + rDialogSize.Height() - 1 > aDesktop.Bottom() )
2154             aRet.Y() = aDesktop.Bottom() - rDialogSize.Height() + 1;
2155         if ( aRet.Y() < aDesktop.Top() )
2156             aRet.Y() = aDesktop.Top();
2157     }
2158 
2159     return aRet;
2160 }
2161 
LockModifiers(sal_uInt16 nModifiers)2162 void ScTabView::LockModifiers( sal_uInt16 nModifiers )
2163 {
2164     pSelEngine->LockModifiers( nModifiers );
2165     pHdrSelEng->LockModifiers( nModifiers );
2166 }
2167 
GetLockedModifiers() const2168 sal_uInt16 ScTabView::GetLockedModifiers() const
2169 {
2170     return pSelEngine->GetLockedModifiers();
2171 }
2172 
GetMousePosPixel()2173 Point ScTabView::GetMousePosPixel()
2174 {
2175     Point aPos;
2176     ScGridWindow* pWin = (ScGridWindow*)GetActiveWin();
2177 
2178     if ( pWin )
2179         aPos = pWin->GetMousePosPixel();
2180 
2181     return aPos;
2182 }
2183 
lcl_MouseIsOverWin(const Point & rScreenPosPixel,Window * pWin)2184 sal_Bool lcl_MouseIsOverWin( const Point& rScreenPosPixel, Window* pWin )
2185 {
2186     if (pWin)
2187     {
2188         //  SPLIT_HANDLE_SIZE draufaddieren, damit das Einrasten genau
2189         //  auf dem Splitter nicht aussetzt
2190 
2191         Point aRel = pWin->NormalizedScreenToOutputPixel( rScreenPosPixel );
2192         Size aWinSize = pWin->GetOutputSizePixel();
2193         if ( aRel.X() >= 0 && aRel.X() < aWinSize.Width() + SPLIT_HANDLE_SIZE &&
2194                 aRel.Y() >= 0 && aRel.Y() < aWinSize.Height() + SPLIT_HANDLE_SIZE )
2195             return sal_True;
2196     }
2197     return sal_False;
2198 }
2199 
SnapSplitPos(Point & rScreenPosPixel)2200 void ScTabView::SnapSplitPos( Point& rScreenPosPixel )
2201 {
2202     sal_Bool bOverWin = sal_False;
2203     sal_uInt16 i;
2204     for (i=0; i<4; i++)
2205         if (lcl_MouseIsOverWin(rScreenPosPixel,pGridWin[i]))
2206             bOverWin = sal_True;
2207 
2208     if (!bOverWin)
2209         return;
2210 
2211     //  #74761# don't snap to cells if the scale will be modified afterwards
2212     if ( GetZoomType() != SVX_ZOOM_PERCENT )
2213         return;
2214 
2215     ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT;
2216     if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE )
2217         ePos = SC_SPLIT_TOPLEFT;
2218 
2219     Window* pWin = pGridWin[ePos];
2220     if (!pWin)
2221     {
2222         DBG_ERROR("Window NULL");
2223         return;
2224     }
2225 
2226     Point aMouse = pWin->NormalizedScreenToOutputPixel( rScreenPosPixel );
2227     SCsCOL nPosX;
2228     SCsROW nPosY;
2229     //  #52949# bNextIfLarge=FALSE: nicht auf naechste Zelle, wenn ausserhalb des Fensters
2230     aViewData.GetPosFromPixel( aMouse.X(), aMouse.Y(), ePos, nPosX, nPosY, sal_True, sal_False, sal_False );
2231     sal_Bool bLeft;
2232     sal_Bool bTop;
2233     aViewData.GetMouseQuadrant( aMouse, ePos, nPosX, nPosY, bLeft, bTop );
2234     if (!bLeft)
2235         ++nPosX;
2236     if (!bTop)
2237         ++nPosY;
2238     aMouse = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, sal_True );
2239     rScreenPosPixel = pWin->OutputToNormalizedScreenPixel( aMouse );
2240 }
2241 
FreezeSplitters(sal_Bool bFreeze)2242 void ScTabView::FreezeSplitters( sal_Bool bFreeze )
2243 {
2244     ScSplitMode eOldH = aViewData.GetHSplitMode();
2245     ScSplitMode eOldV = aViewData.GetVSplitMode();
2246 
2247     ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT;
2248     if ( eOldV != SC_SPLIT_NONE )
2249         ePos = SC_SPLIT_TOPLEFT;
2250     Window* pWin = pGridWin[ePos];
2251 
2252     sal_Bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() );
2253 
2254     if ( bFreeze )
2255     {
2256         Point aWinStart = pWin->GetPosPixel();
2257 
2258         Point aSplit;
2259         SCsCOL nPosX;
2260         SCsROW nPosY;
2261         if (eOldH != SC_SPLIT_NONE || eOldV != SC_SPLIT_NONE)
2262         {
2263             if (eOldH != SC_SPLIT_NONE)
2264             {
2265                 long nSplitPos = aViewData.GetHSplitPos();
2266                 if ( bLayoutRTL )
2267                     nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1;
2268                 aSplit.X() = nSplitPos - aWinStart.X();
2269             }
2270             if (eOldV != SC_SPLIT_NONE)
2271                 aSplit.Y() = aViewData.GetVSplitPos() - aWinStart.Y();
2272 
2273             aViewData.GetPosFromPixel( aSplit.X(), aSplit.Y(), ePos, nPosX, nPosY );
2274             sal_Bool bLeft;
2275             sal_Bool bTop;
2276             aViewData.GetMouseQuadrant( aSplit, ePos, nPosX, nPosY, bLeft, bTop );
2277             if (!bLeft)
2278                 ++nPosX;
2279             if (!bTop)
2280                 ++nPosY;
2281         }
2282         else
2283         {
2284             nPosX = static_cast<SCsCOL>( aViewData.GetCurX());
2285             nPosY = static_cast<SCsROW>( aViewData.GetCurY());
2286         }
2287 
2288         SCCOL nLeftPos = aViewData.GetPosX(SC_SPLIT_LEFT);
2289         SCROW nTopPos = aViewData.GetPosY(SC_SPLIT_BOTTOM);
2290         SCCOL nRightPos = static_cast<SCCOL>(nPosX);
2291         SCROW nBottomPos = static_cast<SCROW>(nPosY);
2292         if (eOldH != SC_SPLIT_NONE)
2293             if (aViewData.GetPosX(SC_SPLIT_RIGHT) > nRightPos)
2294                 nRightPos = aViewData.GetPosX(SC_SPLIT_RIGHT);
2295         if (eOldV != SC_SPLIT_NONE)
2296         {
2297             nTopPos = aViewData.GetPosY(SC_SPLIT_TOP);
2298             if (aViewData.GetPosY(SC_SPLIT_BOTTOM) > nBottomPos)
2299                 nBottomPos = aViewData.GetPosY(SC_SPLIT_BOTTOM);
2300         }
2301 
2302         aSplit = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, sal_True );
2303         if (nPosX > aViewData.GetPosX(SC_SPLIT_LEFT))       // (aSplit.X() > 0) doesn't work for RTL
2304         {
2305             long nSplitPos = aSplit.X() + aWinStart.X();
2306             if ( bLayoutRTL )
2307                 nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1;
2308 
2309             aViewData.SetHSplitMode( SC_SPLIT_FIX );
2310             aViewData.SetHSplitPos( nSplitPos );
2311             aViewData.SetFixPosX( nPosX );
2312 
2313             aViewData.SetPosX(SC_SPLIT_LEFT, nLeftPos);
2314             aViewData.SetPosX(SC_SPLIT_RIGHT, nRightPos);
2315         }
2316         else
2317             aViewData.SetHSplitMode( SC_SPLIT_NONE );
2318         if (aSplit.Y() > 0)
2319         {
2320             aViewData.SetVSplitMode( SC_SPLIT_FIX );
2321             aViewData.SetVSplitPos( aSplit.Y() + aWinStart.Y() );
2322             aViewData.SetFixPosY( nPosY );
2323 
2324             aViewData.SetPosY(SC_SPLIT_TOP, nTopPos);
2325             aViewData.SetPosY(SC_SPLIT_BOTTOM, nBottomPos);
2326         }
2327         else
2328             aViewData.SetVSplitMode( SC_SPLIT_NONE );
2329     }
2330     else                        // Fixierung aufheben
2331     {
2332         if ( eOldH == SC_SPLIT_FIX )
2333             aViewData.SetHSplitMode( SC_SPLIT_NORMAL );
2334         if ( eOldV == SC_SPLIT_FIX )
2335             aViewData.SetVSplitMode( SC_SPLIT_NORMAL );
2336     }
2337 
2338     //  #61410# Form-Layer muss den sichtbaren Ausschnitt aller Fenster kennen
2339     //  dafuer muss hier schon der MapMode stimmen
2340     for (sal_uInt16 i=0; i<4; i++)
2341         if (pGridWin[i])
2342             pGridWin[i]->SetMapMode( pGridWin[i]->GetDrawMapMode() );
2343     SetNewVisArea();
2344 
2345     RepeatResize(sal_False);
2346 
2347     UpdateShow();
2348     PaintLeft();
2349     PaintTop();
2350     PaintGrid();
2351 
2352     //  SC_FOLLOW_NONE: only update active part
2353     AlignToCursor( aViewData.GetCurX(), aViewData.GetCurY(), SC_FOLLOW_NONE );
2354     UpdateAutoFillMark();
2355 
2356     InvalidateSplit();
2357 }
2358 
RemoveSplit()2359 void ScTabView::RemoveSplit()
2360 {
2361     DoHSplit( 0 );
2362     DoVSplit( 0 );
2363     RepeatResize();
2364 }
2365 
SplitAtCursor()2366 void ScTabView::SplitAtCursor()
2367 {
2368     ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT;
2369     if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE )
2370         ePos = SC_SPLIT_TOPLEFT;
2371     Window* pWin = pGridWin[ePos];
2372     Point aWinStart = pWin->GetPosPixel();
2373 
2374     SCCOL nPosX = aViewData.GetCurX();
2375     SCROW nPosY = aViewData.GetCurY();
2376     Point aSplit = aViewData.GetScrPos( nPosX, nPosY, ePos, sal_True );
2377     if ( nPosX > 0 )
2378         DoHSplit( aSplit.X() + aWinStart.X() );
2379     else
2380         DoHSplit( 0 );
2381     if ( nPosY > 0 )
2382         DoVSplit( aSplit.Y() + aWinStart.Y() );
2383     else
2384         DoVSplit( 0 );
2385     RepeatResize();
2386 }
2387 
SplitAtPixel(const Point & rPixel,sal_Bool bHor,sal_Bool bVer)2388 void ScTabView::SplitAtPixel( const Point& rPixel, sal_Bool bHor, sal_Bool bVer )       // fuer API
2389 {
2390     //  Pixel ist auf die ganze View bezogen, nicht auf das erste GridWin
2391 
2392     if (bHor)
2393     {
2394         if ( rPixel.X() > 0 )
2395             DoHSplit( rPixel.X() );
2396         else
2397             DoHSplit( 0 );
2398     }
2399     if (bVer)
2400     {
2401         if ( rPixel.Y() > 0 )
2402             DoVSplit( rPixel.Y() );
2403         else
2404             DoVSplit( 0 );
2405     }
2406     RepeatResize();
2407 }
2408 
InvalidateSplit()2409 void ScTabView::InvalidateSplit()
2410 {
2411     SfxBindings& rBindings = aViewData.GetBindings();
2412     rBindings.Invalidate( SID_WINDOW_SPLIT );
2413     rBindings.Invalidate( SID_WINDOW_FIX );
2414 
2415     pHSplitter->SetFixed( aViewData.GetHSplitMode() == SC_SPLIT_FIX );
2416     pVSplitter->SetFixed( aViewData.GetVSplitMode() == SC_SPLIT_FIX );
2417 }
2418 
SetNewVisArea()2419 void ScTabView::SetNewVisArea()
2420 {
2421     //  #63854# fuer die Controls muss bei VisAreaChanged der Draw-MapMode eingestellt sein
2422     //  (auch wenn ansonsten der Edit-MapMode gesetzt ist)
2423     MapMode aOldMode[4];
2424     MapMode aDrawMode[4];
2425     sal_uInt16 i;
2426     for (i=0; i<4; i++)
2427         if (pGridWin[i])
2428         {
2429             aOldMode[i] = pGridWin[i]->GetMapMode();
2430             aDrawMode[i] = pGridWin[i]->GetDrawMapMode();
2431             if (aDrawMode[i] != aOldMode[i])
2432                 pGridWin[i]->SetMapMode(aDrawMode[i]);
2433         }
2434 
2435     Window* pActive = pGridWin[aViewData.GetActivePart()];
2436     if (pActive)
2437         aViewData.GetViewShell()->VisAreaChanged(
2438             pActive->PixelToLogic(Rectangle(Point(),pActive->GetOutputSizePixel())) );
2439     if (pDrawView)
2440         pDrawView->VisAreaChanged();    // kein Window uebergeben -> alle Fenster
2441 
2442     UpdateAllOverlays();                // #i79909# with drawing MapMode set
2443 
2444     for (i=0; i<4; i++)
2445         if (pGridWin[i] && aDrawMode[i] != aOldMode[i])
2446         {
2447             pGridWin[i]->flushOverlayManager();     // #i79909# flush overlays before switching to edit MapMode
2448             pGridWin[i]->SetMapMode(aOldMode[i]);
2449         }
2450 
2451     SfxViewFrame* pViewFrame = aViewData.GetViewShell()->GetViewFrame();
2452     if (pViewFrame)
2453     {
2454         SfxFrame& rFrame = pViewFrame->GetFrame();
2455         com::sun::star::uno::Reference<com::sun::star::frame::XController> xController = rFrame.GetController();
2456         if (xController.is())
2457         {
2458             ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController );
2459             if (pImp)
2460                 pImp->VisAreaChanged();
2461         }
2462     }
2463     if (aViewData.GetViewShell()->HasAccessibilityObjects())
2464         aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_VISAREACHANGED));
2465 }
2466 
HasPageFieldDataAtCursor() const2467 sal_Bool ScTabView::HasPageFieldDataAtCursor() const
2468 {
2469     ScGridWindow* pWin = pGridWin[aViewData.GetActivePart()];
2470     SCCOL nCol = aViewData.GetCurX();
2471     SCROW nRow = aViewData.GetCurY();
2472     if (pWin)
2473         return pWin->GetDPFieldOrientation( nCol, nRow ) == sheet::DataPilotFieldOrientation_PAGE;
2474 
2475     return sal_False;
2476 }
2477 
StartDataSelect()2478 void ScTabView::StartDataSelect()
2479 {
2480     ScGridWindow* pWin = pGridWin[aViewData.GetActivePart()];
2481     SCCOL nCol = aViewData.GetCurX();
2482     SCROW nRow = aViewData.GetCurY();
2483 
2484     if (!pWin)
2485         return;
2486 
2487     switch (pWin->GetDPFieldOrientation(nCol, nRow))
2488     {
2489         case sheet::DataPilotFieldOrientation_PAGE:
2490             //  #i36598# If the cursor is on a page field's data cell,
2491             //  no meaningful input is possible anyway, so this function
2492             //  can be used to select a page field entry.
2493             pWin->LaunchPageFieldMenu( nCol, nRow );
2494         break;
2495         case sheet::DataPilotFieldOrientation_COLUMN:
2496         case sheet::DataPilotFieldOrientation_ROW:
2497             pWin->LaunchDPFieldMenu( nCol, nRow );
2498         break;
2499         default:
2500             pWin->DoAutoFilterMenue( nCol, nRow, sal_True );
2501     }
2502 }
2503 
EnableRefInput(sal_Bool bFlag)2504 void ScTabView::EnableRefInput(sal_Bool bFlag)
2505 {
2506     aHScrollLeft.EnableInput(bFlag);
2507     aHScrollRight.EnableInput(bFlag);
2508     aVScrollBottom.EnableInput(bFlag);
2509     aVScrollTop.EnableInput(bFlag);
2510     aScrollBarBox.EnableInput(bFlag);
2511 
2512     // ab hier dynamisch angelegte
2513 
2514     if(pTabControl!=NULL) pTabControl->EnableInput(bFlag,sal_True);
2515 
2516     if(pGridWin[SC_SPLIT_BOTTOMLEFT]!=NULL)
2517         pGridWin[SC_SPLIT_BOTTOMLEFT]->EnableInput(bFlag,sal_False);
2518     if(pGridWin[SC_SPLIT_BOTTOMRIGHT]!=NULL)
2519         pGridWin[SC_SPLIT_BOTTOMRIGHT]->EnableInput(bFlag,sal_False);
2520     if(pGridWin[SC_SPLIT_TOPLEFT]!=NULL)
2521         pGridWin[SC_SPLIT_TOPLEFT]->EnableInput(bFlag,sal_False);
2522     if(pGridWin[SC_SPLIT_TOPRIGHT]!=NULL)
2523         pGridWin[SC_SPLIT_TOPRIGHT]->EnableInput(bFlag,sal_False);
2524     if(pColBar[SC_SPLIT_RIGHT]!=NULL)
2525         pColBar[SC_SPLIT_RIGHT]->EnableInput(bFlag,sal_False);
2526     if(pRowBar[SC_SPLIT_TOP]!=NULL)
2527         pRowBar[SC_SPLIT_TOP]->EnableInput(bFlag,sal_False);
2528 }
2529 
2530 
2531 
2532