diff options
Diffstat (limited to 'sc/source/ui/view/tabview.cxx')
-rw-r--r-- | sc/source/ui/view/tabview.cxx | 2436 |
1 files changed, 0 insertions, 2436 deletions
diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx deleted file mode 100644 index 1ade00b91..000000000 --- a/sc/source/ui/view/tabview.cxx +++ /dev/null @@ -1,2436 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - -//------------------------------------------------------------------ -#include <vcl/svapp.hxx> - -/////////////////////////////////////////////////////////////////////////// -// NODRAW.HXX -// Erweiterte Konstanten, um CLOKs mit SVDRAW.HXX zu vermeiden -// Die u.a. Aenderungen nehmen vorgeschlagene Konstante vorweg -/////////////////////////////////////////////////////////////////////////// - -// Dieses define entfernt die VCControls aus SI.HXX - -#define _SI_HXX // VCControls - -////////////////////// Umsetzen der Standard-Defines ////////////////////// - -#define _SVDPAGE_HXX // SdrPage - -#ifdef _SDR_NOSURROGATEOBJ - #undef _SDR_NOSURROGATEOBJ - #define _SVDSURO_HXX -#endif - -#ifdef _SDR_NOPAGEOBJ - #undef _SDR_NOPAGEOBJ - #define _SVDOPAGE_HXX -#endif - -#ifdef _SDR_NOVIRTOBJ - #undef _SDR_NOVIRTOBJ - #define _SVDOVIRT_HXX -#endif - -#ifdef _SDR_NOGROUPOBJ - #undef _SDR_NOGROUPOBJ - #define _SVDOGRP_HXX -#endif - -#ifdef _SDR_NOTEXTOBJ - #undef _SDR_NOTEXTOBJ - #define _SVDOTEXT_HXX -#endif - -#ifdef _SDR_NOPATHOBJ - #undef _SDR_NOPATHOBJ - #define _SVDOPATH_HXX -#endif - -#ifdef _SDR_NOEDGEOBJ - #undef _SDR_NOEDGEOBJ - #define _SVDOEDGE_HXX -#endif - -#ifdef _SDR_NORECTOBJ - #undef _SDR_NORECTOBJ - #define _SVDORECT_HXX -#else - #undef _SDVOTEXT_OBJ -#endif - -#ifdef _SDR_NOCAPTIONOBJ - #undef _SDR_NOCAPTIONOBJ - #define _SVDCAPT_HXX -#endif - -#ifdef _SDR_NOCIRCLEOBJ - #undef _SDR_NOCIRCLEOBJ - #define _SVDOCIRC_HXX -#endif - -#ifdef _SDR_NOGRAFOBJ - #undef _SDR_NOGRAFOBJ - #define _SVDOGRAF_HXX -#else - #undef _SVDOTEXT_HXX - #undef _SVDORECT_HXX -#endif - -#ifdef _SDR_NOOLE2OBJ - #undef _SDR_NOOLE2OBJ - #define _SVDOOLE2_HXX -#else - #undef _SVDOTEXT_HXX - #undef _SVDORECT_HXX -#endif - -////////////////////// Ende der SVDRAW-Modifikationen ///////////////////// - -// INCLUDE --------------------------------------------------------------- - -#include "scitems.hxx" -#include <sfx2/viewfrm.hxx> -#include <sfx2/bindings.hxx> -#include <vcl/help.hxx> -#include <rtl/logfile.hxx> - -#include "tabview.hxx" -#include "tabvwsh.hxx" -#include "document.hxx" -#include "gridwin.hxx" -#include "olinewin.hxx" -#include "olinetab.hxx" -#include "tabsplit.hxx" -#include "colrowba.hxx" -#include "tabcont.hxx" -#include "scmod.hxx" -#include "sc.hrc" -#include "viewutil.hxx" -#include "globstr.hrc" -#include "drawview.hxx" -#include "docsh.hxx" -#include "viewuno.hxx" -#include "AccessibilityHints.hxx" -#include "appoptio.hxx" -#include "attrib.hxx" - -#include <com/sun/star/sheet/DataPilotFieldOrientation.hpp> - -#include <string> -#include <algorithm> - -#define SPLIT_MARGIN 30 -#define SC_ICONSIZE 36 - -#define SC_SCROLLBAR_MIN 30 -#define SC_TABBAR_MIN 6 - -// fuer Rad-Maus -#define SC_DELTA_ZOOM 10 - -using namespace ::com::sun::star; - -// STATIC DATA ----------------------------------------------------------- - - -//================================================================== - -// Corner-Button - -ScCornerButton::ScCornerButton( Window* pParent, ScViewData* pData, bool bAdditional ) : - Window( pParent, WinBits( 0 ) ), - pViewData( pData ), - bAdd( bAdditional ) -{ - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - SetBackground( rStyleSettings.GetFaceColor() ); - EnableRTL( false ); -} - -ScCornerButton::~ScCornerButton() -{ -} - -void ScCornerButton::Paint( const Rectangle& rRect ) -{ - Size aSize = GetOutputSizePixel(); - long nPosX = aSize.Width()-1; - long nPosY = aSize.Height()-1; - - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - Window::Paint(rRect); - - bool bLayoutRTL = pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() ); - long nDarkX = bLayoutRTL ? 0 : nPosX; - - if ( !bAdd ) - { - // match the shaded look of column/row headers - - Color aFace( rStyleSettings.GetFaceColor() ); - Color aWhite( COL_WHITE ); - Color aCenter( aFace ); - aCenter.Merge( aWhite, 0xd0 ); // lighten up a bit - Color aOuter( aFace ); - aOuter.Merge( aWhite, 0xa0 ); // lighten up more - - long nCenterX = (aSize.Width() / 2) - 1; - long nCenterY = (aSize.Height() / 2) - 1; - - SetLineColor(); - SetFillColor(aCenter); - DrawRect( Rectangle( nCenterX, nCenterY, nCenterX, nPosY ) ); - DrawRect( Rectangle( nCenterX, nCenterY, nDarkX, nCenterY ) ); - SetFillColor(aOuter); - DrawRect( Rectangle( 0, 0, nPosX, nCenterY-1 ) ); - if ( bLayoutRTL ) - DrawRect( Rectangle( nCenterX+1, nCenterY, nPosX, nPosY ) ); - else - DrawRect( Rectangle( 0, nCenterY, nCenterX-1, nPosY ) ); - } - - // both buttons have the same look now - only dark right/bottom lines - SetLineColor( rStyleSettings.GetDarkShadowColor() ); - DrawLine( Point(0,nPosY), Point(nPosX,nPosY) ); - DrawLine( Point(nDarkX,0), Point(nDarkX,nPosY) ); -} - -void ScCornerButton::StateChanged( StateChangedType nType ) -{ - Window::StateChanged( nType ); - - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - SetBackground( rStyleSettings.GetFaceColor() ); - Invalidate(); -} - -// ----------------------------------------------------------------------- - -void ScCornerButton::DataChanged( const DataChangedEvent& rDCEvt ) -{ - Window::DataChanged( rDCEvt ); - - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - SetBackground( rStyleSettings.GetFaceColor() ); - Invalidate(); -} - - -void ScCornerButton::Resize() -{ - Invalidate(); -} - -void ScCornerButton::MouseButtonDown( const MouseEvent& rMEvt ) -{ - ScModule* pScMod = SC_MOD(); - bool bDisable = pScMod->IsFormulaMode() || pScMod->IsModalMode(); - if (!bDisable) - { - ScTabViewShell* pViewSh = pViewData->GetViewShell(); - pViewSh->SetActive(); // Appear und SetViewFrame - pViewSh->ActiveGrabFocus(); - - bool bControl = rMEvt.IsMod1(); - pViewSh->SelectAll( bControl ); - } -} - -//================================================================== - -bool lcl_HasColOutline( const ScViewData& rViewData ) -{ - const ScOutlineTable* pTable = rViewData.GetDocument()->GetOutlineTable(rViewData.GetTabNo()); - if (pTable) - { - const ScOutlineArray* pArray = pTable->GetColArray(); - if ( pArray->GetDepth() > 0 ) - return true; - } - return false; -} - -bool lcl_HasRowOutline( const ScViewData& rViewData ) -{ - const ScOutlineTable* pTable = rViewData.GetDocument()->GetOutlineTable(rViewData.GetTabNo()); - if (pTable) - { - const ScOutlineArray* pArray = pTable->GetRowArray(); - if ( pArray->GetDepth() > 0 ) - return true; - } - return false; -} - -ScTabView::ScTabView( Window* pParent, ScDocShell& rDocSh, ScTabViewShell* pViewShell ) : - pFrameWin( pParent ), - aViewData( &rDocSh, pViewShell ), - pSelEngine( NULL ), - aFunctionSet( &aViewData ), - pHdrSelEng( NULL ), - aHdrFunc( &aViewData ), - pDrawView( NULL ), - aVScrollTop( pFrameWin, WinBits( WB_VSCROLL | WB_DRAG ) ), - aVScrollBottom( pFrameWin, WinBits( WB_VSCROLL | WB_DRAG ) ), - aHScrollLeft( pFrameWin, WinBits( WB_HSCROLL | WB_DRAG ) ), - aHScrollRight( pFrameWin, WinBits( WB_HSCROLL | WB_DRAG ) ), - aCornerButton( pFrameWin, &aViewData, false ), - aTopButton( pFrameWin, &aViewData, sal_True ), - aScrollBarBox( pFrameWin, WB_SIZEABLE ), - pInputHintWindow( NULL ), - pPageBreakData( NULL ), - pBrushDocument( NULL ), - pDrawBrushSet( NULL ), - pTimerWindow( NULL ), - nTipVisible( 0 ), - meBlockMode(None), - mfPendingTabBarWidth( -1.0 ), - bMinimized( false ), - bInUpdateHeader( false ), - bInActivatePart( false ), - bInZoomUpdate( false ), - bMoveIsShift( false ), - bDrawSelMode( false ), - bLockPaintBrush( false ), - bDragging( false ), - bBlockNeg( false ), - bBlockCols( false ), - bBlockRows( false ) -{ - RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScTabView::ScTabView" ); - - Init(); -} - - -void ScTabView::InitScrollBar( ScrollBar& rScrollBar, long nMaxVal ) -{ - rScrollBar.SetRange( Range( 0, nMaxVal ) ); - rScrollBar.SetLineSize( 1 ); - rScrollBar.SetPageSize( 1 ); // wird getrennt abgefragt - rScrollBar.SetVisibleSize( 10 ); // wird bei Resize neu gesetzt - - rScrollBar.SetScrollHdl( LINK(this, ScTabView, ScrollHdl) ); - rScrollBar.SetEndScrollHdl( LINK(this, ScTabView, EndScrollHdl) ); -} - -// Scroll-Timer - -void ScTabView::SetTimer( ScGridWindow* pWin, const MouseEvent& rMEvt ) -{ - pTimerWindow = pWin; - aTimerMEvt = rMEvt; - aScrollTimer.Start(); -} - -void ScTabView::ResetTimer() -{ - aScrollTimer.Stop(); - pTimerWindow = NULL; -} - -IMPL_LINK( ScTabView, TimerHdl, Timer*, EMPTYARG ) -{ - if (pTimerWindow) - pTimerWindow->MouseMove( aTimerMEvt ); - - return 0; -} - -// --- Resize --------------------------------------------------------------------- - -void lcl_SetPosSize( Window& rWindow, const Point& rPos, const Size& rSize, - long nTotalWidth, bool bLayoutRTL ) -{ - Point aNewPos = rPos; - if ( bLayoutRTL ) - { - aNewPos.X() = nTotalWidth - rPos.X() - rSize.Width(); - if ( aNewPos == rWindow.GetPosPixel() && rSize.Width() != rWindow.GetSizePixel().Width() ) - { - // Document windows are manually painted right-to-left, so they need to - // be repainted if the size changes. - rWindow.Invalidate(); - } - } - rWindow.SetPosSizePixel( aNewPos, rSize ); -} - -void ScTabView::DoResize( const Point& rOffset, const Size& rSize, bool bInner ) -{ - HideListBox(); - - bool bHasHint = ( pInputHintWindow != NULL ); - if (bHasHint) - RemoveHintWindow(); - - bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ); - long nTotalWidth = rSize.Width(); - if ( bLayoutRTL ) - nTotalWidth += 2*rOffset.X(); - - bool bVScroll = aViewData.IsVScrollMode(); - bool bHScroll = aViewData.IsHScrollMode(); - bool bTabControl = aViewData.IsTabMode(); - bool bHeaders = aViewData.IsHeaderMode(); - bool bOutlMode = aViewData.IsOutlineMode(); - bool bHOutline = bOutlMode && lcl_HasColOutline(aViewData); - bool bVOutline = bOutlMode && lcl_HasRowOutline(aViewData); - - // Scrollbar-Einstellungen koennen vom Sfx ueberschrieben werden: - SfxScrollingMode eMode = aViewData.GetViewShell()->GetScrollingMode(); - if ( eMode == SCROLLING_NO ) - bHScroll = bVScroll = false; - else if ( eMode == SCROLLING_YES || eMode == SCROLLING_AUTO ) //! Auto ??? - bHScroll = bVScroll = true; - - if ( aViewData.GetDocShell()->IsPreview() ) - bHScroll = bVScroll = bTabControl = bHeaders = bOutlMode = bHOutline = bVOutline = false; - - long nBarX = 0; - long nBarY = 0; - long nOutlineX = 0; - long nOutlineY = 0; - long nOutPosX; - long nOutPosY; - - long nPosX = rOffset.X(); - long nPosY = rOffset.Y(); - long nSizeX = rSize.Width(); - long nSizeY = rSize.Height(); - - bMinimized = ( nSizeX<=SC_ICONSIZE || nSizeY<=SC_ICONSIZE ); - if ( bMinimized ) - return; - - long nSplitSizeX = SPLIT_HANDLE_SIZE; - if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX ) - nSplitSizeX = 1; - long nSplitSizeY = SPLIT_HANDLE_SIZE; - if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX ) - nSplitSizeY = 1; - - const long nOverlap = 0; // ScrollBar::GetWindowOverlapPixel(); - - aBorderPos = rOffset; - aFrameSize = rSize; - - if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE ) - if ( aViewData.GetHSplitPos() > nSizeX - SPLIT_MARGIN ) - { - aViewData.SetHSplitMode( SC_SPLIT_NONE ); - if ( WhichH( aViewData.GetActivePart() ) == SC_SPLIT_RIGHT ) - ActivatePart( SC_SPLIT_BOTTOMLEFT ); - InvalidateSplit(); - } - if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - if ( aViewData.GetVSplitPos() > nSizeY - SPLIT_MARGIN ) - { - aViewData.SetVSplitMode( SC_SPLIT_NONE ); - if ( WhichV( aViewData.GetActivePart() ) == SC_SPLIT_TOP ) - ActivatePart( SC_SPLIT_BOTTOMLEFT ); - InvalidateSplit(); - } - - UpdateShow(); - - if (bHScroll || bVScroll) // Scrollbars horizontal oder vertikal - { - long nScrollBarSize = pFrameWin->GetSettings().GetStyleSettings().GetScrollBarSize(); - if (bVScroll) - { - nBarX = nScrollBarSize; - nSizeX -= nBarX - nOverlap; - } - if (bHScroll) - { - nBarY = nScrollBarSize; - nSizeY -= nBarY - nOverlap; - } - - // window at the bottom right - lcl_SetPosSize( aScrollBarBox, Point( nPosX+nSizeX, nPosY+nSizeY ), Size( nBarX, nBarY ), - nTotalWidth, bLayoutRTL ); - - if (bHScroll) // Scrollbars horizontal - { - long nSizeLt = 0; // left scroll bar - long nSizeRt = 0; // right scroll bar - long nSizeSp = 0; // splitter - - switch (aViewData.GetHSplitMode()) - { - case SC_SPLIT_NONE: - nSizeSp = nSplitSizeX; - nSizeLt = nSizeX - nSizeSp + nOverlap; // Ecke ueberdecken - break; - case SC_SPLIT_NORMAL: - nSizeSp = nSplitSizeX; - nSizeLt = aViewData.GetHSplitPos(); - break; - case SC_SPLIT_FIX: - nSizeSp = 0; - nSizeLt = 0; - break; - } - nSizeRt = nSizeX - nSizeLt - nSizeSp; - - long nTabSize = 0; - if (bTabControl) - { - // pending relative tab bar width from extended document options - if( mfPendingTabBarWidth >= 0.0 ) - { - SetRelTabBarWidth( mfPendingTabBarWidth ); - mfPendingTabBarWidth = -1.0; - } - - nTabSize = pTabControl->GetSizePixel().Width()-nOverlap; - - if ( aViewData.GetHSplitMode() != SC_SPLIT_FIX ) // bei linkem Scrollbar - { - if (nTabSize > nSizeLt-SC_SCROLLBAR_MIN) nTabSize = nSizeLt-SC_SCROLLBAR_MIN; - if (nTabSize < SC_TABBAR_MIN) nTabSize = SC_TABBAR_MIN; - nSizeLt -= nTabSize; - } - else // bei rechtem Scrollbar - { - if (nTabSize > nSizeRt-SC_SCROLLBAR_MIN) nTabSize = nSizeRt-SC_SCROLLBAR_MIN; - if (nTabSize < SC_TABBAR_MIN) nTabSize = SC_TABBAR_MIN; - nSizeRt -= nTabSize; - } - } - - lcl_SetPosSize( *pTabControl, Point(nPosX-nOverlap, nPosY+nSizeY), - Size(nTabSize+nOverlap, nBarY), nTotalWidth, bLayoutRTL ); - pTabControl->SetSheetLayoutRTL( bLayoutRTL ); - - lcl_SetPosSize( aHScrollLeft, Point(nPosX+nTabSize-nOverlap, nPosY+nSizeY), - Size(nSizeLt+2*nOverlap, nBarY), nTotalWidth, bLayoutRTL ); - lcl_SetPosSize( *pHSplitter, Point( nPosX+nTabSize+nSizeLt, nPosY+nSizeY ), - Size( nSizeSp, nBarY ), nTotalWidth, bLayoutRTL ); - lcl_SetPosSize( aHScrollRight, Point(nPosX+nTabSize+nSizeLt+nSizeSp-nOverlap, - nPosY+nSizeY), - Size(nSizeRt+2*nOverlap, nBarY), nTotalWidth, bLayoutRTL ); - - // SetDragRectPixel is done below - } - - if (bVScroll) // Scrollbars vertikal - { - long nSizeUp = 0; // upper scroll bar - long nSizeSp = 0; // splitter - long nSizeDn; // unterer Scrollbar - - switch (aViewData.GetVSplitMode()) - { - case SC_SPLIT_NONE: - nSizeUp = 0; - nSizeSp = nSplitSizeY; - break; - case SC_SPLIT_NORMAL: - nSizeUp = aViewData.GetVSplitPos(); - nSizeSp = nSplitSizeY; - break; - case SC_SPLIT_FIX: - nSizeUp = 0; - nSizeSp = 0; - break; - } - nSizeDn = nSizeY - nSizeUp - nSizeSp; - - lcl_SetPosSize( aVScrollTop, Point(nPosX+nSizeX, nPosY-nOverlap), - Size(nBarX,nSizeUp+2*nOverlap), nTotalWidth, bLayoutRTL ); - lcl_SetPosSize( *pVSplitter, Point( nPosX+nSizeX, nPosY+nSizeUp ), - Size( nBarX, nSizeSp ), nTotalWidth, bLayoutRTL ); - lcl_SetPosSize( aVScrollBottom, Point(nPosX+nSizeX, - nPosY+nSizeUp+nSizeSp-nOverlap), - Size(nBarX, nSizeDn+2*nOverlap), nTotalWidth, bLayoutRTL ); - - // SetDragRectPixel is done below - } - } - - // SetDragRectPixel auch ohne Scrollbars etc., wenn schon gesplittet ist - if ( bHScroll || aViewData.GetHSplitMode() != SC_SPLIT_NONE ) - pHSplitter->SetDragRectPixel( - Rectangle( nPosX, nPosY, nPosX+nSizeX, nPosY+nSizeY ), pFrameWin ); - if ( bVScroll || aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - pVSplitter->SetDragRectPixel( - Rectangle( nPosX, nPosY, nPosX+nSizeX, nPosY+nSizeY ), pFrameWin ); - - if (bTabControl && ! bHScroll ) - { - nBarY = aHScrollLeft.GetSizePixel().Height(); - nBarX = aVScrollBottom.GetSizePixel().Width(); - - long nSize1 = nSizeX + nOverlap; - - long nTabSize = nSize1; - if (nTabSize < 0) nTabSize = 0; - - lcl_SetPosSize( *pTabControl, Point(nPosX-nOverlap, nPosY+nSizeY-nBarY), - Size(nTabSize+nOverlap, nBarY), nTotalWidth, bLayoutRTL ); - nSizeY -= nBarY - nOverlap; - lcl_SetPosSize( aScrollBarBox, Point( nPosX+nSizeX, nPosY+nSizeY ), Size( nBarX, nBarY ), - nTotalWidth, bLayoutRTL ); - - if( bVScroll ) - { - Size aVScrSize = aVScrollBottom.GetSizePixel(); - aVScrSize.Height() -= nBarY; - aVScrollBottom.SetSizePixel( aVScrSize ); - } - } - - nOutPosX = nPosX; - nOutPosY = nPosY; - - // Outline-Controls - if (bVOutline && pRowOutline[SC_SPLIT_BOTTOM]) - { - nOutlineX = pRowOutline[SC_SPLIT_BOTTOM]->GetDepthSize(); - nSizeX -= nOutlineX; - nPosX += nOutlineX; - } - if (bHOutline && pColOutline[SC_SPLIT_LEFT]) - { - nOutlineY = pColOutline[SC_SPLIT_LEFT]->GetDepthSize(); - nSizeY -= nOutlineY; - nPosY += nOutlineY; - } - - if (bHeaders) // Spalten/Zeilen-Header - { - nBarX = pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width(); - nBarY = pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height(); - nSizeX -= nBarX; - nSizeY -= nBarY; - nPosX += nBarX; - nPosY += nBarY; - } - else - nBarX = nBarY = 0; - - // - // Splitter auswerten - // - - long nLeftSize = nSizeX; - long nRightSize = 0; - long nTopSize = 0; - long nBottomSize = nSizeY; - long nSplitPosX = nPosX; - long nSplitPosY = nPosY; - - if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE ) - { - long nSplitHeight = rSize.Height(); - if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX ) - { - // Fixier-Splitter nicht mit Scrollbar/TabBar ueberlappen lassen - if ( bHScroll ) - nSplitHeight -= aHScrollLeft.GetSizePixel().Height(); - else if ( bTabControl && pTabControl ) - nSplitHeight -= pTabControl->GetSizePixel().Height(); - } - nSplitPosX = aViewData.GetHSplitPos(); - lcl_SetPosSize( *pHSplitter, - Point( nSplitPosX, nOutPosY ), Size( nSplitSizeX, nSplitHeight ), nTotalWidth, bLayoutRTL ); - nLeftSize = nSplitPosX - nPosX; - nSplitPosX += nSplitSizeX; - nRightSize = nSizeX - nLeftSize - nSplitSizeX; - } - if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - { - long nSplitWidth = rSize.Width(); - if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX && bVScroll ) - nSplitWidth -= aVScrollBottom.GetSizePixel().Width(); - nSplitPosY = aViewData.GetVSplitPos(); - lcl_SetPosSize( *pVSplitter, - Point( nOutPosX, nSplitPosY ), Size( nSplitWidth, nSplitSizeY ), nTotalWidth, bLayoutRTL ); - nTopSize = nSplitPosY - nPosY; - nSplitPosY += nSplitSizeY; - nBottomSize = nSizeY - nTopSize - nSplitSizeY; - } - - // ShowHide fuer pColOutline / pRowOutline passiert in UpdateShow - - if (bHOutline) // Outline-Controls - { - if (pColOutline[SC_SPLIT_LEFT]) - { - pColOutline[SC_SPLIT_LEFT]->SetHeaderSize( nBarX ); - lcl_SetPosSize( *pColOutline[SC_SPLIT_LEFT], - Point(nPosX-nBarX,nOutPosY), Size(nLeftSize+nBarX,nOutlineY), nTotalWidth, bLayoutRTL ); - } - if (pColOutline[SC_SPLIT_RIGHT]) - { - pColOutline[SC_SPLIT_RIGHT]->SetHeaderSize( 0 ); // always call to update RTL flag - lcl_SetPosSize( *pColOutline[SC_SPLIT_RIGHT], - Point(nSplitPosX,nOutPosY), Size(nRightSize,nOutlineY), nTotalWidth, bLayoutRTL ); - } - } - if (bVOutline) - { - if (nTopSize) - { - if (pRowOutline[SC_SPLIT_TOP] && pRowOutline[SC_SPLIT_BOTTOM]) - { - pRowOutline[SC_SPLIT_TOP]->SetHeaderSize( nBarY ); - lcl_SetPosSize( *pRowOutline[SC_SPLIT_TOP], - Point(nOutPosX,nPosY-nBarY), Size(nOutlineX,nTopSize+nBarY), nTotalWidth, bLayoutRTL ); - pRowOutline[SC_SPLIT_BOTTOM]->SetHeaderSize( 0 ); - lcl_SetPosSize( *pRowOutline[SC_SPLIT_BOTTOM], - Point(nOutPosX,nSplitPosY), Size(nOutlineX,nBottomSize), nTotalWidth, bLayoutRTL ); - } - } - else if (pRowOutline[SC_SPLIT_BOTTOM]) - { - pRowOutline[SC_SPLIT_BOTTOM]->SetHeaderSize( nBarY ); - lcl_SetPosSize( *pRowOutline[SC_SPLIT_BOTTOM], - Point(nOutPosX,nSplitPosY-nBarY), Size(nOutlineX,nBottomSize+nBarY), nTotalWidth, bLayoutRTL ); - } - } - if (bHOutline && bVOutline) - { - lcl_SetPosSize( aTopButton, Point(nOutPosX,nOutPosY), Size(nOutlineX,nOutlineY), nTotalWidth, bLayoutRTL ); - aTopButton.Show(); - } - else - aTopButton.Hide(); - - if (bHeaders) // Spalten/Zeilen-Header - { - lcl_SetPosSize( *pColBar[SC_SPLIT_LEFT], - Point(nPosX,nPosY-nBarY), Size(nLeftSize,nBarY), nTotalWidth, bLayoutRTL ); - if (pColBar[SC_SPLIT_RIGHT]) - lcl_SetPosSize( *pColBar[SC_SPLIT_RIGHT], - Point(nSplitPosX,nPosY-nBarY), Size(nRightSize,nBarY), nTotalWidth, bLayoutRTL ); - - if (pRowBar[SC_SPLIT_TOP]) - lcl_SetPosSize( *pRowBar[SC_SPLIT_TOP], - Point(nPosX-nBarX,nPosY), Size(nBarX,nTopSize), nTotalWidth, bLayoutRTL ); - lcl_SetPosSize( *pRowBar[SC_SPLIT_BOTTOM], - Point(nPosX-nBarX,nSplitPosY), Size(nBarX,nBottomSize), nTotalWidth, bLayoutRTL ); - - lcl_SetPosSize( aCornerButton, Point(nPosX-nBarX,nPosY-nBarY), Size(nBarX,nBarY), nTotalWidth, bLayoutRTL ); - aCornerButton.Show(); - pColBar[SC_SPLIT_LEFT]->Show(); - pRowBar[SC_SPLIT_BOTTOM]->Show(); - } - else - { - aCornerButton.Hide(); - pColBar[SC_SPLIT_LEFT]->Hide(); // immer da - pRowBar[SC_SPLIT_BOTTOM]->Hide(); - } - - - // Grid-Windows - - if (bInner) - { - long nInnerPosX = bLayoutRTL ? ( nTotalWidth - nPosX - nLeftSize ) : nPosX; - pGridWin[SC_SPLIT_BOTTOMLEFT]->SetPosPixel( Point(nInnerPosX,nSplitPosY) ); - } - else - { - lcl_SetPosSize( *pGridWin[SC_SPLIT_BOTTOMLEFT], - Point(nPosX,nSplitPosY), Size(nLeftSize,nBottomSize), nTotalWidth, bLayoutRTL ); - if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE ) - lcl_SetPosSize( *pGridWin[SC_SPLIT_BOTTOMRIGHT], - Point(nSplitPosX,nSplitPosY), Size(nRightSize,nBottomSize), nTotalWidth, bLayoutRTL ); - if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - lcl_SetPosSize( *pGridWin[SC_SPLIT_TOPLEFT], - Point(nPosX,nPosY), Size(nLeftSize,nTopSize), nTotalWidth, bLayoutRTL ); - if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE && aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - lcl_SetPosSize( *pGridWin[SC_SPLIT_TOPRIGHT], - Point(nSplitPosX,nPosY), Size(nRightSize,nTopSize), nTotalWidth, bLayoutRTL ); - } - - // - // Scrollbars updaten - // - - if (!bInUpdateHeader) - { - UpdateScrollBars(); // Scrollbars nicht beim Scrollen neu setzen - UpdateHeaderWidth(); - - InterpretVisible(); // have everything calculated before painting - } - - if (bHasHint) - TestHintWindow(); // neu positionieren - - UpdateVarZoom(); // update variable zoom types (after resizing GridWindows) - - if (aViewData.GetViewShell()->HasAccessibilityObjects()) - aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_WINDOWRESIZED)); -} - -void ScTabView::UpdateVarZoom() -{ - // update variable zoom types - - SvxZoomType eZoomType = GetZoomType(); - if ( eZoomType != SVX_ZOOM_PERCENT && !bInZoomUpdate ) - { - bInZoomUpdate = true; - const Fraction& rOldX = GetViewData()->GetZoomX(); - const Fraction& rOldY = GetViewData()->GetZoomY(); - long nOldPercent = ( rOldY.GetNumerator() * 100 ) / rOldY.GetDenominator(); - sal_uInt16 nNewZoom = CalcZoom( eZoomType, (sal_uInt16)nOldPercent ); - Fraction aNew( nNewZoom, 100 ); - - if ( aNew != rOldX || aNew != rOldY ) - { - SetZoom( aNew, aNew, false ); // always separately per sheet - PaintGrid(); - PaintTop(); - PaintLeft(); - aViewData.GetViewShell()->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM ); - aViewData.GetViewShell()->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); - } - bInZoomUpdate = false; - } -} - -void ScTabView::UpdateFixPos() -{ - bool bResize = false; - if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX ) - if (aViewData.UpdateFixX()) - bResize = true; - if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX ) - if (aViewData.UpdateFixY()) - bResize = true; - if (bResize) - RepeatResize(false); -} - -void ScTabView::RepeatResize( bool bUpdateFix ) -{ - if ( bUpdateFix ) - { - ScSplitMode eHSplit = aViewData.GetHSplitMode(); - ScSplitMode eVSplit = aViewData.GetVSplitMode(); - - // #i46796# UpdateFixX / UpdateFixY uses GetGridOffset, which requires the - // outline windows to be available. So UpdateShow has to be called before - // (also called from DoResize). - if ( eHSplit == SC_SPLIT_FIX || eVSplit == SC_SPLIT_FIX ) - UpdateShow(); - - if ( eHSplit == SC_SPLIT_FIX ) - aViewData.UpdateFixX(); - if ( eVSplit == SC_SPLIT_FIX ) - aViewData.UpdateFixY(); - } - - DoResize( aBorderPos, aFrameSize ); - - //! Border muss neu gesetzt werden ??? -} - -void ScTabView::GetBorderSize( SvBorder& rBorder, const Size& /* rSize */ ) -{ - sal_Bool bScrollBars = aViewData.IsVScrollMode(); - sal_Bool bHeaders = aViewData.IsHeaderMode(); - sal_Bool bOutlMode = aViewData.IsOutlineMode(); - sal_Bool bHOutline = bOutlMode && lcl_HasColOutline(aViewData); - sal_Bool bVOutline = bOutlMode && lcl_HasRowOutline(aViewData); - sal_Bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ); - - rBorder = SvBorder(); - - if (bScrollBars) // Scrollbars horizontal oder vertikal - { - rBorder.Right() += aVScrollBottom.GetSizePixel().Width(); - rBorder.Bottom() += aHScrollLeft.GetSizePixel().Height(); - } - - // Outline-Controls - if (bVOutline && pRowOutline[SC_SPLIT_BOTTOM]) - rBorder.Left() += pRowOutline[SC_SPLIT_BOTTOM]->GetDepthSize(); - if (bHOutline && pColOutline[SC_SPLIT_LEFT]) - rBorder.Top() += pColOutline[SC_SPLIT_LEFT]->GetDepthSize(); - - if (bHeaders) // Spalten/Zeilen-Header - { - rBorder.Left() += pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width(); - rBorder.Top() += pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height(); - } - - if ( bLayoutRTL ) - ::std::swap( rBorder.Left(), rBorder.Right() ); -} - -IMPL_LINK( ScTabView, TabBarResize, void*, EMPTYARG ) -{ - sal_Bool bHScrollMode = aViewData.IsHScrollMode(); - - // Scrollbar-Einstellungen koennen vom Sfx ueberschrieben werden: - SfxScrollingMode eMode = aViewData.GetViewShell()->GetScrollingMode(); - if ( eMode == SCROLLING_NO ) - bHScrollMode = false; - else if ( eMode == SCROLLING_YES || eMode == SCROLLING_AUTO ) //! Auto ??? - bHScrollMode = sal_True; - - if( bHScrollMode ) - { - const long nOverlap = 0; // ScrollBar::GetWindowOverlapPixel(); - long nSize = pTabControl->GetSplitSize(); - - if (aViewData.GetHSplitMode() != SC_SPLIT_FIX) - { - long nMax = pHSplitter->GetPosPixel().X(); - if( pTabControl->IsEffectiveRTL() ) - nMax = pFrameWin->GetSizePixel().Width() - nMax; - --nMax; - if (nSize>nMax) nSize = nMax; - } - - if ( nSize != pTabControl->GetSizePixel().Width() ) - { - pTabControl->SetSizePixel( Size( nSize+nOverlap, - pTabControl->GetSizePixel().Height() ) ); - RepeatResize(); - } - } - - return 0; -} - -void ScTabView::SetTabBarWidth( long nNewWidth ) -{ - Size aSize = pTabControl->GetSizePixel(); - - if ( aSize.Width() != nNewWidth ) - { - aSize.Width() = nNewWidth; - pTabControl->SetSizePixel( aSize ); - } -} - -void ScTabView::SetRelTabBarWidth( double fRelTabBarWidth ) -{ - if( (0.0 <= fRelTabBarWidth) && (fRelTabBarWidth <= 1.0) ) - if( long nFrameWidth = pFrameWin->GetSizePixel().Width() ) - SetTabBarWidth( static_cast< long >( fRelTabBarWidth * nFrameWidth + 0.5 ) ); -} - -void ScTabView::SetPendingRelTabBarWidth( double fRelTabBarWidth ) -{ - mfPendingTabBarWidth = fRelTabBarWidth; - SetRelTabBarWidth( fRelTabBarWidth ); -} - -long ScTabView::GetTabBarWidth() const -{ - return pTabControl->GetSizePixel().Width(); -} - -double ScTabView::GetRelTabBarWidth() const -{ - if( long nFrameWidth = pFrameWin->GetSizePixel().Width() ) - return static_cast< double >( GetTabBarWidth() ) / nFrameWidth; - return 0.0; -} - -double ScTabView::GetPendingRelTabBarWidth() const -{ - return mfPendingTabBarWidth; -} - -Window* ScTabView::GetActiveWin() -{ - ScSplitPos ePos = aViewData.GetActivePart(); - OSL_ENSURE(pGridWin[ePos],"kein aktives Fenster"); - return pGridWin[ePos]; -} - -Window* ScTabView::GetWindowByPos( ScSplitPos ePos ) -{ - return pGridWin[ePos]; -} - -void ScTabView::SetActivePointer( const Pointer& rPointer ) -{ - for (sal_uInt16 i=0; i<4; i++) - if (pGridWin[i]) - pGridWin[i]->SetPointer( rPointer ); -} - - -void ScTabView::ActiveGrabFocus() -{ - ScSplitPos ePos = aViewData.GetActivePart(); - if (pGridWin[ePos]) - pGridWin[ePos]->GrabFocus(); -} - - -ScSplitPos ScTabView::FindWindow( Window* pWindow ) const -{ - ScSplitPos eVal = SC_SPLIT_BOTTOMLEFT; // Default - for (sal_uInt16 i=0; i<4; i++) - if ( pGridWin[i] == pWindow ) - eVal = (ScSplitPos) i; - - return eVal; -} - -Point ScTabView::GetGridOffset() const -{ - Point aPos; - - // Groessen hier wie in DoResize - - sal_Bool bHeaders = aViewData.IsHeaderMode(); - sal_Bool bOutlMode = aViewData.IsOutlineMode(); - sal_Bool bHOutline = bOutlMode && lcl_HasColOutline(aViewData); - sal_Bool bVOutline = bOutlMode && lcl_HasRowOutline(aViewData); - - // Outline-Controls - if (bVOutline && pRowOutline[SC_SPLIT_BOTTOM]) - aPos.X() += pRowOutline[SC_SPLIT_BOTTOM]->GetDepthSize(); - if (bHOutline && pColOutline[SC_SPLIT_LEFT]) - aPos.Y() += pColOutline[SC_SPLIT_LEFT]->GetDepthSize(); - - if (bHeaders) // Spalten/Zeilen-Header - { - if (pRowBar[SC_SPLIT_BOTTOM]) - aPos.X() += pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width(); - if (pColBar[SC_SPLIT_LEFT]) - aPos.Y() += pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height(); - } - - return aPos; -} - -// --- Scroll-Bars -------------------------------------------------------- - -bool ScTabView::ScrollCommand( const CommandEvent& rCEvt, ScSplitPos ePos ) -{ - HideNoteMarker(); - - bool bDone = false; - const CommandWheelData* pData = rCEvt.GetWheelData(); - if ( pData && pData->GetMode() == COMMAND_WHEEL_ZOOM ) - { - if ( !aViewData.GetViewShell()->GetViewFrame()->GetFrame().IsInPlace() ) - { - // for ole inplace editing, the scale is defined by the visarea and client size - // and can't be changed directly - - const Fraction& rOldY = aViewData.GetZoomY(); - long nOld = (long)(( rOldY.GetNumerator() * 100 ) / rOldY.GetDenominator()); - long nNew = nOld; - if ( pData->GetDelta() < 0 ) - nNew = Max( (long) MINZOOM, (long)( nOld - SC_DELTA_ZOOM ) ); - else - nNew = Min( (long) MAXZOOM, (long)( nOld + SC_DELTA_ZOOM ) ); - - if ( nNew != nOld ) - { - // scroll wheel doesn't set the AppOptions default - - sal_Bool bSyncZoom = SC_MOD()->GetAppOptions().GetSynchronizeZoom(); - SetZoomType( SVX_ZOOM_PERCENT, bSyncZoom ); - Fraction aFract( nNew, 100 ); - SetZoom( aFract, aFract, bSyncZoom ); - PaintGrid(); - PaintTop(); - PaintLeft(); - aViewData.GetBindings().Invalidate( SID_ATTR_ZOOM ); - aViewData.GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); - } - - bDone = true; - } - } - else - { - ScHSplitPos eHPos = WhichH(ePos); - ScVSplitPos eVPos = WhichV(ePos); - ScrollBar* pHScroll = ( eHPos == SC_SPLIT_LEFT ) ? &aHScrollLeft : &aHScrollRight; - ScrollBar* pVScroll = ( eVPos == SC_SPLIT_TOP ) ? &aVScrollTop : &aVScrollBottom; - if ( pGridWin[ePos] ) - bDone = pGridWin[ePos]->HandleScrollCommand( rCEvt, pHScroll, pVScroll ); - } - return bDone; -} - -IMPL_LINK( ScTabView, EndScrollHdl, ScrollBar*, pScroll ) -{ - sal_Bool bOnlineScroll = sal_True; //! Optionen - - if ( bDragging ) - { - if ( bOnlineScroll ) // nur Ranges aktualisieren - UpdateScrollBars(); - else - { - long nScrollMin = 0; // RangeMin simulieren - if ( aViewData.GetHSplitMode()==SC_SPLIT_FIX && pScroll == &aHScrollRight ) - nScrollMin = aViewData.GetFixPosX(); - if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == &aVScrollBottom ) - nScrollMin = aViewData.GetFixPosY(); - - if ( pScroll == &aHScrollLeft || pScroll == &aHScrollRight ) - { - sal_Bool bMirror = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ) != Application::GetSettings().GetLayoutRTL(); - ScHSplitPos eWhich = (pScroll == &aHScrollLeft) ? SC_SPLIT_LEFT : SC_SPLIT_RIGHT; - long nDelta = GetScrollBarPos( *pScroll, bMirror ) + nScrollMin - aViewData.GetPosX(eWhich); - if (nDelta) ScrollX( nDelta, eWhich ); - } - else // VScroll... - { - ScVSplitPos eWhich = (pScroll == &aVScrollTop) ? SC_SPLIT_TOP : SC_SPLIT_BOTTOM; - long nDelta = GetScrollBarPos( *pScroll, false ) + nScrollMin - aViewData.GetPosY(eWhich); - if (nDelta) ScrollY( nDelta, eWhich ); - } - } - bDragging = false; - } - return 0; -} - -IMPL_LINK( ScTabView, ScrollHdl, ScrollBar*, pScroll ) -{ - sal_Bool bOnlineScroll = sal_True; //! Optionen - - sal_Bool bHoriz = ( pScroll == &aHScrollLeft || pScroll == &aHScrollRight ); - long nViewPos; - if ( bHoriz ) - nViewPos = aViewData.GetPosX( (pScroll == &aHScrollLeft) ? - SC_SPLIT_LEFT : SC_SPLIT_RIGHT ); - else - nViewPos = aViewData.GetPosY( (pScroll == &aVScrollTop) ? - SC_SPLIT_TOP : SC_SPLIT_BOTTOM ); - - sal_Bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ); - sal_Bool bMirror = bHoriz && (bLayoutRTL != Application::GetSettings().GetLayoutRTL()); - - ScrollType eType = pScroll->GetType(); - if ( eType == SCROLL_DRAG ) - { - if (!bDragging) - { - bDragging = true; - nPrevDragPos = nViewPos; - } - - // Scroll-Position anzeigen - // (nur QuickHelp, in der Statuszeile gibt es keinen Eintrag dafuer) - - if (Help::IsQuickHelpEnabled()) - { - Size aSize = pScroll->GetSizePixel(); - - /* Convert scrollbar mouse position to screen position. If RTL - mode of scrollbar differs from RTL mode of its parent, then the - direct call to Window::OutputToNormalizedScreenPixel() will - give unusable results, because calcualtion of screen position - is based on parent orientation and expects equal orientation of - the child position. Need to mirror mouse position before. */ - Point aMousePos = pScroll->GetPointerPosPixel(); - if( pScroll->IsRTLEnabled() != pScroll->GetParent()->IsRTLEnabled() ) - aMousePos.X() = aSize.Width() - aMousePos.X() - 1; - aMousePos = pScroll->OutputToNormalizedScreenPixel( aMousePos ); - - // convert top-left position of scrollbar to screen position - Point aPos = pScroll->OutputToNormalizedScreenPixel( Point() ); - - // get scrollbar scroll position for help text (row number/column name) - long nScrollMin = 0; // RangeMin simulieren - if ( aViewData.GetHSplitMode()==SC_SPLIT_FIX && pScroll == &aHScrollRight ) - nScrollMin = aViewData.GetFixPosX(); - if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == &aVScrollBottom ) - nScrollMin = aViewData.GetFixPosY(); - long nScrollPos = GetScrollBarPos( *pScroll, bMirror ) + nScrollMin; - - String aHelpStr; - Rectangle aRect; - sal_uInt16 nAlign; - if (bHoriz) - { - aHelpStr = ScGlobal::GetRscString(STR_COLUMN); - aHelpStr += ' '; - aHelpStr += ScColToAlpha((SCCOL) nScrollPos); - - aRect.Left() = aMousePos.X(); - aRect.Top() = aPos.Y() - 4; - nAlign = QUICKHELP_BOTTOM|QUICKHELP_CENTER; - } - else - { - aHelpStr = ScGlobal::GetRscString(STR_ROW); - aHelpStr += ' '; - aHelpStr += String::CreateFromInt32(nScrollPos + 1); - - // show quicktext always inside sheet area - aRect.Left() = bLayoutRTL ? (aPos.X() + aSize.Width() + 8) : (aPos.X() - 8); - aRect.Top() = aMousePos.Y(); - nAlign = (bLayoutRTL ? QUICKHELP_LEFT : QUICKHELP_RIGHT) | QUICKHELP_VCENTER; - } - aRect.Right() = aRect.Left(); - aRect.Bottom() = aRect.Top(); - - Help::ShowQuickHelp(pScroll->GetParent(), aRect, aHelpStr, nAlign); - } - } - - if ( bOnlineScroll || eType != SCROLL_DRAG ) - { - if ( bMirror ) - { - // change scroll type so visible/previous cells calculation below remains the same - switch ( eType ) - { - case SCROLL_LINEUP: eType = SCROLL_LINEDOWN; break; - case SCROLL_LINEDOWN: eType = SCROLL_LINEUP; break; - case SCROLL_PAGEUP: eType = SCROLL_PAGEDOWN; break; - case SCROLL_PAGEDOWN: eType = SCROLL_PAGEUP; break; - default: - { - // added to avoid warnings - } - } - } - long nDelta = pScroll->GetDelta(); - switch ( eType ) - { - case SCROLL_LINEUP: - nDelta = -1; - break; - case SCROLL_LINEDOWN: - nDelta = 1; - break; - case SCROLL_PAGEUP: - if ( pScroll == &aHScrollLeft ) nDelta = -(long) aViewData.PrevCellsX( SC_SPLIT_LEFT ); - if ( pScroll == &aHScrollRight ) nDelta = -(long) aViewData.PrevCellsX( SC_SPLIT_RIGHT ); - if ( pScroll == &aVScrollTop ) nDelta = -(long) aViewData.PrevCellsY( SC_SPLIT_TOP ); - if ( pScroll == &aVScrollBottom ) nDelta = -(long) aViewData.PrevCellsY( SC_SPLIT_BOTTOM ); - if (nDelta==0) nDelta=-1; - break; - case SCROLL_PAGEDOWN: - if ( pScroll == &aHScrollLeft ) nDelta = aViewData.VisibleCellsX( SC_SPLIT_LEFT ); - if ( pScroll == &aHScrollRight ) nDelta = aViewData.VisibleCellsX( SC_SPLIT_RIGHT ); - if ( pScroll == &aVScrollTop ) nDelta = aViewData.VisibleCellsY( SC_SPLIT_TOP ); - if ( pScroll == &aVScrollBottom ) nDelta = aViewData.VisibleCellsY( SC_SPLIT_BOTTOM ); - if (nDelta==0) nDelta=1; - break; - case SCROLL_DRAG: - { - // nur in die richtige Richtung scrollen, nicht um ausgeblendete - // Bereiche herumzittern - - long nScrollMin = 0; // RangeMin simulieren - if ( aViewData.GetHSplitMode()==SC_SPLIT_FIX && pScroll == &aHScrollRight ) - nScrollMin = aViewData.GetFixPosX(); - if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == &aVScrollBottom ) - nScrollMin = aViewData.GetFixPosY(); - - long nScrollPos = GetScrollBarPos( *pScroll, bMirror ) + nScrollMin; - nDelta = nScrollPos - nViewPos; - if ( nScrollPos > nPrevDragPos ) - { - if (nDelta<0) nDelta=0; - } - else if ( nScrollPos < nPrevDragPos ) - { - if (nDelta>0) nDelta=0; - } - else - nDelta = 0; - nPrevDragPos = nScrollPos; - } - break; - default: - { - // added to avoid warnings - } - } - - if (nDelta) - { - sal_Bool bUpdate = ( eType != SCROLL_DRAG ); // bei Drag die Ranges nicht aendern - if ( bHoriz ) - ScrollX( nDelta, (pScroll == &aHScrollLeft) ? SC_SPLIT_LEFT : SC_SPLIT_RIGHT, bUpdate ); - else - ScrollY( nDelta, (pScroll == &aVScrollTop) ? SC_SPLIT_TOP : SC_SPLIT_BOTTOM, bUpdate ); - } - } - - return 0; -} - -void ScTabView::ScrollX( long nDeltaX, ScHSplitPos eWhich, bool bUpdBars ) -{ - sal_Bool bHasHint = ( pInputHintWindow != NULL ); - if (bHasHint) - RemoveHintWindow(); - - SCCOL nOldX = aViewData.GetPosX(eWhich); - SCsCOL nNewX = static_cast<SCsCOL>(nOldX) + static_cast<SCsCOL>(nDeltaX); - if ( nNewX < 0 ) - { - nDeltaX -= nNewX; - nNewX = 0; - } - if ( nNewX > MAXCOL ) - { - nDeltaX -= nNewX - MAXCOL; - nNewX = MAXCOL; - } - - SCsCOL nDir = ( nDeltaX > 0 ) ? 1 : -1; - ScDocument* pDoc = aViewData.GetDocument(); - SCTAB nTab = aViewData.GetTabNo(); - while ( pDoc->ColHidden(nNewX, nTab) && - nNewX+nDir >= 0 && nNewX+nDir <= MAXCOL ) - nNewX = sal::static_int_cast<SCsCOL>( nNewX + nDir ); - - // Fixierung - - if (aViewData.GetHSplitMode() == SC_SPLIT_FIX) - { - if (eWhich == SC_SPLIT_LEFT) - nNewX = static_cast<SCsCOL>(nOldX); // links immer stehenlassen - else - { - SCsCOL nFixX = static_cast<SCsCOL>(aViewData.GetFixPosX()); - if (nNewX < nFixX) - nNewX = nFixX; - } - } - if (nNewX == static_cast<SCsCOL>(nOldX)) - return; - - HideAllCursors(); - - if ( nNewX >= 0 && nNewX <= MAXCOL && nDeltaX ) - { - SCCOL nTrackX = std::max( nOldX, static_cast<SCCOL>(nNewX) ); - - // Mit VCL wirkt Update() im Moment immer auf alle Fenster, beim Update - // nach dem Scrollen des GridWindow's wuerde darum der Col-/RowBar evtl. - // mit schon geaenderter Pos. gepainted werden - - // darum vorher einmal Update am Col-/RowBar - - if (pColBar[eWhich]) - pColBar[eWhich]->Update(); - - long nOldPos = aViewData.GetScrPos( nTrackX, 0, eWhich ).X(); - aViewData.SetPosX( eWhich, static_cast<SCCOL>(nNewX) ); - long nDiff = aViewData.GetScrPos( nTrackX, 0, eWhich ).X() - nOldPos; - - if ( eWhich==SC_SPLIT_LEFT ) - { - pGridWin[SC_SPLIT_BOTTOMLEFT]->ScrollPixel( nDiff, 0 ); - if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - pGridWin[SC_SPLIT_TOPLEFT]->ScrollPixel( nDiff, 0 ); - } - else - { - pGridWin[SC_SPLIT_BOTTOMRIGHT]->ScrollPixel( nDiff, 0 ); - if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - pGridWin[SC_SPLIT_TOPRIGHT]->ScrollPixel( nDiff, 0 ); - } - if (pColBar[eWhich]) { pColBar[eWhich]->Scroll( nDiff,0 ); pColBar[eWhich]->Update(); } - if (pColOutline[eWhich]) pColOutline[eWhich]->ScrollPixel( nDiff ); - if (bUpdBars) - UpdateScrollBars(); - } - - if (nDeltaX==1 || nDeltaX==-1) - pGridWin[aViewData.GetActivePart()]->Update(); - - ShowAllCursors(); - - SetNewVisArea(); // MapMode muss schon gesetzt sein - - if (bHasHint) - TestHintWindow(); // neu positionieren -} - -void ScTabView::ScrollY( long nDeltaY, ScVSplitPos eWhich, bool bUpdBars ) -{ - sal_Bool bHasHint = ( pInputHintWindow != NULL ); - if (bHasHint) - RemoveHintWindow(); - - SCROW nOldY = aViewData.GetPosY(eWhich); - SCsROW nNewY = static_cast<SCsROW>(nOldY) + static_cast<SCsROW>(nDeltaY); - if ( nNewY < 0 ) - { - nDeltaY -= nNewY; - nNewY = 0; - } - if ( nNewY > MAXROW ) - { - nDeltaY -= nNewY - MAXROW; - nNewY = MAXROW; - } - - SCsROW nDir = ( nDeltaY > 0 ) ? 1 : -1; - ScDocument* pDoc = aViewData.GetDocument(); - SCTAB nTab = aViewData.GetTabNo(); - while ( pDoc->RowHidden(nNewY, nTab) && - nNewY+nDir >= 0 && nNewY+nDir <= MAXROW ) - nNewY += nDir; - - // Fixierung - - if (aViewData.GetVSplitMode() == SC_SPLIT_FIX) - { - if (eWhich == SC_SPLIT_TOP) - nNewY = static_cast<SCsROW>(nOldY); // oben immer stehenlassen - else - { - SCsROW nFixY = static_cast<SCsROW>(aViewData.GetFixPosY()); - if (nNewY < nFixY) - nNewY = nFixY; - } - } - if (nNewY == static_cast<SCsROW>(nOldY)) - return; - - HideAllCursors(); - - if ( nNewY >= 0 && nNewY <= MAXROW && nDeltaY ) - { - SCROW nTrackY = std::max( nOldY, static_cast<SCROW>(nNewY) ); - - // Zeilenkoepfe anpassen vor dem eigentlichen Scrolling, damit nicht - // doppelt gepainted werden muss - // PosY darf dann auch noch nicht umgesetzt sein, neuen Wert uebergeben - SCROW nUNew = static_cast<SCROW>(nNewY); - UpdateHeaderWidth( &eWhich, &nUNew ); // Zeilenkoepfe anpassen - - if (pRowBar[eWhich]) - pRowBar[eWhich]->Update(); - - long nOldPos = aViewData.GetScrPos( 0, nTrackY, eWhich ).Y(); - aViewData.SetPosY( eWhich, static_cast<SCROW>(nNewY) ); - long nDiff = aViewData.GetScrPos( 0, nTrackY, eWhich ).Y() - nOldPos; - - if ( eWhich==SC_SPLIT_TOP ) - { - pGridWin[SC_SPLIT_TOPLEFT]->ScrollPixel( 0, nDiff ); - if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE ) - pGridWin[SC_SPLIT_TOPRIGHT]->ScrollPixel( 0, nDiff ); - } - else - { - pGridWin[SC_SPLIT_BOTTOMLEFT]->ScrollPixel( 0, nDiff ); - if ( aViewData.GetHSplitMode() != SC_SPLIT_NONE ) - pGridWin[SC_SPLIT_BOTTOMRIGHT]->ScrollPixel( 0, nDiff ); - } - if (pRowBar[eWhich]) { pRowBar[eWhich]->Scroll( 0,nDiff ); pRowBar[eWhich]->Update(); } - if (pRowOutline[eWhich]) pRowOutline[eWhich]->ScrollPixel( nDiff ); - if (bUpdBars) - UpdateScrollBars(); - } - - if (nDeltaY==1 || nDeltaY==-1) - pGridWin[aViewData.GetActivePart()]->Update(); - - ShowAllCursors(); - - SetNewVisArea(); // MapMode muss schon gesetzt sein - - if (bHasHint) - TestHintWindow(); // neu positionieren -} - -void ScTabView::ScrollLines( long nDeltaX, long nDeltaY ) -{ - ScSplitPos eWhich = aViewData.GetActivePart(); - if (nDeltaX) - ScrollX(nDeltaX,WhichH(eWhich)); - if (nDeltaY) - ScrollY(nDeltaY,WhichV(eWhich)); -} - -SCROW lcl_LastVisible( ScViewData& rViewData ) -{ - // wenn am Dokumentende viele Zeilen ausgeblendet sind (welcher Trottel macht sowas?), - // soll dadurch nicht auf breite Zeilenkoepfe geschaltet werden - //! als Member ans Dokument ??? - - ScDocument* pDoc = rViewData.GetDocument(); - SCTAB nTab = rViewData.GetTabNo(); - - SCROW nVis = MAXROW; - while ( nVis > 0 && pDoc->GetRowHeight( nVis, nTab ) == 0 ) - --nVis; - return nVis; -} - -void ScTabView::UpdateHeaderWidth( const ScVSplitPos* pWhich, const SCROW* pPosY ) -{ - if ( !pRowBar[SC_SPLIT_BOTTOM] || MAXROW < 10000 ) - return; - - SCROW nEndPos = MAXROW; - if ( !aViewData.GetViewShell()->GetViewFrame()->GetFrame().IsInPlace() ) - { - // fuer OLE Inplace immer MAXROW - - if ( pWhich && *pWhich == SC_SPLIT_BOTTOM && pPosY ) - nEndPos = *pPosY; - else - nEndPos = aViewData.GetPosY( SC_SPLIT_BOTTOM ); - nEndPos += aViewData.CellsAtY( nEndPos, 1, SC_SPLIT_BOTTOM, SC_SIZE_NONE ); // VisibleCellsY - if (nEndPos > MAXROW) - nEndPos = lcl_LastVisible( aViewData ); - - if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - { - SCROW nTopEnd; - if ( pWhich && *pWhich == SC_SPLIT_TOP && pPosY ) - nTopEnd = *pPosY; - else - nTopEnd = aViewData.GetPosY( SC_SPLIT_TOP ); - nTopEnd += aViewData.CellsAtY( nTopEnd, 1, SC_SPLIT_TOP, SC_SIZE_NONE );// VisibleCellsY - if (nTopEnd > MAXROW) - nTopEnd = lcl_LastVisible( aViewData ); - - if ( nTopEnd > nEndPos ) - nEndPos = nTopEnd; - } - } - - long nSmall = pRowBar[SC_SPLIT_BOTTOM]->GetSmallWidth(); - long nBig = pRowBar[SC_SPLIT_BOTTOM]->GetBigWidth(); - long nDiff = nBig - nSmall; - - if (nEndPos>10000) - nEndPos = 10000; - else if (nEndPos<1) // avoid extra step at 0 (when only one row is visible) - nEndPos = 1; - long nWidth = nBig - ( 10000 - nEndPos ) * nDiff / 10000; - - if ( nWidth != pRowBar[SC_SPLIT_BOTTOM]->GetWidth() && !bInUpdateHeader ) - { - bInUpdateHeader = true; - - pRowBar[SC_SPLIT_BOTTOM]->SetWidth( nWidth ); - if (pRowBar[SC_SPLIT_TOP]) - pRowBar[SC_SPLIT_TOP]->SetWidth( nWidth ); - - RepeatResize(); - - // auf VCL gibt's Update ohne Ende (jedes Update gilt fuer alle Fenster) - //aCornerButton.Update(); // der bekommt sonst nie ein Update - - bInUpdateHeader = false; - } -} - -inline void ShowHide( Window* pWin, sal_Bool bShow ) -{ - OSL_ENSURE(pWin || !bShow, "Fenster ist nicht da"); - if (pWin) - pWin->Show(bShow); -} - -void ScTabView::UpdateShow() -{ - sal_Bool bHScrollMode = aViewData.IsHScrollMode(); - sal_Bool bVScrollMode = aViewData.IsVScrollMode(); - sal_Bool bTabMode = aViewData.IsTabMode(); - sal_Bool bOutlMode = aViewData.IsOutlineMode(); - sal_Bool bHOutline = bOutlMode && lcl_HasColOutline(aViewData); - sal_Bool bVOutline = bOutlMode && lcl_HasRowOutline(aViewData); - sal_Bool bHeader = aViewData.IsHeaderMode(); - - sal_Bool bShowH = ( aViewData.GetHSplitMode() != SC_SPLIT_NONE ); - sal_Bool bShowV = ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ); - - // Scrollbar-Einstellungen koennen vom Sfx ueberschrieben werden: - SfxScrollingMode eMode = aViewData.GetViewShell()->GetScrollingMode(); - if ( eMode == SCROLLING_NO ) - bHScrollMode = bVScrollMode = false; - else if ( eMode == SCROLLING_YES || eMode == SCROLLING_AUTO ) //! Auto ??? - bHScrollMode = bVScrollMode = sal_True; - - if ( aViewData.GetDocShell()->IsPreview() ) - bHScrollMode = bVScrollMode = bTabMode = bHeader = bOutlMode = bHOutline = bVOutline = false; - - // - // Windows anlegen - // - - if (bShowH && !pGridWin[SC_SPLIT_BOTTOMRIGHT]) - { - pGridWin[SC_SPLIT_BOTTOMRIGHT] = new ScGridWindow( pFrameWin, &aViewData, SC_SPLIT_BOTTOMRIGHT ); - DoAddWin( pGridWin[SC_SPLIT_BOTTOMRIGHT] ); - } - if (bShowV && !pGridWin[SC_SPLIT_TOPLEFT]) - { - pGridWin[SC_SPLIT_TOPLEFT] = new ScGridWindow( pFrameWin, &aViewData, SC_SPLIT_TOPLEFT ); - DoAddWin( pGridWin[SC_SPLIT_TOPLEFT] ); - } - if (bShowH && bShowV && !pGridWin[SC_SPLIT_TOPRIGHT]) - { - pGridWin[SC_SPLIT_TOPRIGHT] = new ScGridWindow( pFrameWin, &aViewData, SC_SPLIT_TOPRIGHT ); - DoAddWin( pGridWin[SC_SPLIT_TOPRIGHT] ); - } - - if (bHOutline && !pColOutline[SC_SPLIT_LEFT]) - pColOutline[SC_SPLIT_LEFT] = new ScOutlineWindow( pFrameWin, SC_OUTLINE_HOR, &aViewData, SC_SPLIT_BOTTOMLEFT ); - if (bShowH && bHOutline && !pColOutline[SC_SPLIT_RIGHT]) - pColOutline[SC_SPLIT_RIGHT] = new ScOutlineWindow( pFrameWin, SC_OUTLINE_HOR, &aViewData, SC_SPLIT_BOTTOMRIGHT ); - - if (bVOutline && !pRowOutline[SC_SPLIT_BOTTOM]) - pRowOutline[SC_SPLIT_BOTTOM] = new ScOutlineWindow( pFrameWin, SC_OUTLINE_VER, &aViewData, SC_SPLIT_BOTTOMLEFT ); - if (bShowV && bVOutline && !pRowOutline[SC_SPLIT_TOP]) - pRowOutline[SC_SPLIT_TOP] = new ScOutlineWindow( pFrameWin, SC_OUTLINE_VER, &aViewData, SC_SPLIT_TOPLEFT ); - - if (bShowH && bHeader && !pColBar[SC_SPLIT_RIGHT]) - pColBar[SC_SPLIT_RIGHT] = new ScColBar( pFrameWin, &aViewData, SC_SPLIT_RIGHT, - &aHdrFunc, pHdrSelEng ); - if (bShowV && bHeader && !pRowBar[SC_SPLIT_TOP]) - pRowBar[SC_SPLIT_TOP] = new ScRowBar( pFrameWin, &aViewData, SC_SPLIT_TOP, - &aHdrFunc, pHdrSelEng ); - - // - // Windows anzeigen - // - - ShowHide( &aHScrollLeft, bHScrollMode ); - ShowHide( &aHScrollRight, bShowH && bHScrollMode ); - ShowHide( &aVScrollBottom, bVScrollMode ); - ShowHide( &aVScrollTop, bShowV && bVScrollMode ); - ShowHide( &aScrollBarBox, bVScrollMode || bHScrollMode ); - - ShowHide( pHSplitter, bHScrollMode || bShowH ); // immer angelegt - ShowHide( pVSplitter, bVScrollMode || bShowV ); - ShowHide( pTabControl, bTabMode ); - - // ab hier dynamisch angelegte - - ShowHide( pGridWin[SC_SPLIT_BOTTOMRIGHT], bShowH ); - ShowHide( pGridWin[SC_SPLIT_TOPLEFT], bShowV ); - ShowHide( pGridWin[SC_SPLIT_TOPRIGHT], bShowH && bShowV ); - - ShowHide( pColOutline[SC_SPLIT_LEFT], bHOutline ); - ShowHide( pColOutline[SC_SPLIT_RIGHT], bShowH && bHOutline ); - - ShowHide( pRowOutline[SC_SPLIT_BOTTOM], bVOutline ); - ShowHide( pRowOutline[SC_SPLIT_TOP], bShowV && bVOutline ); - - ShowHide( pColBar[SC_SPLIT_RIGHT], bShowH && bHeader ); - ShowHide( pRowBar[SC_SPLIT_TOP], bShowV && bHeader ); - - - //! neue Gridwindows eintragen -} - -void ScTabView::UpdateVisibleRange() -{ - for (int i = 0; i < 4; ++i) - { - if (!pGridWin[i] || !pGridWin[i]->IsVisible()) - continue; - - pGridWin[i]->UpdateVisibleRange(); - } -} - -// --- Splitter -------------------------------------------------------- - -IMPL_LINK( ScTabView, SplitHdl, Splitter*, pSplitter ) -{ - if ( pSplitter == pHSplitter ) - DoHSplit( pHSplitter->GetSplitPosPixel() ); - else - DoVSplit( pVSplitter->GetSplitPosPixel() ); - - if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX || aViewData.GetVSplitMode() == SC_SPLIT_FIX ) - FreezeSplitters( sal_True ); - - DoResize( aBorderPos, aFrameSize ); - - return 0; -} - -void ScTabView::DoHSplit(long nSplitPos) -{ - // nSplitPos is the real pixel position on the frame window, - // mirroring for RTL has to be done here. - - sal_Bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ); - if ( bLayoutRTL ) - nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1; - - long nMinPos; - long nMaxPos; - SCCOL nOldDelta; - SCCOL nNewDelta; - - nMinPos = SPLIT_MARGIN; - if ( pRowBar[SC_SPLIT_BOTTOM] && pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width() >= nMinPos ) - nMinPos = pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width() + 1; - nMaxPos = aFrameSize.Width() - SPLIT_MARGIN; - - ScSplitMode aOldMode = aViewData.GetHSplitMode(); - ScSplitMode aNewMode = SC_SPLIT_NORMAL; - - aViewData.SetHSplitPos( nSplitPos ); - if ( nSplitPos < nMinPos || nSplitPos > nMaxPos ) - aNewMode = SC_SPLIT_NONE; - - aViewData.SetHSplitMode( aNewMode ); - - if ( aNewMode != aOldMode ) - { - UpdateShow(); // vor ActivatePart !! - - if ( aNewMode == SC_SPLIT_NONE ) - { - if (aViewData.GetActivePart() == SC_SPLIT_TOPRIGHT) - ActivatePart( SC_SPLIT_TOPLEFT ); - if (aViewData.GetActivePart() == SC_SPLIT_BOTTOMRIGHT) - ActivatePart( SC_SPLIT_BOTTOMLEFT ); - } - else - { - nOldDelta = aViewData.GetPosX( SC_SPLIT_LEFT ); - long nLeftWidth = nSplitPos - pRowBar[SC_SPLIT_BOTTOM]->GetSizePixel().Width(); - if ( nLeftWidth < 0 ) nLeftWidth = 0; - nNewDelta = nOldDelta + aViewData.CellsAtX( nOldDelta, 1, SC_SPLIT_LEFT, - (sal_uInt16) nLeftWidth ); - if ( nNewDelta > MAXCOL ) - nNewDelta = MAXCOL; - aViewData.SetPosX( SC_SPLIT_RIGHT, nNewDelta ); - if ( nNewDelta > aViewData.GetCurX() ) - ActivatePart( (WhichV(aViewData.GetActivePart()) == SC_SPLIT_BOTTOM) ? - SC_SPLIT_BOTTOMLEFT : SC_SPLIT_TOPLEFT ); - else - ActivatePart( (WhichV(aViewData.GetActivePart()) == SC_SPLIT_BOTTOM) ? - SC_SPLIT_BOTTOMRIGHT : SC_SPLIT_TOPRIGHT ); - } - - // Form-Layer muss den sichtbaren Ausschnitt aller Fenster kennen - // dafuer muss hier schon der MapMode stimmen - for (sal_uInt16 i=0; i<4; i++) - if (pGridWin[i]) - pGridWin[i]->SetMapMode( pGridWin[i]->GetDrawMapMode() ); - SetNewVisArea(); - - PaintGrid(); - PaintTop(); - - InvalidateSplit(); - } -} - -void ScTabView::DoVSplit(long nSplitPos) -{ - long nMinPos; - long nMaxPos; - SCROW nOldDelta; - SCROW nNewDelta; - - nMinPos = SPLIT_MARGIN; - if ( pColBar[SC_SPLIT_LEFT] && pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height() >= nMinPos ) - nMinPos = pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height() + 1; - nMaxPos = aFrameSize.Height() - SPLIT_MARGIN; - - ScSplitMode aOldMode = aViewData.GetVSplitMode(); - ScSplitMode aNewMode = SC_SPLIT_NORMAL; - - aViewData.SetVSplitPos( nSplitPos ); - if ( nSplitPos < nMinPos || nSplitPos > nMaxPos ) - aNewMode = SC_SPLIT_NONE; - - aViewData.SetVSplitMode( aNewMode ); - - if ( aNewMode != aOldMode ) - { - UpdateShow(); // vor ActivatePart !! - - if ( aNewMode == SC_SPLIT_NONE ) - { - nOldDelta = aViewData.GetPosY( SC_SPLIT_TOP ); - aViewData.SetPosY( SC_SPLIT_BOTTOM, nOldDelta ); - - if (aViewData.GetActivePart() == SC_SPLIT_TOPLEFT) - ActivatePart( SC_SPLIT_BOTTOMLEFT ); - if (aViewData.GetActivePart() == SC_SPLIT_TOPRIGHT) - ActivatePart( SC_SPLIT_BOTTOMRIGHT ); - } - else - { - if ( aOldMode == SC_SPLIT_NONE ) - nOldDelta = aViewData.GetPosY( SC_SPLIT_BOTTOM ); - else - nOldDelta = aViewData.GetPosY( SC_SPLIT_TOP ); - - aViewData.SetPosY( SC_SPLIT_TOP, nOldDelta ); - long nTopHeight = nSplitPos - pColBar[SC_SPLIT_LEFT]->GetSizePixel().Height(); - if ( nTopHeight < 0 ) nTopHeight = 0; - nNewDelta = nOldDelta + aViewData.CellsAtY( nOldDelta, 1, SC_SPLIT_TOP, - (sal_uInt16) nTopHeight ); - if ( nNewDelta > MAXROW ) - nNewDelta = MAXROW; - aViewData.SetPosY( SC_SPLIT_BOTTOM, nNewDelta ); - if ( nNewDelta > aViewData.GetCurY() ) - ActivatePart( (WhichH(aViewData.GetActivePart()) == SC_SPLIT_LEFT) ? - SC_SPLIT_TOPLEFT : SC_SPLIT_TOPRIGHT ); - else - ActivatePart( (WhichH(aViewData.GetActivePart()) == SC_SPLIT_LEFT) ? - SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT ); - } - - // Form-Layer muss den sichtbaren Ausschnitt aller Fenster kennen - // dafuer muss hier schon der MapMode stimmen - for (sal_uInt16 i=0; i<4; i++) - if (pGridWin[i]) - pGridWin[i]->SetMapMode( pGridWin[i]->GetDrawMapMode() ); - SetNewVisArea(); - - PaintGrid(); - PaintLeft(); - - InvalidateSplit(); - } -} - -Point ScTabView::GetInsertPos() -{ - ScDocument* pDoc = aViewData.GetDocument(); - SCCOL nCol = aViewData.GetCurX(); - SCROW nRow = aViewData.GetCurY(); - SCTAB nTab = aViewData.GetTabNo(); - long nPosX = 0; - for (SCCOL i=0; i<nCol; i++) - nPosX += pDoc->GetColWidth(i,nTab); - nPosX = (long)(nPosX * HMM_PER_TWIPS); - if ( pDoc->IsNegativePage( nTab ) ) - nPosX = -nPosX; - long nPosY = (long) pDoc->GetRowHeight( 0, nRow-1, nTab); - nPosY = (long)(nPosY * HMM_PER_TWIPS); - return Point(nPosX,nPosY); -} - -Point ScTabView::GetChartInsertPos( const Size& rSize, const ScRange& rCellRange ) -{ - Point aInsertPos; - const long nBorder = 100; // leave 1mm for border - long nNeededWidth = rSize.Width() + 2 * nBorder; - long nNeededHeight = rSize.Height() + 2 * nBorder; - - // use the active window, or lower/right if frozen (as in CalcZoom) - ScSplitPos eUsedPart = aViewData.GetActivePart(); - if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX ) - eUsedPart = (WhichV(eUsedPart)==SC_SPLIT_TOP) ? SC_SPLIT_TOPRIGHT : SC_SPLIT_BOTTOMRIGHT; - if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX ) - eUsedPart = (WhichH(eUsedPart)==SC_SPLIT_LEFT) ? SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT; - - ScGridWindow* pWin = pGridWin[eUsedPart]; - OSL_ENSURE( pWin, "Window not found" ); - if (pWin) - { - ActivatePart( eUsedPart ); - - // get the visible rectangle in logic units - - MapMode aDrawMode = pWin->GetDrawMapMode(); - Rectangle aVisible( pWin->PixelToLogic( Rectangle( Point(0,0), pWin->GetOutputSizePixel() ), aDrawMode ) ); - - ScDocument* pDoc = aViewData.GetDocument(); - SCTAB nTab = aViewData.GetTabNo(); - sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab ); - long nLayoutSign = bLayoutRTL ? -1 : 1; - - long nDocX = (long)( (double) pDoc->GetColOffset( MAXCOL + 1, nTab ) * HMM_PER_TWIPS ) * nLayoutSign; - long nDocY = (long)( (double) pDoc->GetRowOffset( MAXROW + 1, nTab ) * HMM_PER_TWIPS ); - - if ( aVisible.Left() * nLayoutSign > nDocX * nLayoutSign ) - aVisible.Left() = nDocX; - if ( aVisible.Right() * nLayoutSign > nDocX * nLayoutSign ) - aVisible.Right() = nDocX; - if ( aVisible.Top() > nDocY ) - aVisible.Top() = nDocY; - if ( aVisible.Bottom() > nDocY ) - aVisible.Bottom() = nDocY; - - // get the logic position of the selection - - Rectangle aSelection = pDoc->GetMMRect( rCellRange.aStart.Col(), rCellRange.aStart.Row(), - rCellRange.aEnd.Col(), rCellRange.aEnd.Row(), nTab ); - - long nLeftSpace = aSelection.Left() - aVisible.Left(); - long nRightSpace = aVisible.Right() - aSelection.Right(); - long nTopSpace = aSelection.Top() - aVisible.Top(); - long nBottomSpace = aVisible.Bottom() - aSelection.Bottom(); - - bool bFitLeft = ( nLeftSpace >= nNeededWidth ); - bool bFitRight = ( nRightSpace >= nNeededWidth ); - - if ( bFitLeft || bFitRight ) - { - // first preference: completely left or right of the selection - - // if both fit, prefer left in RTL mode, right otherwise - bool bPutLeft = bFitLeft && ( bLayoutRTL || !bFitRight ); - - if ( bPutLeft ) - aInsertPos.X() = aSelection.Left() - nNeededWidth; - else - aInsertPos.X() = aSelection.Right() + 1; - - // align with top of selection (is moved again if it doesn't fit) - aInsertPos.Y() = std::max( aSelection.Top(), aVisible.Top() ); - } - else if ( nTopSpace >= nNeededHeight || nBottomSpace >= nNeededHeight ) - { - // second preference: completely above or below the selection - - if ( nBottomSpace > nNeededHeight ) // bottom is preferred - aInsertPos.Y() = aSelection.Bottom() + 1; - else - aInsertPos.Y() = aSelection.Top() - nNeededHeight; - - // align with (logic) left edge of selection (moved again if it doesn't fit) - if ( bLayoutRTL ) - aInsertPos.X() = std::min( aSelection.Right(), aVisible.Right() ) - nNeededWidth + 1; - else - aInsertPos.X() = std::max( aSelection.Left(), aVisible.Left() ); - } - else - { - // place to the (logic) right of the selection and move so it fits - - if ( bLayoutRTL ) - aInsertPos.X() = aSelection.Left() - nNeededWidth; - else - aInsertPos.X() = aSelection.Right() + 1; - aInsertPos.Y() = std::max( aSelection.Top(), aVisible.Top() ); - } - - // move the position if the object doesn't fit in the screen - - Rectangle aCompareRect( aInsertPos, Size( nNeededWidth, nNeededHeight ) ); - if ( aCompareRect.Right() > aVisible.Right() ) - aInsertPos.X() -= aCompareRect.Right() - aVisible.Right(); - if ( aCompareRect.Bottom() > aVisible.Bottom() ) - aInsertPos.Y() -= aCompareRect.Bottom() - aVisible.Bottom(); - - if ( aInsertPos.X() < aVisible.Left() ) - aInsertPos.X() = aVisible.Left(); - if ( aInsertPos.Y() < aVisible.Top() ) - aInsertPos.Y() = aVisible.Top(); - - // nNeededWidth / nNeededHeight includes all borders - move aInsertPos to the - // object position, inside the border - - aInsertPos.X() += nBorder; - aInsertPos.Y() += nBorder; - } - return aInsertPos; -} - -Point ScTabView::GetChartDialogPos( const Size& rDialogSize, const Rectangle& rLogicChart ) -{ - // rDialogSize must be in pixels, rLogicChart in 1/100 mm. Return value is in pixels. - - Point aRet; - - // use the active window, or lower/right if frozen (as in CalcZoom) - ScSplitPos eUsedPart = aViewData.GetActivePart(); - if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX ) - eUsedPart = (WhichV(eUsedPart)==SC_SPLIT_TOP) ? SC_SPLIT_TOPRIGHT : SC_SPLIT_BOTTOMRIGHT; - if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX ) - eUsedPart = (WhichH(eUsedPart)==SC_SPLIT_LEFT) ? SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT; - - ScGridWindow* pWin = pGridWin[eUsedPart]; - OSL_ENSURE( pWin, "Window not found" ); - if (pWin) - { - MapMode aDrawMode = pWin->GetDrawMapMode(); - Rectangle aObjPixel = pWin->LogicToPixel( rLogicChart, aDrawMode ); - Rectangle aObjAbs( pWin->OutputToAbsoluteScreenPixel( aObjPixel.TopLeft() ), - pWin->OutputToAbsoluteScreenPixel( aObjPixel.BottomRight() ) ); - - Rectangle aDesktop = pWin->GetDesktopRectPixel(); - Size aSpace = pWin->LogicToPixel( Size( 8, 12 ), MAP_APPFONT ); - - ScDocument* pDoc = aViewData.GetDocument(); - SCTAB nTab = aViewData.GetTabNo(); - sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab ); - - bool bCenterHor = false; - - if ( aDesktop.Bottom() - aObjAbs.Bottom() >= rDialogSize.Height() + aSpace.Height() ) - { - // first preference: below the chart - - aRet.Y() = aObjAbs.Bottom() + aSpace.Height(); - bCenterHor = true; - } - else if ( aObjAbs.Top() - aDesktop.Top() >= rDialogSize.Height() + aSpace.Height() ) - { - // second preference: above the chart - - aRet.Y() = aObjAbs.Top() - rDialogSize.Height() - aSpace.Height(); - bCenterHor = true; - } - else - { - bool bFitLeft = ( aObjAbs.Left() - aDesktop.Left() >= rDialogSize.Width() + aSpace.Width() ); - bool bFitRight = ( aDesktop.Right() - aObjAbs.Right() >= rDialogSize.Width() + aSpace.Width() ); - - if ( bFitLeft || bFitRight ) - { - // if both fit, prefer right in RTL mode, left otherwise - bool bPutRight = bFitRight && ( bLayoutRTL || !bFitLeft ); - if ( bPutRight ) - aRet.X() = aObjAbs.Right() + aSpace.Width(); - else - aRet.X() = aObjAbs.Left() - rDialogSize.Width() - aSpace.Width(); - - // center vertically - aRet.Y() = aObjAbs.Top() + ( aObjAbs.GetHeight() - rDialogSize.Height() ) / 2; - } - else - { - // doesn't fit on any edge - put at the bottom of the screen - aRet.Y() = aDesktop.Bottom() - rDialogSize.Height(); - bCenterHor = true; - } - } - if ( bCenterHor ) - aRet.X() = aObjAbs.Left() + ( aObjAbs.GetWidth() - rDialogSize.Width() ) / 2; - - // limit to screen (centering might lead to invalid positions) - if ( aRet.X() + rDialogSize.Width() - 1 > aDesktop.Right() ) - aRet.X() = aDesktop.Right() - rDialogSize.Width() + 1; - if ( aRet.X() < aDesktop.Left() ) - aRet.X() = aDesktop.Left(); - if ( aRet.Y() + rDialogSize.Height() - 1 > aDesktop.Bottom() ) - aRet.Y() = aDesktop.Bottom() - rDialogSize.Height() + 1; - if ( aRet.Y() < aDesktop.Top() ) - aRet.Y() = aDesktop.Top(); - } - - return aRet; -} - -void ScTabView::LockModifiers( sal_uInt16 nModifiers ) -{ - pSelEngine->LockModifiers( nModifiers ); - pHdrSelEng->LockModifiers( nModifiers ); -} - -sal_uInt16 ScTabView::GetLockedModifiers() const -{ - return pSelEngine->GetLockedModifiers(); -} - -Point ScTabView::GetMousePosPixel() -{ - Point aPos; - ScGridWindow* pWin = (ScGridWindow*)GetActiveWin(); - - if ( pWin ) - aPos = pWin->GetMousePosPixel(); - - return aPos; -} - -sal_Bool lcl_MouseIsOverWin( const Point& rScreenPosPixel, Window* pWin ) -{ - if (pWin) - { - // SPLIT_HANDLE_SIZE draufaddieren, damit das Einrasten genau - // auf dem Splitter nicht aussetzt - - Point aRel = pWin->NormalizedScreenToOutputPixel( rScreenPosPixel ); - Size aWinSize = pWin->GetOutputSizePixel(); - if ( aRel.X() >= 0 && aRel.X() < aWinSize.Width() + SPLIT_HANDLE_SIZE && - aRel.Y() >= 0 && aRel.Y() < aWinSize.Height() + SPLIT_HANDLE_SIZE ) - return sal_True; - } - return false; -} - -void ScTabView::SnapSplitPos( Point& rScreenPosPixel ) -{ - sal_Bool bOverWin = false; - sal_uInt16 i; - for (i=0; i<4; i++) - if (lcl_MouseIsOverWin(rScreenPosPixel,pGridWin[i])) - bOverWin = sal_True; - - if (!bOverWin) - return; - - // don't snap to cells if the scale will be modified afterwards - if ( GetZoomType() != SVX_ZOOM_PERCENT ) - return; - - ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT; - if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - ePos = SC_SPLIT_TOPLEFT; - - Window* pWin = pGridWin[ePos]; - if (!pWin) - { - OSL_FAIL("Window NULL"); - return; - } - - Point aMouse = pWin->NormalizedScreenToOutputPixel( rScreenPosPixel ); - SCsCOL nPosX; - SCsROW nPosY; - // bNextIfLarge=FALSE: nicht auf naechste Zelle, wenn ausserhalb des Fensters - aViewData.GetPosFromPixel( aMouse.X(), aMouse.Y(), ePos, nPosX, nPosY, true, false, false ); - sal_Bool bLeft; - sal_Bool bTop; - aViewData.GetMouseQuadrant( aMouse, ePos, nPosX, nPosY, bLeft, bTop ); - if (!bLeft) - ++nPosX; - if (!bTop) - ++nPosY; - aMouse = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, sal_True ); - rScreenPosPixel = pWin->OutputToNormalizedScreenPixel( aMouse ); -} - -void ScTabView::FreezeSplitters( bool bFreeze ) -{ - ScSplitMode eOldH = aViewData.GetHSplitMode(); - ScSplitMode eOldV = aViewData.GetVSplitMode(); - - ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT; - if ( eOldV != SC_SPLIT_NONE ) - ePos = SC_SPLIT_TOPLEFT; - Window* pWin = pGridWin[ePos]; - - bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ); - - if ( bFreeze ) - { - Point aWinStart = pWin->GetPosPixel(); - - Point aSplit; - SCsCOL nPosX; - SCsROW nPosY; - if (eOldH != SC_SPLIT_NONE || eOldV != SC_SPLIT_NONE) - { - if (eOldH != SC_SPLIT_NONE) - { - long nSplitPos = aViewData.GetHSplitPos(); - if ( bLayoutRTL ) - nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1; - aSplit.X() = nSplitPos - aWinStart.X(); - } - if (eOldV != SC_SPLIT_NONE) - aSplit.Y() = aViewData.GetVSplitPos() - aWinStart.Y(); - - aViewData.GetPosFromPixel( aSplit.X(), aSplit.Y(), ePos, nPosX, nPosY ); - sal_Bool bLeft; - sal_Bool bTop; - aViewData.GetMouseQuadrant( aSplit, ePos, nPosX, nPosY, bLeft, bTop ); - if (!bLeft) - ++nPosX; - if (!bTop) - ++nPosY; - } - else - { - nPosX = static_cast<SCsCOL>( aViewData.GetCurX()); - nPosY = static_cast<SCsROW>( aViewData.GetCurY()); - } - - SCCOL nLeftPos = aViewData.GetPosX(SC_SPLIT_LEFT); - SCROW nTopPos = aViewData.GetPosY(SC_SPLIT_BOTTOM); - SCCOL nRightPos = static_cast<SCCOL>(nPosX); - SCROW nBottomPos = static_cast<SCROW>(nPosY); - if (eOldH != SC_SPLIT_NONE) - if (aViewData.GetPosX(SC_SPLIT_RIGHT) > nRightPos) - nRightPos = aViewData.GetPosX(SC_SPLIT_RIGHT); - if (eOldV != SC_SPLIT_NONE) - { - nTopPos = aViewData.GetPosY(SC_SPLIT_TOP); - if (aViewData.GetPosY(SC_SPLIT_BOTTOM) > nBottomPos) - nBottomPos = aViewData.GetPosY(SC_SPLIT_BOTTOM); - } - - aSplit = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, true ); - if (nPosX > aViewData.GetPosX(SC_SPLIT_LEFT)) // (aSplit.X() > 0) doesn't work for RTL - { - long nSplitPos = aSplit.X() + aWinStart.X(); - if ( bLayoutRTL ) - nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1; - - aViewData.SetHSplitMode( SC_SPLIT_FIX ); - aViewData.SetHSplitPos( nSplitPos ); - aViewData.SetFixPosX( nPosX ); - - aViewData.SetPosX(SC_SPLIT_LEFT, nLeftPos); - aViewData.SetPosX(SC_SPLIT_RIGHT, nRightPos); - } - else - aViewData.SetHSplitMode( SC_SPLIT_NONE ); - if (aSplit.Y() > 0) - { - aViewData.SetVSplitMode( SC_SPLIT_FIX ); - aViewData.SetVSplitPos( aSplit.Y() + aWinStart.Y() ); - aViewData.SetFixPosY( nPosY ); - - aViewData.SetPosY(SC_SPLIT_TOP, nTopPos); - aViewData.SetPosY(SC_SPLIT_BOTTOM, nBottomPos); - } - else - aViewData.SetVSplitMode( SC_SPLIT_NONE ); - } - else // Fixierung aufheben - { - if ( eOldH == SC_SPLIT_FIX ) - aViewData.SetHSplitMode( SC_SPLIT_NORMAL ); - if ( eOldV == SC_SPLIT_FIX ) - aViewData.SetVSplitMode( SC_SPLIT_NORMAL ); - } - - // Form-Layer muss den sichtbaren Ausschnitt aller Fenster kennen - // dafuer muss hier schon der MapMode stimmen - for (sal_uInt16 i=0; i<4; i++) - if (pGridWin[i]) - pGridWin[i]->SetMapMode( pGridWin[i]->GetDrawMapMode() ); - SetNewVisArea(); - - RepeatResize(false); - - UpdateShow(); - PaintLeft(); - PaintTop(); - PaintGrid(); - - // SC_FOLLOW_NONE: only update active part - AlignToCursor( aViewData.GetCurX(), aViewData.GetCurY(), SC_FOLLOW_NONE ); - UpdateAutoFillMark(); - - InvalidateSplit(); -} - -void ScTabView::RemoveSplit() -{ - DoHSplit( 0 ); - DoVSplit( 0 ); - RepeatResize(); -} - -void ScTabView::SplitAtCursor() -{ - ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT; - if ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ) - ePos = SC_SPLIT_TOPLEFT; - Window* pWin = pGridWin[ePos]; - Point aWinStart = pWin->GetPosPixel(); - - SCCOL nPosX = aViewData.GetCurX(); - SCROW nPosY = aViewData.GetCurY(); - Point aSplit = aViewData.GetScrPos( nPosX, nPosY, ePos, sal_True ); - if ( nPosX > 0 ) - DoHSplit( aSplit.X() + aWinStart.X() ); - else - DoHSplit( 0 ); - if ( nPosY > 0 ) - DoVSplit( aSplit.Y() + aWinStart.Y() ); - else - DoVSplit( 0 ); - RepeatResize(); -} - -void ScTabView::SplitAtPixel( const Point& rPixel, bool bHor, bool bVer ) -{ - // Pixel ist auf die ganze View bezogen, nicht auf das erste GridWin - - if (bHor) - { - if ( rPixel.X() > 0 ) - DoHSplit( rPixel.X() ); - else - DoHSplit( 0 ); - } - if (bVer) - { - if ( rPixel.Y() > 0 ) - DoVSplit( rPixel.Y() ); - else - DoVSplit( 0 ); - } - RepeatResize(); -} - -void ScTabView::InvalidateSplit() -{ - SfxBindings& rBindings = aViewData.GetBindings(); - rBindings.Invalidate( SID_WINDOW_SPLIT ); - rBindings.Invalidate( SID_WINDOW_FIX ); - - pHSplitter->SetFixed( aViewData.GetHSplitMode() == SC_SPLIT_FIX ); - pVSplitter->SetFixed( aViewData.GetVSplitMode() == SC_SPLIT_FIX ); -} - -void ScTabView::SetNewVisArea() -{ - // fuer die Controls muss bei VisAreaChanged der Draw-MapMode eingestellt sein - // (auch wenn ansonsten der Edit-MapMode gesetzt ist) - MapMode aOldMode[4]; - MapMode aDrawMode[4]; - sal_uInt16 i; - for (i=0; i<4; i++) - if (pGridWin[i]) - { - aOldMode[i] = pGridWin[i]->GetMapMode(); - aDrawMode[i] = pGridWin[i]->GetDrawMapMode(); - if (aDrawMode[i] != aOldMode[i]) - pGridWin[i]->SetMapMode(aDrawMode[i]); - } - - Window* pActive = pGridWin[aViewData.GetActivePart()]; - if (pActive) - aViewData.GetViewShell()->VisAreaChanged( - pActive->PixelToLogic(Rectangle(Point(),pActive->GetOutputSizePixel())) ); - if (pDrawView) - pDrawView->VisAreaChanged(); // kein Window uebergeben -> alle Fenster - - UpdateAllOverlays(); // #i79909# with drawing MapMode set - - for (i=0; i<4; i++) - if (pGridWin[i] && aDrawMode[i] != aOldMode[i]) - { - pGridWin[i]->flushOverlayManager(); // #i79909# flush overlays before switching to edit MapMode - pGridWin[i]->SetMapMode(aOldMode[i]); - } - - SfxViewFrame* pViewFrame = aViewData.GetViewShell()->GetViewFrame(); - if (pViewFrame) - { - SfxFrame& rFrame = pViewFrame->GetFrame(); - com::sun::star::uno::Reference<com::sun::star::frame::XController> xController = rFrame.GetController(); - if (xController.is()) - { - ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController ); - if (pImp) - pImp->VisAreaChanged(); - } - } - if (aViewData.GetViewShell()->HasAccessibilityObjects()) - aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_VISAREACHANGED)); -} - -bool ScTabView::HasPageFieldDataAtCursor() const -{ - ScGridWindow* pWin = pGridWin[aViewData.GetActivePart()]; - SCCOL nCol = aViewData.GetCurX(); - SCROW nRow = aViewData.GetCurY(); - if (pWin) - return pWin->GetDPFieldOrientation( nCol, nRow ) == sheet::DataPilotFieldOrientation_PAGE; - - return false; -} - -void ScTabView::StartDataSelect() -{ - ScGridWindow* pWin = pGridWin[aViewData.GetActivePart()]; - SCCOL nCol = aViewData.GetCurX(); - SCROW nRow = aViewData.GetCurY(); - - if (!pWin) - return; - - switch (pWin->GetDPFieldOrientation(nCol, nRow)) - { - case sheet::DataPilotFieldOrientation_PAGE: - // #i36598# If the cursor is on a page field's data cell, - // no meaningful input is possible anyway, so this function - // can be used to select a page field entry. - pWin->LaunchPageFieldMenu( nCol, nRow ); - return; - case sheet::DataPilotFieldOrientation_COLUMN: - case sheet::DataPilotFieldOrientation_ROW: - pWin->LaunchDPFieldMenu( nCol, nRow ); - return; - default: - ; - } - - // Do autofilter if the current cell has autofilter button. Otherwise do - // a normal data select popup. - const ScMergeFlagAttr* pAttr = static_cast<const ScMergeFlagAttr*>( - aViewData.GetDocument()->GetAttr( - nCol, nRow, aViewData.GetTabNo(), ATTR_MERGE_FLAG)); - - pWin->DoAutoFilterMenue(nCol, nRow, !pAttr->HasAutoFilter()); -} - -void ScTabView::EnableRefInput(bool bFlag) -{ - aHScrollLeft.EnableInput(bFlag); - aHScrollRight.EnableInput(bFlag); - aVScrollBottom.EnableInput(bFlag); - aVScrollTop.EnableInput(bFlag); - aScrollBarBox.EnableInput(bFlag); - - // ab hier dynamisch angelegte - - if(pTabControl!=NULL) pTabControl->EnableInput(bFlag,true); - - if(pGridWin[SC_SPLIT_BOTTOMLEFT]!=NULL) - pGridWin[SC_SPLIT_BOTTOMLEFT]->EnableInput(bFlag,false); - if(pGridWin[SC_SPLIT_BOTTOMRIGHT]!=NULL) - pGridWin[SC_SPLIT_BOTTOMRIGHT]->EnableInput(bFlag,false); - if(pGridWin[SC_SPLIT_TOPLEFT]!=NULL) - pGridWin[SC_SPLIT_TOPLEFT]->EnableInput(bFlag,false); - if(pGridWin[SC_SPLIT_TOPRIGHT]!=NULL) - pGridWin[SC_SPLIT_TOPRIGHT]->EnableInput(bFlag,false); - if(pColBar[SC_SPLIT_RIGHT]!=NULL) - pColBar[SC_SPLIT_RIGHT]->EnableInput(bFlag,false); - if(pRowBar[SC_SPLIT_TOP]!=NULL) - pRowBar[SC_SPLIT_TOP]->EnableInput(bFlag,false); -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |