LCOV - code coverage report
Current view: top level - sc/source/ui/view - viewdata.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1004 1714 58.6 %
Date: 2015-06-13 12:38:46 Functions: 70 107 65.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "scitems.hxx"
      21             : #include <editeng/eeitem.hxx>
      22             : 
      23             : #include <sfx2/viewfrm.hxx>
      24             : #include <editeng/adjustitem.hxx>
      25             : #include <svx/algitem.hxx>
      26             : #include <editeng/brushitem.hxx>
      27             : #include <svtools/colorcfg.hxx>
      28             : #include <editeng/editview.hxx>
      29             : #include <editeng/editstat.hxx>
      30             : #include <editeng/outliner.hxx>
      31             : #include <editeng/unolingu.hxx>
      32             : #include <editeng/justifyitem.hxx>
      33             : 
      34             : #include <vcl/svapp.hxx>
      35             : #include <rtl/math.hxx>
      36             : 
      37             : #include <sax/tools/converter.hxx>
      38             : 
      39             : #include "viewdata.hxx"
      40             : #include "docoptio.hxx"
      41             : #include "scmod.hxx"
      42             : #include "global.hxx"
      43             : #include "document.hxx"
      44             : #include "attrib.hxx"
      45             : #include "tabview.hxx"
      46             : #include "tabvwsh.hxx"
      47             : #include "docsh.hxx"
      48             : #include "sc.hrc"
      49             : #include "patattr.hxx"
      50             : #include "editutil.hxx"
      51             : #include "scextopt.hxx"
      52             : #include "miscuno.hxx"
      53             : #include "unonames.hxx"
      54             : #include "inputopt.hxx"
      55             : #include "viewutil.hxx"
      56             : #include "markdata.hxx"
      57             : #include "stlalgorithm.hxx"
      58             : #include "ViewSettingsSequenceDefines.hxx"
      59             : #include <gridwin.hxx>
      60             : #include <rtl/ustrbuf.hxx>
      61             : #include <boost/checked_delete.hpp>
      62             : #include <comphelper/processfactory.hxx>
      63             : #include <comphelper/string.hxx>
      64             : 
      65             : #include <com/sun/star/container/XNameContainer.hpp>
      66             : #include <com/sun/star/document/NamedPropertyValues.hpp>
      67             : 
      68             : using namespace com::sun::star;
      69             : 
      70             : #define SC_GROWY_SMALL_EXTRA    100
      71             : #define SC_GROWY_BIG_EXTRA      200
      72             : 
      73             : #define TAG_TABBARWIDTH "tw:"
      74             : 
      75             : static bool bMoveArea = false;                  // Member?
      76             : sal_uInt16 nEditAdjust = SVX_ADJUST_LEFT;       // Member!
      77             : 
      78         523 : ScViewDataTable::ScViewDataTable() :
      79             :                 eZoomType( SvxZoomType::PERCENT ),
      80             :                 aZoomX( 1,1 ),
      81             :                 aZoomY( 1,1 ),
      82             :                 aPageZoomX( 3,5 ),              // Page-Default: 60%
      83             :                 aPageZoomY( 3,5 ),
      84             :                 nHSplitPos( 0 ),
      85             :                 nVSplitPos( 0 ),
      86             :                 eHSplitMode( SC_SPLIT_NONE ),
      87             :                 eVSplitMode( SC_SPLIT_NONE ),
      88             :                 eWhichActive( SC_SPLIT_BOTTOMLEFT ),
      89             :                 nFixPosX( 0 ),
      90             :                 nFixPosY( 0 ),
      91             :                 nCurX( 0 ),
      92             :                 nCurY( 0 ),
      93             :                 nOldCurX( 0 ),
      94             :                 nOldCurY( 0 ),
      95             :                 bShowGrid( true ),
      96         523 :                 mbOldCursorValid( false )
      97             : {
      98         523 :     nPosX[0]=nPosX[1]=0;
      99         523 :     nPosY[0]=nPosY[1]=0;
     100         523 :     nTPosX[0]=nTPosX[1]=0;
     101         523 :     nTPosY[0]=nTPosY[1]=0;
     102         523 :     nMPosX[0]=nMPosX[1]=0;
     103         523 :     nMPosY[0]=nMPosY[1]=0;
     104         523 :     nPixPosX[0]=nPixPosX[1]=0;
     105         523 :     nPixPosY[0]=nPixPosY[1]=0;
     106         523 : }
     107             : 
     108         517 : ScViewDataTable::~ScViewDataTable()
     109             : {
     110         517 : }
     111             : 
     112         292 : void ScViewDataTable::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rSettings, const ScViewData& /*rViewData*/, SCTAB /*nTab*/) const
     113             : {
     114         292 :     rSettings.realloc(SC_TABLE_VIEWSETTINGS_COUNT);
     115         292 :     beans::PropertyValue* pSettings = rSettings.getArray();
     116         292 :     if (pSettings)
     117             :     {
     118         292 :         pSettings[SC_CURSOR_X].Name = SC_CURSORPOSITIONX;
     119         292 :         pSettings[SC_CURSOR_X].Value <<= sal_Int32(nCurX);
     120         292 :         pSettings[SC_CURSOR_Y].Name = SC_CURSORPOSITIONY;
     121         292 :         pSettings[SC_CURSOR_Y].Value <<= sal_Int32(nCurY);
     122         292 :         pSettings[SC_HORIZONTAL_SPLIT_MODE].Name = SC_HORIZONTALSPLITMODE;
     123         292 :         pSettings[SC_HORIZONTAL_SPLIT_MODE].Value <<= sal_Int16(eHSplitMode);
     124         292 :         pSettings[SC_VERTICAL_SPLIT_MODE].Name = SC_VERTICALSPLITMODE;
     125         292 :         pSettings[SC_VERTICAL_SPLIT_MODE].Value <<= sal_Int16(eVSplitMode);
     126         292 :         pSettings[SC_HORIZONTAL_SPLIT_POSITION].Name = SC_HORIZONTALSPLITPOSITION;
     127         292 :         if (eHSplitMode == SC_SPLIT_FIX)
     128           0 :             pSettings[SC_HORIZONTAL_SPLIT_POSITION].Value <<= sal_Int32(nFixPosX);
     129             :         else
     130         292 :             pSettings[SC_HORIZONTAL_SPLIT_POSITION].Value <<= sal_Int32(nHSplitPos);
     131         292 :         pSettings[SC_VERTICAL_SPLIT_POSITION].Name = SC_VERTICALSPLITPOSITION;
     132         292 :         if (eVSplitMode == SC_SPLIT_FIX)
     133           0 :             pSettings[SC_VERTICAL_SPLIT_POSITION].Value <<= sal_Int32(nFixPosY);
     134             :         else
     135         292 :             pSettings[SC_VERTICAL_SPLIT_POSITION].Value <<= sal_Int32(nVSplitPos);
     136         292 :         pSettings[SC_ACTIVE_SPLIT_RANGE].Name = SC_ACTIVESPLITRANGE;
     137         292 :         pSettings[SC_ACTIVE_SPLIT_RANGE].Value <<= sal_Int16(eWhichActive);
     138         292 :         pSettings[SC_POSITION_LEFT].Name = SC_POSITIONLEFT;
     139         292 :         pSettings[SC_POSITION_LEFT].Value <<= sal_Int32(nPosX[SC_SPLIT_LEFT]);
     140         292 :         pSettings[SC_POSITION_RIGHT].Name = SC_POSITIONRIGHT;
     141         292 :         pSettings[SC_POSITION_RIGHT].Value <<= sal_Int32(nPosX[SC_SPLIT_RIGHT]);
     142         292 :         pSettings[SC_POSITION_TOP].Name = SC_POSITIONTOP;
     143         292 :         pSettings[SC_POSITION_TOP].Value <<= sal_Int32(nPosY[SC_SPLIT_TOP]);
     144         292 :         pSettings[SC_POSITION_BOTTOM].Name = SC_POSITIONBOTTOM;
     145         292 :         pSettings[SC_POSITION_BOTTOM].Value <<= sal_Int32(nPosY[SC_SPLIT_BOTTOM]);
     146             : 
     147         292 :         sal_Int32 nZoomValue ((aZoomY.GetNumerator() * 100) / aZoomY.GetDenominator());
     148         292 :         sal_Int32 nPageZoomValue ((aPageZoomY.GetNumerator() * 100) / aPageZoomY.GetDenominator());
     149         292 :         pSettings[SC_TABLE_ZOOM_TYPE].Name = SC_ZOOMTYPE;
     150         292 :         pSettings[SC_TABLE_ZOOM_TYPE].Value <<= sal_Int16(eZoomType);
     151         292 :         pSettings[SC_TABLE_ZOOM_VALUE].Name = SC_ZOOMVALUE;
     152         292 :         pSettings[SC_TABLE_ZOOM_VALUE].Value <<= nZoomValue;
     153         292 :         pSettings[SC_TABLE_PAGE_VIEW_ZOOM_VALUE].Name = SC_PAGEVIEWZOOMVALUE;
     154         292 :         pSettings[SC_TABLE_PAGE_VIEW_ZOOM_VALUE].Value <<= nPageZoomValue;
     155             : 
     156         292 :         pSettings[SC_TABLE_SHOWGRID].Name = SC_UNO_SHOWGRID;
     157         292 :         pSettings[SC_TABLE_SHOWGRID].Value <<= bShowGrid;
     158             :     }
     159         292 : }
     160             : 
     161         471 : void ScViewDataTable::ReadUserDataSequence(const uno::Sequence <beans::PropertyValue>& aSettings, ScViewData& rViewData, SCTAB nTab, bool& rHasZoom )
     162             : {
     163         471 :     rHasZoom = false;
     164             : 
     165         471 :     sal_Int32 nCount(aSettings.getLength());
     166         471 :     sal_Int32 nTemp32(0);
     167         471 :     sal_Int16 nTemp16(0);
     168         471 :     sal_Int32 nTempPosV(0);
     169         471 :     sal_Int32 nTempPosH(0);
     170         471 :     sal_Int32 nTempPosVTw(0);
     171         471 :     sal_Int32 nTempPosHTw(0);
     172         471 :     bool bHasVSplitInTwips = false;
     173         471 :     bool bHasHSplitInTwips = false;
     174        8557 :     for (sal_Int32 i = 0; i < nCount; i++)
     175             :     {
     176        8086 :         OUString sName(aSettings[i].Name);
     177        8086 :         if (sName == SC_CURSORPOSITIONX)
     178             :         {
     179         471 :             aSettings[i].Value >>= nTemp32;
     180         471 :             nCurX = SanitizeCol( static_cast<SCCOL>(nTemp32));
     181             :         }
     182        7615 :         else if (sName == SC_CURSORPOSITIONY)
     183             :         {
     184         471 :             aSettings[i].Value >>= nTemp32;
     185         471 :             nCurY = SanitizeRow( static_cast<SCROW>(nTemp32));
     186             :         }
     187        7144 :         else if (sName == SC_HORIZONTALSPLITMODE)
     188             :         {
     189         471 :             aSettings[i].Value >>= nTemp16;
     190         471 :             eHSplitMode = static_cast<ScSplitMode>(nTemp16);
     191             :         }
     192        6673 :         else if (sName == SC_VERTICALSPLITMODE)
     193             :         {
     194         471 :             aSettings[i].Value >>= nTemp16;
     195         471 :             eVSplitMode = static_cast<ScSplitMode>(nTemp16);
     196             :         }
     197        6202 :         else if (sName == SC_HORIZONTALSPLITPOSITION)
     198             :         {
     199         364 :             aSettings[i].Value >>= nTempPosH;
     200         364 :             bHasHSplitInTwips = false;
     201             :         }
     202        5838 :         else if (sName == SC_VERTICALSPLITPOSITION)
     203             :         {
     204         364 :             aSettings[i].Value >>= nTempPosV;
     205         364 :             bHasVSplitInTwips = false;
     206             :         }
     207        5474 :         else if (sName == SC_HORIZONTALSPLITPOSITION_TWIPS)
     208             :         {
     209         107 :             aSettings[i].Value >>= nTempPosHTw;
     210         107 :             bHasHSplitInTwips = true;
     211             :         }
     212        5367 :         else if (sName == SC_VERTICALSPLITPOSITION_TWIPS)
     213             :         {
     214         107 :             aSettings[i].Value >>= nTempPosVTw;
     215         107 :             bHasVSplitInTwips = true;
     216             :         }
     217        5260 :         else if (sName == SC_ACTIVESPLITRANGE)
     218             :         {
     219         471 :             aSettings[i].Value >>= nTemp16;
     220         471 :             eWhichActive = static_cast<ScSplitPos>(nTemp16);
     221             :         }
     222        4789 :         else if (sName == SC_POSITIONLEFT)
     223             :         {
     224         471 :             aSettings[i].Value >>= nTemp32;
     225         471 :             nPosX[SC_SPLIT_LEFT] = SanitizeCol( static_cast<SCCOL>(nTemp32));
     226             :         }
     227        4318 :         else if (sName == SC_POSITIONRIGHT)
     228             :         {
     229         471 :             aSettings[i].Value >>= nTemp32;
     230         471 :             nPosX[SC_SPLIT_RIGHT] = SanitizeCol( static_cast<SCCOL>(nTemp32));
     231             :         }
     232        3847 :         else if (sName == SC_POSITIONTOP)
     233             :         {
     234         471 :             aSettings[i].Value >>= nTemp32;
     235         471 :             nPosY[SC_SPLIT_TOP] = SanitizeRow( static_cast<SCROW>(nTemp32));
     236             :         }
     237        3376 :         else if (sName == SC_POSITIONBOTTOM)
     238             :         {
     239         471 :             aSettings[i].Value >>= nTemp32;
     240         471 :             nPosY[SC_SPLIT_BOTTOM] = SanitizeRow( static_cast<SCROW>(nTemp32));
     241             :         }
     242        2905 :         else if (sName == SC_ZOOMTYPE)
     243             :         {
     244         471 :             aSettings[i].Value >>= nTemp16;
     245         471 :             eZoomType = SvxZoomType(nTemp16);
     246         471 :             rHasZoom = true;        // set if there is any zoom information
     247             :         }
     248        2434 :         else if (sName == SC_ZOOMVALUE)
     249             :         {
     250         471 :             aSettings[i].Value >>= nTemp32;
     251         471 :             Fraction aZoom(nTemp32, 100);
     252         471 :             aZoomX = aZoomY = aZoom;
     253         471 :             rHasZoom = true;
     254             :         }
     255        1963 :         else if (sName == SC_PAGEVIEWZOOMVALUE)
     256             :         {
     257         471 :             aSettings[i].Value >>= nTemp32;
     258         471 :             Fraction aZoom(nTemp32, 100);
     259         471 :             aPageZoomX = aPageZoomY = aZoom;
     260         471 :             rHasZoom = true;
     261             :         }
     262        1492 :         else if (sName == SC_UNO_SHOWGRID)
     263             :         {
     264         471 :             aSettings[i].Value >>= bShowGrid;
     265             :         }
     266        1021 :         else if (sName == SC_TABLESELECTED)
     267             :         {
     268         107 :             bool bSelected = false;
     269         107 :             aSettings[i].Value >>= bSelected;
     270         107 :             rViewData.GetMarkData().SelectTable( nTab, bSelected );
     271             :         }
     272         914 :         else if (sName == SC_UNONAME_TABCOLOR)
     273             :         {
     274             :             // There are documents out there that have their tab color defined as a view setting.
     275           0 :             sal_Int32 nColor = COL_AUTO;
     276           0 :             aSettings[i].Value >>= nColor;
     277           0 :             if (static_cast<ColorData>(nColor) != COL_AUTO)
     278             :             {
     279           0 :                 ScDocument* pDoc = rViewData.GetDocument();
     280           0 :                 pDoc->SetTabBgColor(nTab, Color(static_cast<ColorData>(nColor)));
     281             :             }
     282             :         }
     283        8086 :     }
     284         471 :     if (eHSplitMode == SC_SPLIT_FIX)
     285           0 :         nFixPosX = SanitizeCol( static_cast<SCCOL>( bHasHSplitInTwips ? nTempPosHTw : nTempPosH ));
     286             :     else
     287         471 :         nHSplitPos = bHasHSplitInTwips ? static_cast< long >( nTempPosHTw * rViewData.GetPPTX() ) : nTempPosH;
     288             : 
     289         471 :     if (eVSplitMode == SC_SPLIT_FIX)
     290           0 :         nFixPosY = SanitizeRow( static_cast<SCROW>( bHasVSplitInTwips ? nTempPosVTw : nTempPosV ));
     291             :     else
     292         471 :         nVSplitPos = bHasVSplitInTwips ? static_cast< long >( nTempPosVTw * rViewData.GetPPTY() ) : nTempPosV;
     293         471 : }
     294             : 
     295         353 : ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh ) :
     296         353 :         mpMarkData(new ScMarkData),
     297             :         pDocShell   ( pDocSh ),
     298             :         pDoc        ( NULL ),
     299             :         pView       ( pViewSh ),
     300             :         pViewShell  ( pViewSh ),
     301         353 :         pOptions    ( new ScViewOptions ),
     302             :         pSpellingView ( NULL ),
     303             :         aLogicMode  ( MAP_100TH_MM ),
     304             :         eDefZoomType( SvxZoomType::PERCENT ),
     305             :         aDefZoomX   ( 1,1 ),
     306             :         aDefZoomY   ( 1,1 ),
     307             :         aDefPageZoomX( 3,5 ),
     308             :         aDefPageZoomY( 3,5 ),
     309             :         eRefType    ( SC_REFTYPE_NONE ),
     310             :         nTabNo      ( 0 ),
     311             :         nRefTabNo   ( 0 ),
     312             :         nRefStartX(0),
     313             :         nRefStartY(0),
     314             :         nRefStartZ(0),
     315             :         nRefEndX(0),
     316             :         nRefEndY(0),
     317             :         nRefEndZ(0),
     318             :         nFillStartX(0),
     319             :         nFillStartY(0),
     320             :         nFillEndX(0),
     321             :         nFillEndY(0),
     322             :         nPasteFlags ( SC_PASTE_NONE ),
     323             :         eEditActivePart( SC_SPLIT_BOTTOMLEFT ),
     324             :         nFillMode   ( SC_FILL_NONE ),
     325             :         bActive     ( true ),                   // how to initialize?
     326             :         bIsRefMode  ( false ),
     327             :         bDelMarkValid( false ),
     328             :         bPagebreak  ( false ),
     329        1059 :         bSelCtrlMouseClick( false )
     330             : {
     331         353 :     mpMarkData->SelectOneTable(0); // Sync with nTabNo
     332             : 
     333         353 :     SetGridMode     ( true );
     334         353 :     SetSyntaxMode   ( false );
     335         353 :     SetHeaderMode   ( true );
     336         353 :     SetTabMode      ( true );
     337         353 :     SetVScrollMode  ( true );
     338         353 :     SetHScrollMode  ( true );
     339         353 :     SetOutlineMode  ( true );
     340             : 
     341             :     aScrSize = Size( (long) ( STD_COL_WIDTH           * PIXEL_PER_TWIPS * OLE_STD_CELLS_X ),
     342         353 :                      (long) ( ScGlobal::nStdRowHeight * PIXEL_PER_TWIPS * OLE_STD_CELLS_Y ) );
     343         353 :     maTabData.push_back( new ScViewDataTable );
     344         353 :     pThisTab = maTabData[nTabNo];
     345        1765 :     for (sal_uInt16 j=0; j<4; j++)
     346             :     {
     347        1412 :         pEditView[j] = NULL;
     348        1412 :         bEditActive[j] = false;
     349             :     }
     350             : 
     351         353 :     nEditEndCol = nEditStartCol = nEditCol = 0;
     352         353 :     nEditEndRow = nEditRow = 0;
     353         353 :     nTabStartCol = SC_TABSTART_NONE;
     354             : 
     355         353 :     if (pDocShell)
     356             :     {
     357         353 :         pDoc = &pDocShell->GetDocument();
     358         353 :         *pOptions = pDoc->GetViewOptions();
     359             :     }
     360             : 
     361             :     // don't show hidden tables
     362         353 :     if (pDoc && !pDoc->IsVisible(nTabNo))
     363             :     {
     364           0 :         while ( !pDoc->IsVisible(nTabNo) && pDoc->HasTable(nTabNo+1) )
     365             :         {
     366           0 :             ++nTabNo;
     367           0 :             maTabData.push_back(NULL);
     368             :         }
     369           0 :         maTabData[nTabNo] = new ScViewDataTable() ;
     370           0 :         pThisTab = maTabData[nTabNo];
     371             :     }
     372             : 
     373         353 :     CalcPPT();
     374         353 : }
     375             : 
     376           0 : ScViewData::ScViewData( const ScViewData& rViewData ) :
     377             :         maTabData( rViewData.maTabData ),
     378           0 :         mpMarkData(new ScMarkData(*rViewData.mpMarkData)),
     379             :         pDocShell   ( rViewData.pDocShell ),
     380             :         pDoc        ( rViewData.pDoc ),
     381             :         pView       ( rViewData.pView ),
     382             :         pViewShell  ( rViewData.pViewShell ),
     383           0 :         pOptions    ( new ScViewOptions( *(rViewData.pOptions) )  ),
     384             :         pSpellingView ( rViewData.pSpellingView ),
     385             :         aLogicMode  ( rViewData.aLogicMode ),
     386             :         eDefZoomType( rViewData.eDefZoomType ),
     387             :         aDefZoomX   ( rViewData.aDefZoomX ),
     388             :         aDefZoomY   ( rViewData.aDefZoomY ),
     389             :         aDefPageZoomX( rViewData.aDefPageZoomX ),
     390             :         aDefPageZoomY( rViewData.aDefPageZoomY ),
     391             :         eRefType    ( SC_REFTYPE_NONE ),
     392             :         nTabNo      ( rViewData.nTabNo ),
     393             :         nRefTabNo   ( rViewData.nTabNo ),           // no RefMode
     394             :         nRefStartX(0),
     395             :         nRefStartY(0),
     396             :         nRefStartZ(0),
     397             :         nRefEndX(0),
     398             :         nRefEndY(0),
     399             :         nRefEndZ(0),
     400             :         nFillStartX(0),
     401             :         nFillStartY(0),
     402             :         nFillEndX(0),
     403             :         nFillEndY(0),
     404             :         nPasteFlags ( SC_PASTE_NONE ),
     405             :         eEditActivePart( rViewData.eEditActivePart ),
     406             :         nFillMode   ( SC_FILL_NONE ),
     407             :         bActive     ( true ),                               // how to initialize?
     408             :         bIsRefMode  ( false ),
     409             :         bDelMarkValid( false ),
     410             :         bPagebreak  ( rViewData.bPagebreak ),
     411           0 :         bSelCtrlMouseClick( rViewData.bSelCtrlMouseClick )
     412             : {
     413             : 
     414           0 :     SetGridMode     ( rViewData.IsGridMode() );
     415           0 :     SetSyntaxMode   ( rViewData.IsSyntaxMode() );
     416           0 :     SetHeaderMode   ( rViewData.IsHeaderMode() );
     417           0 :     SetTabMode      ( rViewData.IsTabMode() );
     418           0 :     SetVScrollMode  ( rViewData.IsVScrollMode() );
     419           0 :     SetHScrollMode  ( rViewData.IsHScrollMode() );
     420           0 :     SetOutlineMode  ( rViewData.IsOutlineMode() );
     421             : 
     422           0 :     aScrSize = rViewData.aScrSize;
     423             : 
     424           0 :     pThisTab = maTabData[nTabNo];
     425           0 :     for (sal_uInt16 j=0; j<4; j++)
     426             :     {
     427           0 :         pEditView[j] = NULL;
     428           0 :         bEditActive[j] = false;
     429             :     }
     430             : 
     431           0 :     nEditEndCol = nEditStartCol = nEditCol = 0;
     432           0 :     nEditEndRow = nEditRow = 0;
     433           0 :     nTabStartCol = SC_TABSTART_NONE;
     434           0 :     CalcPPT();
     435           0 : }
     436             : 
     437           0 : void ScViewData::InitData( ScDocument* pDocument )
     438             : {
     439           0 :     pDoc = pDocument;
     440           0 :     *pOptions = pDoc->GetViewOptions();
     441           0 : }
     442             : 
     443      276954 : ScDocument* ScViewData::GetDocument() const
     444             : {
     445      276954 :     if (pDoc)
     446      276954 :         return pDoc;
     447           0 :     else if (pDocShell)
     448           0 :         return &pDocShell->GetDocument();
     449             : 
     450             :     OSL_FAIL("kein Document an ViewData");
     451           0 :     return NULL;
     452             : }
     453             : 
     454         700 : ScViewData::~ScViewData()
     455             : {
     456         350 :     KillEditView();
     457         350 :     delete pOptions;
     458             :     ::std::for_each(
     459         350 :         maTabData.begin(), maTabData.end(), boost::checked_deleter<ScViewDataTable>());
     460         350 : }
     461             : 
     462          64 : void ScViewData::UpdateCurrentTab()
     463             : {
     464          64 :     pThisTab = maTabData[nTabNo];
     465         128 :     while (!pThisTab)
     466             :     {
     467           0 :         if (nTabNo > 0)
     468           0 :             pThisTab = maTabData[--nTabNo];
     469             :         else
     470           0 :             pThisTab = maTabData[0] = new ScViewDataTable;
     471             :     }
     472          64 : }
     473             : 
     474          46 : void ScViewData::InsertTab( SCTAB nTab )
     475             : {
     476          46 :     if( nTab >= static_cast<SCTAB>(maTabData.size()))
     477           0 :         maTabData.resize(nTab+1, NULL);
     478             :     else
     479          46 :         maTabData.insert( maTabData.begin() + nTab, nullptr );
     480          46 :     CreateTabData( nTab );
     481             : 
     482          46 :     UpdateCurrentTab();
     483          46 :     mpMarkData->InsertTab( nTab );
     484          46 : }
     485             : 
     486           0 : void ScViewData::InsertTabs( SCTAB nTab, SCTAB nNewSheets )
     487             : {
     488           0 :     if( nTab+nNewSheets >= static_cast<SCTAB>(maTabData.size()))
     489           0 :         maTabData.resize(nTab+nNewSheets, NULL);
     490             :     else
     491             :     {
     492           0 :         maTabData.insert( maTabData.begin() + nTab, nNewSheets, NULL );
     493             :     }
     494           0 :     for (SCTAB i = nTab; i < nTab + nNewSheets; ++i)
     495             :     {
     496           0 :         CreateTabData( i );
     497           0 :         mpMarkData->InsertTab( i );
     498             :     }
     499           0 :     UpdateCurrentTab();
     500           0 : }
     501             : 
     502          18 : void ScViewData::DeleteTab( SCTAB nTab )
     503             : {
     504          18 :     delete maTabData.at(nTab);
     505             : 
     506          18 :     maTabData.erase(maTabData.begin() + nTab);
     507          18 :     UpdateCurrentTab();
     508          18 :     mpMarkData->DeleteTab( nTab );
     509          18 : }
     510             : 
     511           0 : void ScViewData::DeleteTabs( SCTAB nTab, SCTAB nSheets )
     512             : {
     513           0 :     for (SCTAB i = 0; i < nSheets; ++i)
     514             :     {
     515           0 :         mpMarkData->DeleteTab( nTab + i );
     516           0 :         delete maTabData.at(nTab + i);
     517             :     }
     518             : 
     519           0 :     maTabData.erase(maTabData.begin() + nTab, maTabData.begin()+ nTab+nSheets);
     520           0 :     UpdateCurrentTab();
     521           0 : }
     522             : 
     523           0 : void ScViewData::CopyTab( SCTAB nSrcTab, SCTAB nDestTab )
     524             : {
     525           0 :     if (nDestTab==SC_TAB_APPEND)
     526           0 :         nDestTab = pDoc->GetTableCount() - 1;   // something had to have been copied
     527             : 
     528           0 :     if (nDestTab > MAXTAB)
     529             :     {
     530             :         OSL_FAIL("Zuviele Tabellen");
     531           0 :         return;
     532             :     }
     533             : 
     534           0 :     if (nSrcTab >= static_cast<SCTAB>(maTabData.size()))
     535             :         OSL_FAIL("pTabData out of bounds, FIX IT");
     536             : 
     537           0 :     EnsureTabDataSize(nDestTab + 1);
     538             : 
     539           0 :     if ( maTabData[nSrcTab] )
     540           0 :         maTabData.insert(maTabData.begin() + nDestTab, new ScViewDataTable( *maTabData[nSrcTab] ));
     541             :     else
     542           0 :         maTabData.insert(maTabData.begin() + nDestTab, nullptr);
     543             : 
     544           0 :     UpdateCurrentTab();
     545           0 :     mpMarkData->InsertTab( nDestTab );
     546             : }
     547             : 
     548           0 : void ScViewData::MoveTab( SCTAB nSrcTab, SCTAB nDestTab )
     549             : {
     550           0 :     if (nDestTab==SC_TAB_APPEND)
     551           0 :         nDestTab = pDoc->GetTableCount() - 1;
     552           0 :     ScViewDataTable* pTab = NULL;
     553           0 :     if (nSrcTab < static_cast<SCTAB>(maTabData.size()))
     554             :     {
     555           0 :         pTab = maTabData[nSrcTab];
     556           0 :         maTabData.erase( maTabData.begin() + nSrcTab );
     557             :     }
     558             : 
     559           0 :     if (nDestTab < static_cast<SCTAB>(maTabData.size()))
     560           0 :         maTabData.insert( maTabData.begin() + nDestTab, pTab );
     561             :     else
     562             :     {
     563           0 :         EnsureTabDataSize(nDestTab + 1);
     564           0 :         maTabData[nDestTab] = pTab;
     565             :     }
     566             : 
     567           0 :     UpdateCurrentTab();
     568           0 :     mpMarkData->DeleteTab( nSrcTab );
     569           0 :     mpMarkData->InsertTab( nDestTab );            // adapted if needed
     570           0 : }
     571             : 
     572           2 : void ScViewData::CreateTabData( std::vector< SCTAB >& rvTabs )
     573             : {
     574           2 :     std::vector< SCTAB >::iterator it_end = rvTabs.end();
     575           4 :     for ( std::vector< SCTAB >::iterator it = rvTabs.begin(); it != it_end; ++it )
     576           2 :         CreateTabData(*it);
     577           2 : }
     578             : 
     579         348 : void ScViewData::SetZoomType( SvxZoomType eNew, std::vector< SCTAB >& tabs )
     580             : {
     581         348 :     bool bAll = ( tabs.empty() );
     582             : 
     583         348 :     if ( !bAll ) // create associated table data
     584           0 :         CreateTabData( tabs );
     585             : 
     586         348 :     if ( bAll )
     587             :     {
     588         696 :         for ( SCTAB i = 0; i < static_cast<SCTAB>(maTabData.size()); ++i )
     589             :         {
     590         348 :             if ( maTabData[i] )
     591         348 :                 maTabData[i]->eZoomType = eNew;
     592             :         }
     593         348 :         eDefZoomType = eNew;
     594             :     }
     595             :     else
     596             :     {
     597           0 :         std::vector< SCTAB >::iterator it_end = tabs.end();
     598           0 :         std::vector< SCTAB >::iterator it = tabs.begin();
     599           0 :         for ( ; it != it_end; ++it )
     600             :         {
     601           0 :             SCTAB i = *it;
     602           0 :             if ( i < static_cast<SCTAB>(maTabData.size()) && maTabData[i] )
     603           0 :                 maTabData[i]->eZoomType = eNew;
     604             :         }
     605             :     }
     606         348 : }
     607             : 
     608         348 : void ScViewData::SetZoomType( SvxZoomType eNew, bool bAll )
     609             : {
     610         348 :     std::vector< SCTAB > vTabs; // Empty for all tabs
     611         348 :     if ( !bAll ) // get selected tabs
     612             :     {
     613           0 :         ScMarkData::iterator itr = mpMarkData->begin(), itrEnd = mpMarkData->end();
     614           0 :         vTabs.insert(vTabs.begin(), itr, itrEnd);
     615             :     }
     616         348 :     SetZoomType( eNew, vTabs );
     617         348 : }
     618             : 
     619         350 : void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, std::vector< SCTAB >& tabs )
     620             : {
     621         350 :     bool bAll = ( tabs.empty() );
     622         350 :     if ( !bAll ) // create associated table data
     623           2 :         CreateTabData( tabs );
     624             : 
     625             :     // sanity check - we shouldn't need something this low / big
     626             :     assert(rNewX > Fraction(1, 100) && rNewX < Fraction(100, 1));
     627             :     assert(rNewY > Fraction(1, 100) && rNewY < Fraction(100, 1));
     628             : 
     629         350 :     if ( bAll )
     630             :     {
     631         696 :         for ( SCTAB i = 0; i < static_cast<SCTAB>(maTabData.size()); ++i )
     632             :         {
     633         348 :             if ( maTabData[i] )
     634             :             {
     635         348 :                 if ( bPagebreak )
     636             :                 {
     637           0 :                     maTabData[i]->aPageZoomX = rNewX;
     638           0 :                     maTabData[i]->aPageZoomY = rNewY;
     639             :                 }
     640             :                 else
     641             :                 {
     642         348 :                     maTabData[i]->aZoomX = rNewX;
     643         348 :                     maTabData[i]->aZoomY = rNewY;
     644             :                 }
     645             :             }
     646             :         }
     647         348 :         if ( bPagebreak )
     648             :         {
     649           0 :             aDefPageZoomX = rNewX;
     650           0 :             aDefPageZoomY = rNewY;
     651             :         }
     652             :         else
     653             :         {
     654         348 :             aDefZoomX = rNewX;
     655         348 :             aDefZoomY = rNewY;
     656             :         }
     657             :     }
     658             :     else
     659             :     {
     660           2 :         std::vector< SCTAB >::iterator it_end = tabs.end();
     661           2 :         std::vector< SCTAB >::iterator it = tabs.begin();
     662           4 :         for ( ; it != it_end; ++it )
     663             :         {
     664           2 :             SCTAB i = *it;
     665           2 :             if ( i < static_cast<SCTAB>(maTabData.size()) && maTabData[i] )
     666             :             {
     667           2 :                 if ( bPagebreak )
     668             :                 {
     669           0 :                     maTabData[i]->aPageZoomX = rNewX;
     670           0 :                     maTabData[i]->aPageZoomY = rNewY;
     671             :                 }
     672             :                 else
     673             :                 {
     674           2 :                     maTabData[i]->aZoomX = rNewX;
     675           2 :                     maTabData[i]->aZoomY = rNewY;
     676             :                 }
     677             :             }
     678             :         }
     679             :     }
     680         350 :     RefreshZoom();
     681         350 : }
     682             : 
     683         348 : void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, bool bAll )
     684             : {
     685         348 :     std::vector< SCTAB > vTabs;
     686         348 :     if ( !bAll ) // get selected tabs
     687             :     {
     688           0 :         ScMarkData::iterator itr = mpMarkData->begin(), itrEnd = mpMarkData->end();
     689           0 :         vTabs.insert(vTabs.begin(), itr, itrEnd);
     690             :     }
     691         348 :     SetZoom( rNewX, rNewY, vTabs );
     692         348 : }
     693             : 
     694           0 : void ScViewData::SetShowGrid( bool bShow )
     695             : {
     696           0 :     CreateSelectedTabData();
     697           0 :     maTabData[nTabNo]->bShowGrid = bShow;
     698           0 : }
     699             : 
     700        1354 : void ScViewData::RefreshZoom()
     701             : {
     702             :     // recalculate zoom-dependent values (only for current sheet)
     703             : 
     704        1354 :     CalcPPT();
     705        1354 :     RecalcPixPos();
     706        1354 :     aScenButSize = Size(0,0);
     707        1354 :     aLogicMode.SetScaleX( GetZoomX() );
     708        1354 :     aLogicMode.SetScaleY( GetZoomY() );
     709        1354 : }
     710             : 
     711         378 : void ScViewData::SetPagebreakMode( bool bSet )
     712             : {
     713         378 :     bPagebreak = bSet;
     714             : 
     715         378 :     RefreshZoom();
     716         378 : }
     717             : 
     718       12412 : ScMarkType ScViewData::GetSimpleArea( ScRange & rRange, ScMarkData & rNewMark ) const
     719             : {
     720       12412 :     ScMarkType eMarkType = SC_MARK_NONE;
     721             : 
     722       12412 :     if ( rNewMark.IsMarked() || rNewMark.IsMultiMarked() )
     723             :     {
     724        2057 :         if ( rNewMark.IsMultiMarked() )
     725          23 :             rNewMark.MarkToSimple();
     726             : 
     727        2057 :         if ( rNewMark.IsMarked() && !rNewMark.IsMultiMarked() )
     728             :         {
     729        2034 :             rNewMark.GetMarkArea( rRange );
     730        2034 :             if (ScViewUtil::HasFiltered( rRange, GetDocument()))
     731           0 :                 eMarkType = SC_MARK_SIMPLE_FILTERED;
     732             :             else
     733        2034 :                 eMarkType = SC_MARK_SIMPLE;
     734             :         }
     735             :         else
     736          23 :             eMarkType = SC_MARK_MULTI;
     737             :     }
     738       12412 :     if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED)
     739             :     {
     740       10378 :         if (eMarkType == SC_MARK_NONE)
     741       10355 :             eMarkType = SC_MARK_SIMPLE;
     742       10378 :         rRange = ScRange( GetCurX(), GetCurY(), GetTabNo() );
     743             :     }
     744       12412 :     return eMarkType;
     745             : }
     746             : 
     747        4022 : ScMarkType ScViewData::GetSimpleArea( SCCOL& rStartCol, SCROW& rStartRow, SCTAB& rStartTab,
     748             :                                 SCCOL& rEndCol, SCROW& rEndRow, SCTAB& rEndTab ) const
     749             : {
     750             :     //  parameter bMergeMark is no longer needed: The view's selection is never modified
     751             :     //  (a local copy is used), and a multi selection that adds to a single range can always
     752             :     //  be treated like a single selection (GetSimpleArea isn't used in selection
     753             :     //  handling itself)
     754             : 
     755        4022 :     ScRange aRange;
     756        4022 :     ScMarkData aNewMark(*mpMarkData);       // use a local copy for MarkToSimple
     757        4022 :     ScMarkType eMarkType = GetSimpleArea( aRange, aNewMark);
     758        4022 :     aRange.GetVars( rStartCol, rStartRow, rStartTab, rEndCol, rEndRow, rEndTab);
     759        4022 :     return eMarkType;
     760             : }
     761             : 
     762        8373 : ScMarkType ScViewData::GetSimpleArea( ScRange& rRange ) const
     763             : {
     764             :     //  parameter bMergeMark is no longer needed, see above
     765             : 
     766        8373 :     ScMarkData aNewMark(*mpMarkData);       // use a local copy for MarkToSimple
     767        8373 :     return GetSimpleArea( rRange, aNewMark);
     768             : }
     769             : 
     770          10 : void ScViewData::GetMultiArea( ScRangeListRef& rRange ) const
     771             : {
     772             :     //  parameter bMergeMark is no longer needed, see GetSimpleArea
     773             : 
     774          10 :     ScMarkData aNewMark(*mpMarkData);       // use a local copy for MarkToSimple
     775             : 
     776          10 :     bool bMulti = aNewMark.IsMultiMarked();
     777          10 :     if (bMulti)
     778             :     {
     779          10 :         aNewMark.MarkToSimple();
     780          10 :         bMulti = aNewMark.IsMultiMarked();
     781             :     }
     782          10 :     if (bMulti)
     783             :     {
     784          10 :         rRange = new ScRangeList;
     785          10 :         aNewMark.FillRangeListWithMarks( rRange, false );
     786             :     }
     787             :     else
     788             :     {
     789           0 :         ScRange aSimple;
     790           0 :         GetSimpleArea(aSimple);
     791           0 :         rRange = new ScRangeList;
     792           0 :         rRange->Append(aSimple);
     793          10 :     }
     794          10 : }
     795             : 
     796         498 : bool ScViewData::SimpleColMarked()
     797             : {
     798             :     SCCOL nStartCol;
     799             :     SCROW nStartRow;
     800             :     SCTAB nStartTab;
     801             :     SCCOL nEndCol;
     802             :     SCROW nEndRow;
     803             :     SCTAB nEndTab;
     804         498 :     if (GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) == SC_MARK_SIMPLE)
     805         498 :         if (nStartRow==0 && nEndRow==MAXROW)
     806           0 :             return true;
     807             : 
     808         498 :     return false;
     809             : }
     810             : 
     811         498 : bool ScViewData::SimpleRowMarked()
     812             : {
     813             :     SCCOL nStartCol;
     814             :     SCROW nStartRow;
     815             :     SCTAB nStartTab;
     816             :     SCCOL nEndCol;
     817             :     SCROW nEndRow;
     818             :     SCTAB nEndTab;
     819         498 :     if (GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) == SC_MARK_SIMPLE)
     820         498 :         if (nStartCol==0 && nEndCol==MAXCOL)
     821           0 :             return true;
     822             : 
     823         498 :     return false;
     824             : }
     825             : 
     826         996 : bool ScViewData::IsMultiMarked()
     827             : {
     828             :     // Test for "real" multi selection, calling MarkToSimple on a local copy,
     829             :     // and taking filtered in simple area marks into account.
     830             : 
     831         996 :     ScRange aDummy;
     832         996 :     ScMarkType eType = GetSimpleArea(aDummy);
     833         996 :     return (eType & SC_MARK_SIMPLE) != SC_MARK_SIMPLE;
     834             : }
     835             : 
     836           0 : void ScViewData::SetFillMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow )
     837             : {
     838           0 :     nFillMode   = SC_FILL_FILL;
     839           0 :     nFillStartX = nStartCol;
     840           0 :     nFillStartY = nStartRow;
     841           0 :     nFillEndX   = nEndCol;
     842           0 :     nFillEndY   = nEndRow;
     843           0 : }
     844             : 
     845           0 : void ScViewData::SetDragMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
     846             :                                 sal_uInt8 nMode )
     847             : {
     848           0 :     nFillMode   = nMode;
     849           0 :     nFillStartX = nStartCol;
     850           0 :     nFillStartY = nStartRow;
     851           0 :     nFillEndX   = nEndCol;
     852           0 :     nFillEndY   = nEndRow;
     853           0 : }
     854             : 
     855           0 : void ScViewData::ResetFillMode()
     856             : {
     857           0 :     nFillMode   = SC_FILL_NONE;
     858           0 : }
     859             : 
     860           0 : void ScViewData::GetFillData( SCCOL& rStartCol, SCROW& rStartRow,
     861             :                                 SCCOL& rEndCol, SCROW& rEndRow )
     862             : {
     863           0 :     rStartCol = nFillStartX;
     864           0 :     rStartRow = nFillStartY;
     865           0 :     rEndCol   = nFillEndX;
     866           0 :     rEndRow   = nFillEndY;
     867           0 : }
     868             : 
     869          49 : SCCOL ScViewData::GetOldCurX() const
     870             : {
     871          49 :     if (pThisTab->mbOldCursorValid)
     872           0 :         return pThisTab->nOldCurX;
     873             :     else
     874          49 :         return pThisTab->nCurX;
     875             : }
     876             : 
     877          50 : SCROW ScViewData::GetOldCurY() const
     878             : {
     879          50 :     if (pThisTab->mbOldCursorValid)
     880           0 :         return pThisTab->nOldCurY;
     881             :     else
     882          50 :         return pThisTab->nCurY;
     883             : }
     884             : 
     885           0 : void ScViewData::SetOldCursor( SCCOL nNewX, SCROW nNewY )
     886             : {
     887           0 :     pThisTab->nOldCurX = nNewX;
     888           0 :     pThisTab->nOldCurY = nNewY;
     889           0 :     pThisTab->mbOldCursorValid = true;
     890           0 : }
     891             : 
     892         891 : void ScViewData::ResetOldCursor()
     893             : {
     894         891 :     pThisTab->mbOldCursorValid = false;
     895         891 : }
     896             : 
     897           0 : Rectangle ScViewData::GetEditArea( ScSplitPos eWhich, SCCOL nPosX, SCROW nPosY,
     898             :                                     vcl::Window* pWin, const ScPatternAttr* pPattern,
     899             :                                     bool bForceToTop )
     900             : {
     901           0 :     return ScEditUtil( pDoc, nPosX, nPosY, nTabNo, GetScrPos(nPosX,nPosY,eWhich,true),
     902           0 :                         pWin, nPPTX, nPPTY, GetZoomX(), GetZoomY() ).
     903           0 :                             GetEditArea( pPattern, bForceToTop );
     904             : }
     905             : 
     906           0 : void ScViewData::SetEditEngine( ScSplitPos eWhich,
     907             :                                 ScEditEngineDefaulter* pNewEngine,
     908             :                                 vcl::Window* pWin, SCCOL nNewX, SCROW nNewY )
     909             : {
     910           0 :     bool bLayoutRTL = pDoc->IsLayoutRTL( nTabNo );
     911           0 :     ScHSplitPos eHWhich = WhichH(eWhich);
     912             : 
     913           0 :     bool bWasThere = false;
     914           0 :     if (pEditView[eWhich])
     915             :     {
     916             :         //  if the view is already therem don't call anything that changes the cursor position
     917           0 :         if (bEditActive[eWhich])
     918           0 :             bWasThere = true;
     919             :         else
     920           0 :             pEditView[eWhich]->SetEditEngine(pNewEngine);
     921             : 
     922           0 :         if (pEditView[eWhich]->GetWindow() != pWin)
     923             :         {
     924           0 :             pEditView[eWhich]->SetWindow(pWin);
     925             :             OSL_FAIL("EditView Window geaendert");
     926             :         }
     927             :     }
     928             :     else
     929             :     {
     930           0 :         pEditView[eWhich] = new EditView( pNewEngine, pWin );
     931             : 
     932           0 :         if (pDoc->GetDrawLayer() && pDoc->GetDrawLayer()->isTiledRendering())
     933             :         {
     934           0 :             pEditView[eWhich]->registerLibreOfficeKitCallback(pDoc->GetDrawLayer()->getLibreOfficeKitCallback(),
     935           0 :                                                               pDoc->GetDrawLayer()->getLibreOfficeKitData());
     936           0 :             pEditView[eWhich]->setTiledRendering(true);
     937             :         }
     938             :     }
     939             : 
     940             :     //  bei IdleFormat wird manchmal ein Cursor gemalt, wenn die View schon weg ist (23576)
     941             : 
     942           0 :     EEControlBits nEC = pNewEngine->GetControlWord();
     943           0 :     pNewEngine->SetControlWord(nEC & ~EEControlBits::DOIDLEFORMAT);
     944             : 
     945           0 :     EVControlBits nVC = pEditView[eWhich]->GetControlWord();
     946           0 :     pEditView[eWhich]->SetControlWord(nVC & ~EVControlBits::AUTOSCROLL);
     947             : 
     948           0 :     bEditActive[eWhich] = true;
     949             : 
     950           0 :     const ScPatternAttr* pPattern = pDoc->GetPattern( nNewX, nNewY, nTabNo );
     951             :     SvxCellHorJustify eJust = (SvxCellHorJustify)static_cast<const SvxHorJustifyItem&>(
     952           0 :                                     pPattern->GetItem( ATTR_HOR_JUSTIFY )).GetValue();
     953             : 
     954           0 :     bool bBreak = ( eJust == SVX_HOR_JUSTIFY_BLOCK ) ||
     955           0 :                     static_cast<const SfxBoolItem&>(pPattern->GetItem(ATTR_LINEBREAK)).GetValue();
     956             : 
     957           0 :     bool bAsianVertical = pNewEngine->IsVertical();     // set by InputHandler
     958             : 
     959           0 :     Rectangle aPixRect = ScEditUtil( pDoc, nNewX,nNewY,nTabNo, GetScrPos(nNewX,nNewY,eWhich),
     960           0 :                                         pWin, nPPTX,nPPTY,GetZoomX(),GetZoomY() ).
     961           0 :                                             GetEditArea( pPattern, true );
     962             : 
     963             :     //  when right-aligned, leave space for the cursor
     964             :     //  in vertical mode, editing is always right-aligned
     965           0 :     if ( nEditAdjust == SVX_ADJUST_RIGHT || bAsianVertical )
     966           0 :         aPixRect.Right() += 1;
     967             : 
     968           0 :     Rectangle aOutputArea = pWin->PixelToLogic( aPixRect, GetLogicMode() );
     969           0 :     pEditView[eWhich]->SetOutputArea( aOutputArea );
     970             : 
     971           0 :     if ( bActive && eWhich == GetActivePart() )
     972             :     {
     973             :         // keep the part that has the active edit view available after
     974             :         // switching sheets or reference input on a different part
     975           0 :         eEditActivePart = eWhich;
     976             : 
     977             :         //  modify members nEditCol etc. only if also extending for needed area
     978           0 :         nEditCol = nNewX;
     979           0 :         nEditRow = nNewY;
     980           0 :         const ScMergeAttr* pMergeAttr = static_cast<const ScMergeAttr*>(&pPattern->GetItem(ATTR_MERGE));
     981           0 :         nEditEndCol = nEditCol;
     982           0 :         if (pMergeAttr->GetColMerge() > 1)
     983           0 :             nEditEndCol += pMergeAttr->GetColMerge() - 1;
     984           0 :         nEditEndRow = nEditRow;
     985           0 :         if (pMergeAttr->GetRowMerge() > 1)
     986           0 :             nEditEndRow += pMergeAttr->GetRowMerge() - 1;
     987           0 :         nEditStartCol = nEditCol;
     988             : 
     989             :         //  For growing use only the alignment value from the attribute, numbers
     990             :         //  (existing or started) with default alignment extend to the right.
     991           0 :         bool bGrowCentered = ( eJust == SVX_HOR_JUSTIFY_CENTER );
     992           0 :         bool bGrowToLeft = ( eJust == SVX_HOR_JUSTIFY_RIGHT );      // visual left
     993           0 :         bool bGrowBackwards = bGrowToLeft;                          // logical left
     994           0 :         if ( bLayoutRTL )
     995           0 :             bGrowBackwards = !bGrowBackwards;                       // invert on RTL sheet
     996           0 :         if ( bAsianVertical )
     997           0 :             bGrowCentered = bGrowToLeft = bGrowBackwards = false;   // keep old behavior for asian mode
     998             : 
     999             :         long nSizeXPix;
    1000           0 :         if (bBreak && !bAsianVertical)
    1001           0 :             nSizeXPix = aPixRect.GetWidth();    // Papersize -> kein H-Scrolling
    1002             :         else
    1003             :         {
    1004             :             OSL_ENSURE(pView,"keine View fuer EditView");
    1005             : 
    1006           0 :             if ( bGrowCentered )
    1007             :             {
    1008             :                 //  growing into both directions until one edge is reached
    1009             :                 //! should be limited to whole cells in both directions
    1010           0 :                 long nLeft = aPixRect.Left();
    1011           0 :                 long nRight = pView->GetGridWidth(eHWhich) - aPixRect.Right();
    1012           0 :                 nSizeXPix = aPixRect.GetWidth() + 2 * std::min( nLeft, nRight );
    1013             :             }
    1014           0 :             else if ( bGrowToLeft )
    1015           0 :                 nSizeXPix = aPixRect.Right();   // space that's available in the window when growing to the left
    1016             :             else
    1017           0 :                 nSizeXPix = pView->GetGridWidth(eHWhich) - aPixRect.Left();
    1018             : 
    1019           0 :             if ( nSizeXPix <= 0 )
    1020           0 :                 nSizeXPix = aPixRect.GetWidth();    // editing outside to the right of the window -> keep cell width
    1021             :         }
    1022             :         OSL_ENSURE(pView,"keine View fuer EditView");
    1023           0 :         long nSizeYPix = pView->GetGridHeight(WhichV(eWhich)) - aPixRect.Top();
    1024           0 :         if ( nSizeYPix <= 0 )
    1025           0 :             nSizeYPix = aPixRect.GetHeight();   // editing outside below the window -> keep cell height
    1026             : 
    1027           0 :         Size aPaperSize = pView->GetActiveWin()->PixelToLogic( Size( nSizeXPix, nSizeYPix ), GetLogicMode() );
    1028           0 :         if ( bBreak && !bAsianVertical && SC_MOD()->GetInputOptions().GetTextWysiwyg() )
    1029             :         {
    1030             :             //  if text is formatted for printer, use the exact same paper width
    1031             :             //  (and same line breaks) as for output.
    1032             : 
    1033           0 :             Fraction aFract(1,1);
    1034             :             Rectangle aUtilRect = ScEditUtil( pDoc,nNewX,nNewY,nTabNo, Point(0,0), pWin,
    1035           0 :                                     HMM_PER_TWIPS, HMM_PER_TWIPS, aFract, aFract ).GetEditArea( pPattern, false );
    1036           0 :             aPaperSize.Width() = aUtilRect.GetWidth();
    1037             :         }
    1038           0 :         pNewEngine->SetPaperSize( aPaperSize );
    1039             : 
    1040             :         // sichtbarer Ausschnitt
    1041           0 :         Size aPaper = pNewEngine->GetPaperSize();
    1042           0 :         Rectangle aVis = pEditView[eWhich]->GetVisArea();
    1043           0 :         long nDiff = aVis.Right() - aVis.Left();
    1044           0 :         if ( nEditAdjust == SVX_ADJUST_RIGHT )
    1045             :         {
    1046           0 :             aVis.Right() = aPaper.Width() - 1;
    1047           0 :             bMoveArea = !bLayoutRTL;
    1048             :         }
    1049           0 :         else if ( nEditAdjust == SVX_ADJUST_CENTER )
    1050             :         {
    1051           0 :             aVis.Right() = ( aPaper.Width() - 1 + nDiff ) / 2;
    1052           0 :             bMoveArea = true;   // always
    1053             :         }
    1054             :         else
    1055             :         {
    1056           0 :             aVis.Right() = nDiff;
    1057           0 :             bMoveArea = bLayoutRTL;
    1058             :         }
    1059           0 :         aVis.Left() = aVis.Right() - nDiff;
    1060             :         // #i49561# Important note:
    1061             :         // The set offset of the visible area of the EditView for centered and
    1062             :         // right alignment in horizontal layout is consider by instances of
    1063             :         // class <ScEditObjectViewForwarder> in its methods <LogicToPixel(..)>
    1064             :         // and <PixelToLogic(..)>. This is needed for the correct visibility
    1065             :         // of paragraphs in edit mode at the accessibility API.
    1066           0 :         pEditView[eWhich]->SetVisArea(aVis);
    1067             :         //  UpdateMode has been disabled in ScInputHandler::StartTable
    1068             :         //  must be enabled before EditGrowY (GetTextHeight)
    1069           0 :         pNewEngine->SetUpdateMode( true );
    1070             : 
    1071           0 :         pNewEngine->SetStatusEventHdl( LINK( this, ScViewData, EditEngineHdl ) );
    1072             : 
    1073           0 :         EditGrowY( true );      // adjust to existing text content
    1074           0 :         EditGrowX();
    1075             : 
    1076           0 :         Point aDocPos = pEditView[eWhich]->GetWindowPosTopLeft(0);
    1077           0 :         if (aDocPos.Y() < aOutputArea.Top())
    1078           0 :             pEditView[eWhich]->Scroll( 0, aOutputArea.Top() - aDocPos.Y() );
    1079             :     }
    1080             : 
    1081             :                                                     // here bEditActive needs to be set already
    1082             :                                                     // (due to Map-Mode during Paint)
    1083           0 :     if (!bWasThere)
    1084           0 :         pNewEngine->InsertView(pEditView[eWhich]);
    1085             : 
    1086             :     //      background color of the cell
    1087           0 :     Color aBackCol = static_cast<const SvxBrushItem&>(pPattern->GetItem(ATTR_BACKGROUND)).GetColor();
    1088             : 
    1089           0 :     ScModule* pScMod = SC_MOD();
    1090           0 :     if ( aBackCol.GetTransparency() > 0 )
    1091             :     {
    1092           0 :         aBackCol.SetColor( pScMod->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor );
    1093             :     }
    1094           0 :     pEditView[eWhich]->SetBackgroundColor( aBackCol );
    1095             : 
    1096           0 :     pEditView[eWhich]->Invalidate();            //  needed?
    1097             :     //  needed, wenn position changed
    1098           0 : }
    1099             : 
    1100           0 : IMPL_STATIC_LINK_NOARG(ScViewData, EmptyEditHdl)
    1101             : {
    1102           0 :     return 0;
    1103             : }
    1104             : 
    1105           0 : IMPL_LINK( ScViewData, EditEngineHdl, EditStatus *, pStatus )
    1106             : {
    1107           0 :     EditStatusFlags nStatus = pStatus->GetStatusWord();
    1108           0 :     if (nStatus & (EditStatusFlags::HSCROLL | EditStatusFlags::TEXTHEIGHTCHANGED | EditStatusFlags::TEXTWIDTHCHANGED | EditStatusFlags::CURSOROUT))
    1109             :     {
    1110           0 :         EditGrowY();
    1111           0 :         EditGrowX();
    1112             : 
    1113           0 :         if (nStatus & EditStatusFlags::CURSOROUT)
    1114             :         {
    1115           0 :             ScSplitPos eWhich = GetActivePart();
    1116           0 :             if (pEditView[eWhich])
    1117           0 :                 pEditView[eWhich]->ShowCursor(false);
    1118             :         }
    1119             :     }
    1120           0 :     return 0;
    1121             : }
    1122             : 
    1123           0 : void ScViewData::EditGrowX()
    1124             : {
    1125           0 :     ScDocument* pLocalDoc = GetDocument();
    1126             : 
    1127           0 :     ScSplitPos eWhich = GetActivePart();
    1128           0 :     ScHSplitPos eHWhich = WhichH(eWhich);
    1129           0 :     EditView* pCurView = pEditView[eWhich];
    1130             : 
    1131           0 :     if ( !pCurView || !bEditActive[eWhich])
    1132           0 :         return;
    1133             : 
    1134           0 :     bool bLayoutRTL = pLocalDoc->IsLayoutRTL( nTabNo );
    1135             : 
    1136             :     ScEditEngineDefaulter* pEngine =
    1137           0 :         static_cast<ScEditEngineDefaulter*>( pCurView->GetEditEngine() );
    1138           0 :     vcl::Window* pWin = pCurView->GetWindow();
    1139             : 
    1140           0 :     SCCOL nLeft = GetPosX(eHWhich);
    1141           0 :     SCCOL nRight = nLeft + VisibleCellsX(eHWhich);
    1142             : 
    1143           0 :     Size        aSize = pEngine->GetPaperSize();
    1144           0 :     Rectangle   aArea = pCurView->GetOutputArea();
    1145           0 :     long        nOldRight = aArea.Right();
    1146             : 
    1147             :     //  Margin ist schon bei der urspruenglichen Breite beruecksichtigt
    1148           0 :     long nTextWidth = pEngine->CalcTextWidth();
    1149             : 
    1150           0 :     bool bChanged = false;
    1151           0 :     bool bAsianVertical = pEngine->IsVertical();
    1152             : 
    1153             :     //  get bGrow... variables the same way as in SetEditEngine
    1154           0 :     const ScPatternAttr* pPattern = pLocalDoc->GetPattern( nEditCol, nEditRow, nTabNo );
    1155             :     SvxCellHorJustify eJust = (SvxCellHorJustify)static_cast<const SvxHorJustifyItem&>(
    1156           0 :                                     pPattern->GetItem( ATTR_HOR_JUSTIFY )).GetValue();
    1157           0 :     bool bGrowCentered = ( eJust == SVX_HOR_JUSTIFY_CENTER );
    1158           0 :     bool bGrowToLeft = ( eJust == SVX_HOR_JUSTIFY_RIGHT );      // visual left
    1159           0 :     bool bGrowBackwards = bGrowToLeft;                          // logical left
    1160           0 :     if ( bLayoutRTL )
    1161           0 :         bGrowBackwards = !bGrowBackwards;                       // invert on RTL sheet
    1162           0 :     if ( bAsianVertical )
    1163           0 :         bGrowCentered = bGrowToLeft = bGrowBackwards = false;   // keep old behavior for asian mode
    1164             : 
    1165           0 :     bool bUnevenGrow = false;
    1166           0 :     if ( bGrowCentered )
    1167             :     {
    1168           0 :         while (aArea.GetWidth() + 0 < nTextWidth && ( nEditStartCol > nLeft || nEditEndCol < nRight ) )
    1169             :         {
    1170           0 :             long nLogicLeft = 0;
    1171           0 :             if ( nEditStartCol > nLeft )
    1172             :             {
    1173           0 :                 --nEditStartCol;
    1174           0 :                 long nLeftPix = ToPixel( pLocalDoc->GetColWidth( nEditStartCol, nTabNo ), nPPTX );
    1175           0 :                 nLogicLeft = pWin->PixelToLogic(Size(nLeftPix,0)).Width();
    1176             :             }
    1177           0 :             long nLogicRight = 0;
    1178           0 :             if ( nEditEndCol < nRight )
    1179             :             {
    1180           0 :                 ++nEditEndCol;
    1181           0 :                 long nRightPix = ToPixel( pLocalDoc->GetColWidth( nEditEndCol, nTabNo ), nPPTX );
    1182           0 :                 nLogicRight = pWin->PixelToLogic(Size(nRightPix,0)).Width();
    1183             :             }
    1184             : 
    1185           0 :             aArea.Left() -= bLayoutRTL ? nLogicRight : nLogicLeft;
    1186           0 :             aArea.Right() += bLayoutRTL ? nLogicLeft : nLogicRight;
    1187             : 
    1188           0 :             if ( aArea.Right() > aArea.Left() + aSize.Width() - 1 )
    1189             :             {
    1190           0 :                 long nCenter = ( aArea.Left() + aArea.Right() ) / 2;
    1191           0 :                 long nHalf = aSize.Width() / 2;
    1192           0 :                 aArea.Left() = nCenter - nHalf + 1;
    1193           0 :                 aArea.Right() = nCenter + aSize.Width() - nHalf - 1;
    1194             :             }
    1195             : 
    1196           0 :             bChanged = true;
    1197           0 :             if ( nLogicLeft != nLogicRight )
    1198           0 :                 bUnevenGrow = true;
    1199             :         }
    1200             :     }
    1201           0 :     else if ( bGrowBackwards )
    1202             :     {
    1203           0 :         while (aArea.GetWidth() + 0 < nTextWidth && nEditStartCol > nLeft)
    1204             :         {
    1205           0 :             --nEditStartCol;
    1206           0 :             long nPix = ToPixel( pLocalDoc->GetColWidth( nEditStartCol, nTabNo ), nPPTX );
    1207           0 :             long nLogicWidth = pWin->PixelToLogic(Size(nPix,0)).Width();
    1208           0 :             if ( !bLayoutRTL )
    1209           0 :                 aArea.Left() -= nLogicWidth;
    1210             :             else
    1211           0 :                 aArea.Right() += nLogicWidth;
    1212             : 
    1213           0 :             if ( aArea.Right() > aArea.Left() + aSize.Width() - 1 )
    1214             :             {
    1215           0 :                 if ( !bLayoutRTL )
    1216           0 :                     aArea.Left() = aArea.Right() - aSize.Width() + 1;
    1217             :                 else
    1218           0 :                     aArea.Right() = aArea.Left() + aSize.Width() - 1;
    1219             :             }
    1220             : 
    1221           0 :             bChanged = true;
    1222             :         }
    1223             :     }
    1224             :     else
    1225             :     {
    1226           0 :         while (aArea.GetWidth() + 0 < nTextWidth && nEditEndCol < nRight)
    1227             :         {
    1228           0 :             ++nEditEndCol;
    1229           0 :             long nPix = ToPixel( pLocalDoc->GetColWidth( nEditEndCol, nTabNo ), nPPTX );
    1230           0 :             long nLogicWidth = pWin->PixelToLogic(Size(nPix,0)).Width();
    1231           0 :             if ( bLayoutRTL )
    1232           0 :                 aArea.Left() -= nLogicWidth;
    1233             :             else
    1234           0 :                 aArea.Right() += nLogicWidth;
    1235             : 
    1236           0 :             if ( aArea.Right() > aArea.Left() + aSize.Width() - 1 )
    1237             :             {
    1238           0 :                 if ( bLayoutRTL )
    1239           0 :                     aArea.Left() = aArea.Right() - aSize.Width() + 1;
    1240             :                 else
    1241           0 :                     aArea.Right() = aArea.Left() + aSize.Width() - 1;
    1242             :             }
    1243             : 
    1244           0 :             bChanged = true;
    1245             :         }
    1246             :     }
    1247             : 
    1248           0 :     if (bChanged)
    1249             :     {
    1250           0 :         if ( bMoveArea || bGrowCentered || bGrowBackwards || bLayoutRTL )
    1251             :         {
    1252           0 :             Rectangle aVis = pCurView->GetVisArea();
    1253             : 
    1254           0 :             if ( bGrowCentered )
    1255             :             {
    1256             :                 //  switch to center-aligned (undo?) and reset VisArea to center
    1257             : 
    1258           0 :                 pEngine->SetDefaultItem( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
    1259             : 
    1260           0 :                 long nCenter = aSize.Width() / 2;
    1261           0 :                 long nVisSize = aArea.GetWidth();
    1262           0 :                 aVis.Left() = nCenter - nVisSize / 2;
    1263           0 :                 aVis.Right() = aVis.Left() + nVisSize - 1;
    1264             :             }
    1265           0 :             else if ( bGrowToLeft )
    1266             :             {
    1267             :                 //  switch to right-aligned (undo?) and reset VisArea to the right
    1268             : 
    1269           0 :                 pEngine->SetDefaultItem( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
    1270             : 
    1271           0 :                 aVis.Right() = aSize.Width() - 1;
    1272           0 :                 aVis.Left() = aSize.Width() - aArea.GetWidth();     // with the new, increased area
    1273             :             }
    1274             :             else
    1275             :             {
    1276             :                 //  switch to left-aligned (undo?) and reset VisArea to the left
    1277             : 
    1278           0 :                 pEngine->SetDefaultItem( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
    1279             : 
    1280           0 :                 long nMove = aVis.Left();
    1281           0 :                 aVis.Left() = 0;
    1282           0 :                 aVis.Right() -= nMove;
    1283             :             }
    1284           0 :             pCurView->SetVisArea( aVis );
    1285           0 :             bMoveArea = false;
    1286             :         }
    1287             : 
    1288           0 :         pCurView->SetOutputArea(aArea);
    1289             : 
    1290             :         //  In vertical mode, the whole text is moved to the next cell (right-aligned),
    1291             :         //  so everything must be repainted. Otherwise, paint only the new area.
    1292             :         //  If growing in centered alignment, if the cells left and right have different sizes,
    1293             :         //  the whole text will move, and may not even obscure all of the original display.
    1294           0 :         if ( bUnevenGrow )
    1295             :         {
    1296           0 :             aArea.Left() = pWin->PixelToLogic( Point(0,0) ).X();
    1297           0 :             aArea.Right() = pWin->PixelToLogic( aScrSize ).Width();
    1298             :         }
    1299           0 :         else if ( !bAsianVertical && !bGrowToLeft && !bGrowCentered )
    1300           0 :             aArea.Left() = nOldRight;
    1301           0 :         pWin->Invalidate(aArea);
    1302             :     }
    1303             : }
    1304             : 
    1305           0 : void ScViewData::EditGrowY( bool bInitial )
    1306             : {
    1307           0 :     ScSplitPos eWhich = GetActivePart();
    1308           0 :     ScVSplitPos eVWhich = WhichV(eWhich);
    1309           0 :     EditView* pCurView = pEditView[eWhich];
    1310             : 
    1311           0 :     if ( !pCurView || !bEditActive[eWhich])
    1312           0 :         return;
    1313             : 
    1314           0 :     EVControlBits nControl = pEditView[eWhich]->GetControlWord();
    1315           0 :     if ( nControl & EVControlBits::AUTOSCROLL )
    1316             :     {
    1317             :         //  if end of screen had already been reached and scrolling enabled,
    1318             :         //  don't further try to grow the edit area
    1319             : 
    1320           0 :         pCurView->SetOutputArea( pCurView->GetOutputArea() );   // re-align to pixels
    1321           0 :         return;
    1322             :     }
    1323             : 
    1324           0 :     EditEngine* pEngine = pCurView->GetEditEngine();
    1325           0 :     vcl::Window* pWin = pCurView->GetWindow();
    1326             : 
    1327           0 :     SCROW nBottom = GetPosY(eVWhich) + VisibleCellsY(eVWhich);
    1328             : 
    1329           0 :     Size        aSize = pEngine->GetPaperSize();
    1330           0 :     Rectangle   aArea = pCurView->GetOutputArea();
    1331           0 :     long        nOldBottom = aArea.Bottom();
    1332           0 :     long        nTextHeight = pEngine->GetTextHeight();
    1333             : 
    1334             :     //  When editing a formula in a cell with optimal height, allow a larger portion
    1335             :     //  to be clipped before extending to following rows, to avoid obscuring cells for
    1336             :     //  reference input (next row is likely to be useful in formulas).
    1337           0 :     long nAllowedExtra = SC_GROWY_SMALL_EXTRA;
    1338           0 :     if ( nEditEndRow == nEditRow && !( pDoc->GetRowFlags( nEditRow, nTabNo ) & CR_MANUALSIZE ) &&
    1339           0 :             pEngine->GetParagraphCount() <= 1 )
    1340             :     {
    1341             :         //  If the (only) paragraph starts with a '=', it's a formula.
    1342             :         //  If this is the initial call and the text is empty, allow the larger value, too,
    1343             :         //  because this occurs in the normal progress of editing a formula.
    1344             :         //  Subsequent calls with empty text might involve changed attributes (including
    1345             :         //  font height), so they are treated like normal text.
    1346           0 :         OUString aText = pEngine->GetText(  0 );
    1347           0 :         if ( ( aText.isEmpty() && bInitial ) || aText.startsWith("=") )
    1348           0 :             nAllowedExtra = SC_GROWY_BIG_EXTRA;
    1349             :     }
    1350             : 
    1351           0 :     bool bChanged = false;
    1352           0 :     bool bMaxReached = false;
    1353           0 :     while (aArea.GetHeight() + nAllowedExtra < nTextHeight && nEditEndRow < nBottom && !bMaxReached)
    1354             :     {
    1355           0 :         ++nEditEndRow;
    1356           0 :         ScDocument* pLocalDoc = GetDocument();
    1357           0 :         long nPix = ToPixel( pLocalDoc->GetRowHeight( nEditEndRow, nTabNo ), nPPTY );
    1358           0 :         aArea.Bottom() += pWin->PixelToLogic(Size(0,nPix)).Height();
    1359             : 
    1360           0 :         if ( aArea.Bottom() > aArea.Top() + aSize.Height() - 1 )
    1361             :         {
    1362           0 :             aArea.Bottom() = aArea.Top() + aSize.Height() - 1;
    1363           0 :             bMaxReached = true;     // don't occupy more cells beyond paper size
    1364             :         }
    1365             : 
    1366           0 :         bChanged = true;
    1367           0 :         nAllowedExtra = SC_GROWY_SMALL_EXTRA;   // larger value is only for first row
    1368             :     }
    1369             : 
    1370           0 :     if (bChanged)
    1371             :     {
    1372           0 :         pCurView->SetOutputArea(aArea);
    1373             : 
    1374           0 :         if (nEditEndRow >= nBottom || bMaxReached)
    1375             :         {
    1376           0 :             if (!(nControl & EVControlBits::AUTOSCROLL))
    1377           0 :                 pCurView->SetControlWord( nControl | EVControlBits::AUTOSCROLL );
    1378             :         }
    1379             : 
    1380           0 :         aArea.Top() = nOldBottom;
    1381           0 :         pWin->Invalidate(aArea);
    1382             :     }
    1383             : }
    1384             : 
    1385        2685 : void ScViewData::ResetEditView()
    1386             : {
    1387        2685 :     EditEngine* pEngine = NULL;
    1388       13425 :     for (sal_uInt16 i=0; i<4; i++)
    1389       10740 :         if (pEditView[i])
    1390             :         {
    1391           0 :             if (bEditActive[i])
    1392             :             {
    1393           0 :                 pEngine = pEditView[i]->GetEditEngine();
    1394           0 :                 pEngine->RemoveView(pEditView[i]);
    1395           0 :                 pEditView[i]->SetOutputArea( Rectangle() );
    1396             :             }
    1397           0 :             bEditActive[i] = false;
    1398             :         }
    1399             : 
    1400        2685 :     if (pEngine)
    1401           0 :         pEngine->SetStatusEventHdl( LINK( this, ScViewData, EmptyEditHdl ) );
    1402        2685 : }
    1403             : 
    1404         695 : void ScViewData::KillEditView()
    1405             : {
    1406        3475 :     for (sal_uInt16 i=0; i<4; i++)
    1407        2780 :         if (pEditView[i])
    1408             :         {
    1409           0 :             if (bEditActive[i])
    1410           0 :                 pEditView[i]->GetEditEngine()->RemoveView(pEditView[i]);
    1411           0 :             delete pEditView[i];
    1412           0 :             pEditView[i] = NULL;
    1413             :         }
    1414         695 : }
    1415             : 
    1416           0 : void ScViewData::GetEditView( ScSplitPos eWhich, EditView*& rViewPtr, SCCOL& rCol, SCROW& rRow )
    1417             : {
    1418           0 :     rViewPtr = pEditView[eWhich];
    1419           0 :     rCol = nEditCol;
    1420           0 :     rRow = nEditRow;
    1421           0 : }
    1422             : 
    1423         679 : void ScViewData::CreateTabData( SCTAB nNewTab )
    1424             : {
    1425         679 :     EnsureTabDataSize(nNewTab + 1);
    1426             : 
    1427         679 :     if (!maTabData[nNewTab])
    1428             :     {
    1429          47 :         maTabData[nNewTab] = new ScViewDataTable;
    1430             : 
    1431          47 :         maTabData[nNewTab]->eZoomType  = eDefZoomType;
    1432          47 :         maTabData[nNewTab]->aZoomX     = aDefZoomX;
    1433          47 :         maTabData[nNewTab]->aZoomY     = aDefZoomY;
    1434          47 :         maTabData[nNewTab]->aPageZoomX = aDefPageZoomX;
    1435          47 :         maTabData[nNewTab]->aPageZoomY = aDefPageZoomY;
    1436             :     }
    1437         679 : }
    1438             : 
    1439           0 : void ScViewData::CreateSelectedTabData()
    1440             : {
    1441           0 :     ScMarkData::iterator itr = mpMarkData->begin(), itrEnd = mpMarkData->end();
    1442           0 :     for (; itr != itrEnd; ++itr)
    1443           0 :         CreateTabData(*itr);
    1444           0 : }
    1445             : 
    1446        1497 : void ScViewData::EnsureTabDataSize(size_t nSize)
    1447             : {
    1448        1497 :     if (nSize >= maTabData.size())
    1449             :     {
    1450         410 :         size_t n = nSize - maTabData.size() + 1;
    1451         410 :         maTabData.insert(maTabData.end(), n, NULL);
    1452             :     }
    1453        1497 : }
    1454             : 
    1455         631 : void ScViewData::SetTabNo( SCTAB nNewTab )
    1456             : {
    1457         631 :     if (!ValidTab(nNewTab))
    1458             :     {
    1459             :         OSL_FAIL("falsche Tabellennummer");
    1460         631 :         return;
    1461             :     }
    1462             : 
    1463         631 :     nTabNo = nNewTab;
    1464         631 :     CreateTabData(nTabNo);
    1465         631 :     pThisTab = maTabData[nTabNo];
    1466             : 
    1467         631 :     CalcPPT();          //  for common column width correction
    1468         631 :     RecalcPixPos();     //! nicht immer noetig!
    1469             : }
    1470             : 
    1471          14 : void ScViewData::SetActivePart( ScSplitPos eNewActive )
    1472             : {
    1473          14 :     pThisTab->eWhichActive = eNewActive;
    1474          14 : }
    1475             : 
    1476         217 : Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScHSplitPos eWhich ) const
    1477             : {
    1478             :     OSL_ENSURE( eWhich==SC_SPLIT_LEFT || eWhich==SC_SPLIT_RIGHT, "Falsche Position" );
    1479         217 :     ScSplitPos ePos = ( eWhich == SC_SPLIT_LEFT ) ? SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT;
    1480         217 :     return GetScrPos( nWhereX, nWhereY, ePos );
    1481             : }
    1482             : 
    1483         320 : Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScVSplitPos eWhich ) const
    1484             : {
    1485             :     OSL_ENSURE( eWhich==SC_SPLIT_TOP || eWhich==SC_SPLIT_BOTTOM, "Falsche Position" );
    1486         320 :     ScSplitPos ePos = ( eWhich == SC_SPLIT_TOP ) ? SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT;
    1487         320 :     return GetScrPos( nWhereX, nWhereY, ePos );
    1488             : }
    1489             : 
    1490       25382 : Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
    1491             :                                 bool bAllowNeg ) const
    1492             : {
    1493       25382 :     ScHSplitPos eWhichX = SC_SPLIT_LEFT;
    1494       25382 :     ScVSplitPos eWhichY = SC_SPLIT_BOTTOM;
    1495       25382 :     switch( eWhich )
    1496             :     {
    1497             :         case SC_SPLIT_TOPLEFT:
    1498          49 :             eWhichX = SC_SPLIT_LEFT;
    1499          49 :             eWhichY = SC_SPLIT_TOP;
    1500          49 :             break;
    1501             :         case SC_SPLIT_TOPRIGHT:
    1502           6 :             eWhichX = SC_SPLIT_RIGHT;
    1503           6 :             eWhichY = SC_SPLIT_TOP;
    1504           6 :             break;
    1505             :         case SC_SPLIT_BOTTOMLEFT:
    1506       25316 :             eWhichX = SC_SPLIT_LEFT;
    1507       25316 :             eWhichY = SC_SPLIT_BOTTOM;
    1508       25316 :             break;
    1509             :         case SC_SPLIT_BOTTOMRIGHT:
    1510          11 :             eWhichX = SC_SPLIT_RIGHT;
    1511          11 :             eWhichY = SC_SPLIT_BOTTOM;
    1512          11 :             break;
    1513             :     }
    1514             : 
    1515       25382 :     if (pView)
    1516             :     {
    1517       25382 :         const_cast<ScViewData*>(this)->aScrSize.Width()  = pView->GetGridWidth(eWhichX);
    1518       25382 :         const_cast<ScViewData*>(this)->aScrSize.Height() = pView->GetGridHeight(eWhichY);
    1519             :     }
    1520             : 
    1521             :     sal_uInt16 nTSize;
    1522       25382 :     ScDrawLayer* pModel = GetDocument()->GetDrawLayer();
    1523       25382 :     bool bIsTiledRendering = pModel && pModel->isTiledRendering();
    1524             : 
    1525       25382 :     SCCOL   nPosX = GetPosX(eWhichX);
    1526             :     SCCOL   nX;
    1527             : 
    1528       25382 :     long nScrPosX=0;
    1529       25382 :     if (nWhereX >= nPosX)
    1530       75927 :         for (nX = nPosX; nX < nWhereX && (bAllowNeg || bIsTiledRendering || nScrPosX <= aScrSize.Width()); nX++)
    1531             :         {
    1532       50632 :             if ( nX > MAXCOL )
    1533           0 :                 nScrPosX = 65535;
    1534             :             else
    1535             :             {
    1536       50632 :                 nTSize = pDoc->GetColWidth( nX, nTabNo );
    1537       50632 :                 if (nTSize)
    1538             :                 {
    1539       50303 :                     long nSizeXPix = ToPixel( nTSize, nPPTX );
    1540       50303 :                     nScrPosX += nSizeXPix;
    1541             :                 }
    1542             :             }
    1543             :         }
    1544          87 :     else if (bAllowNeg)
    1545           6 :         for (nX=nPosX; nX>nWhereX;)
    1546             :         {
    1547           4 :             --nX;
    1548           4 :             nTSize = pDoc->GetColWidth( nX, nTabNo );
    1549           4 :             if (nTSize)
    1550             :             {
    1551           4 :                 long nSizeXPix = ToPixel( nTSize, nPPTX );
    1552           4 :                 nScrPosX -= nSizeXPix;
    1553             :             }
    1554             :         }
    1555             : 
    1556       25382 :     SCROW   nPosY = GetPosY(eWhichY);
    1557             :     SCROW   nY;
    1558             : 
    1559       25382 :     long nScrPosY=0;
    1560       25382 :     if (nWhereY >= nPosY)
    1561      108400 :         for (nY = nPosY; nY < nWhereY && (bAllowNeg || bIsTiledRendering || nScrPosY <= aScrSize.Height()); nY++)
    1562             :         {
    1563       83057 :             if ( nY > MAXROW )
    1564           0 :                 nScrPosY = 65535;
    1565             :             else
    1566             :             {
    1567       83057 :                 nTSize = pDoc->GetRowHeight( nY, nTabNo );
    1568       83057 :                 if (nTSize)
    1569             :                 {
    1570       82889 :                     long nSizeYPix = ToPixel( nTSize, nPPTY );
    1571       82889 :                     nScrPosY += nSizeYPix;
    1572             :                 }
    1573         168 :                 else if ( nY < MAXROW )
    1574             :                 {
    1575             :                     // skip multiple hidden rows (forward only for now)
    1576         168 :                     SCROW nNext = pDoc->FirstVisibleRow(nY + 1, MAXROW, nTabNo);
    1577         168 :                     if ( nNext > MAXROW )
    1578           0 :                         nY = MAXROW;
    1579             :                     else
    1580         168 :                         nY = nNext - 1;     // +=nDir advances to next visible row
    1581             :                 }
    1582             :             }
    1583             :         }
    1584          39 :     else if (bAllowNeg)
    1585         187 :         for (nY=nPosY; nY>nWhereY;)
    1586             :         {
    1587         175 :             --nY;
    1588         175 :             nTSize = pDoc->GetRowHeight( nY, nTabNo );
    1589         175 :             if (nTSize)
    1590             :             {
    1591         175 :                 long nSizeYPix = ToPixel( nTSize, nPPTY );
    1592         175 :                 nScrPosY -= nSizeYPix;
    1593             :             }
    1594             :         }
    1595             : 
    1596       25382 :     if ( pDoc->IsLayoutRTL( nTabNo ) )
    1597             :     {
    1598             :         //  mirror horizontal position
    1599          10 :         nScrPosX = aScrSize.Width() - 1 - nScrPosX;
    1600             :     }
    1601             : 
    1602       25382 :     if (!bIsTiledRendering)
    1603             :     {
    1604       25382 :         if (nScrPosX > 32767)
    1605           0 :             nScrPosX = 32767;
    1606       25382 :         if (nScrPosY > 32767)
    1607           0 :             nScrPosY = 32767;
    1608             :     }
    1609             : 
    1610       25382 :     return Point( nScrPosX, nScrPosY );
    1611             : }
    1612             : 
    1613             : //      Number of cells on a screen
    1614       27253 : SCCOL ScViewData::CellsAtX( SCsCOL nPosX, SCsCOL nDir, ScHSplitPos eWhichX, sal_uInt16 nScrSizeX ) const
    1615             : {
    1616             :     OSL_ENSURE( nDir==1 || nDir==-1, "falscher CellsAt Aufruf" );
    1617             : 
    1618       27253 :     if (pView)
    1619       27253 :         const_cast<ScViewData*>(this)->aScrSize.Width()  = pView->GetGridWidth(eWhichX);
    1620             : 
    1621             :     SCsCOL  nX;
    1622       27253 :     sal_uInt16  nScrPosX = 0;
    1623       27253 :     if (nScrSizeX == SC_SIZE_NONE) nScrSizeX = (sal_uInt16) aScrSize.Width();
    1624             : 
    1625       27253 :     if (nDir==1)
    1626       27220 :         nX = nPosX;             // vorwaerts
    1627             :     else
    1628          33 :         nX = nPosX-1;           // rueckwaerts
    1629             : 
    1630       27253 :     bool bOut = false;
    1631      278705 :     for ( ; nScrPosX<=nScrSizeX && !bOut; nX = sal::static_int_cast<SCsCOL>(nX + nDir) )
    1632             :     {
    1633      251452 :         SCsCOL  nColNo = nX;
    1634      251452 :         if ( nColNo < 0 || nColNo > MAXCOL )
    1635          75 :             bOut = true;
    1636             :         else
    1637             :         {
    1638      251377 :             sal_uInt16 nTSize = pDoc->GetColWidth( nColNo, nTabNo );
    1639      251377 :             if (nTSize)
    1640             :             {
    1641      250310 :                 long nSizeXPix = ToPixel( nTSize, nPPTX );
    1642      250310 :                 nScrPosX = sal::static_int_cast<sal_uInt16>( nScrPosX + (sal_uInt16) nSizeXPix );
    1643             :             }
    1644             :         }
    1645             :     }
    1646             : 
    1647       27253 :     if (nDir==1)
    1648       27220 :         nX = sal::static_int_cast<SCsCOL>( nX - nPosX );
    1649             :     else
    1650          33 :         nX = (nPosX-1)-nX;
    1651             : 
    1652       27253 :     if (nX>0) --nX;
    1653       27253 :     return nX;
    1654             : }
    1655             : 
    1656       36345 : SCROW ScViewData::CellsAtY( SCsROW nPosY, SCsROW nDir, ScVSplitPos eWhichY, sal_uInt16 nScrSizeY ) const
    1657             : {
    1658             :     OSL_ENSURE( nDir==1 || nDir==-1, "falscher CellsAt Aufruf" );
    1659             : 
    1660       36345 :     if (pView)
    1661       36345 :         const_cast<ScViewData*>(this)->aScrSize.Height() = pView->GetGridHeight(eWhichY);
    1662             : 
    1663       36345 :     if (nScrSizeY == SC_SIZE_NONE) nScrSizeY = (sal_uInt16) aScrSize.Height();
    1664             : 
    1665             :     SCROW nY;
    1666             : 
    1667       36345 :     if (nDir==1)
    1668             :     {
    1669             :         // forward
    1670       36301 :         nY = nPosY;
    1671       36301 :         long nScrPosY = 0;
    1672       36301 :         AddPixelsWhile( nScrPosY, nScrSizeY, nY, MAXROW, nPPTY, pDoc, nTabNo);
    1673             :         // Original loop ended on last evaluated +1 or if that was MAXROW even
    1674             :         // on MAXROW+2.
    1675       36301 :         nY += (nY == MAXROW ? 2 : 1);
    1676       36301 :         nY -= nPosY;
    1677             :     }
    1678             :     else
    1679             :     {
    1680             :         // backward
    1681          44 :         nY = nPosY-1;
    1682          44 :         long nScrPosY = 0;
    1683          44 :         AddPixelsWhileBackward( nScrPosY, nScrSizeY, nY, 0, nPPTY, pDoc, nTabNo);
    1684             :         // Original loop ended on last evaluated -1 or if that was 0 even on
    1685             :         // -2.
    1686          44 :         nY -= (nY == 0 ? 2 : 1);
    1687          44 :         nY = (nPosY-1)-nY;
    1688             :     }
    1689             : 
    1690       36345 :     if (nY>0) --nY;
    1691       36345 :     return nY;
    1692             : }
    1693             : 
    1694       27139 : SCCOL ScViewData::VisibleCellsX( ScHSplitPos eWhichX ) const
    1695             : {
    1696       27139 :     return CellsAtX( GetPosX( eWhichX ), 1, eWhichX, SC_SIZE_NONE );
    1697             : }
    1698             : 
    1699       27150 : SCROW ScViewData::VisibleCellsY( ScVSplitPos eWhichY ) const
    1700             : {
    1701       27150 :     return CellsAtY( GetPosY( eWhichY ), 1, eWhichY, SC_SIZE_NONE );
    1702             : }
    1703             : 
    1704           0 : SCCOL ScViewData::PrevCellsX( ScHSplitPos eWhichX ) const
    1705             : {
    1706           0 :     return CellsAtX( GetPosX( eWhichX ), -1, eWhichX, SC_SIZE_NONE );
    1707             : }
    1708             : 
    1709           0 : SCROW ScViewData::PrevCellsY( ScVSplitPos eWhichY ) const
    1710             : {
    1711           0 :     return CellsAtY( GetPosY( eWhichY ), -1, eWhichY, SC_SIZE_NONE );
    1712             : }
    1713             : 
    1714        6678 : bool ScViewData::GetMergeSizePixel( SCCOL nX, SCROW nY, long& rSizeXPix, long& rSizeYPix ) const
    1715             : {
    1716        6678 :     const ScMergeAttr* pMerge = static_cast<const ScMergeAttr*>( pDoc->GetAttr( nX,nY,nTabNo, ATTR_MERGE ) );
    1717        6678 :     if ( pMerge->GetColMerge() > 1 || pMerge->GetRowMerge() > 1 )
    1718             :     {
    1719           0 :         long nOutWidth = 0;
    1720           0 :         long nOutHeight = 0;
    1721           0 :         SCCOL nCountX = pMerge->GetColMerge();
    1722           0 :         for (SCCOL i=0; i<nCountX; i++)
    1723           0 :             nOutWidth += ToPixel( pDoc->GetColWidth(nX+i,nTabNo), nPPTX );
    1724           0 :         SCROW nCountY = pMerge->GetRowMerge();
    1725             : 
    1726           0 :         for (SCROW nRow = nY; nRow <= nY+nCountY-1; ++nRow)
    1727             :         {
    1728           0 :             SCROW nLastRow = nRow;
    1729           0 :             if (pDoc->RowHidden(nRow, nTabNo, NULL, &nLastRow))
    1730             :             {
    1731           0 :                 nRow = nLastRow;
    1732           0 :                 continue;
    1733             :             }
    1734             : 
    1735           0 :             sal_uInt16 nHeight = pDoc->GetRowHeight(nRow, nTabNo);
    1736           0 :             nOutHeight += ToPixel(nHeight, nPPTY);
    1737             :         }
    1738             : 
    1739           0 :         rSizeXPix = nOutWidth;
    1740           0 :         rSizeYPix = nOutHeight;
    1741           0 :         return true;
    1742             :     }
    1743             :     else
    1744             :     {
    1745        6678 :         rSizeXPix = ToPixel( pDoc->GetColWidth( nX, nTabNo ), nPPTX );
    1746        6678 :         rSizeYPix = ToPixel( pDoc->GetRowHeight( nY, nTabNo ), nPPTY );
    1747        6678 :         return false;
    1748             :     }
    1749             : }
    1750             : 
    1751          10 : bool ScViewData::GetPosFromPixel( long nClickX, long nClickY, ScSplitPos eWhich,
    1752             :                                         SCsCOL& rPosX, SCsROW& rPosY,
    1753             :                                         bool bTestMerge, bool bRepair, bool bNextIfLarge )
    1754             : {
    1755             :     //  special handling of 0 is now in ScViewFunctionSet::SetCursorAtPoint
    1756             : 
    1757          10 :     ScHSplitPos eHWhich = WhichH(eWhich);
    1758          10 :     ScVSplitPos eVWhich = WhichV(eWhich);
    1759             : 
    1760          10 :     if ( pDoc->IsLayoutRTL( nTabNo ) )
    1761             :     {
    1762             :         //  mirror horizontal position
    1763           0 :         if (pView)
    1764           0 :             aScrSize.Width() = pView->GetGridWidth(eHWhich);
    1765           0 :         nClickX = aScrSize.Width() - 1 - nClickX;
    1766             :     }
    1767             : 
    1768          10 :     SCsCOL nStartPosX = GetPosX(eHWhich);
    1769          10 :     SCsROW nStartPosY = GetPosY(eVWhich);
    1770          10 :     rPosX = nStartPosX;
    1771          10 :     rPosY = nStartPosY;
    1772          10 :     long nScrX = 0;
    1773          10 :     long nScrY = 0;
    1774             : 
    1775          10 :     if (nClickX > 0)
    1776             :     {
    1777          43 :         while ( rPosX<=MAXCOL && nClickX >= nScrX )
    1778             :         {
    1779          29 :             nScrX += ToPixel( pDoc->GetColWidth( rPosX, nTabNo ), nPPTX );
    1780          29 :             ++rPosX;
    1781             :         }
    1782           7 :         --rPosX;
    1783             :     }
    1784             :     else
    1785             :     {
    1786           6 :         while ( rPosX>0 && nClickX < nScrX )
    1787             :         {
    1788           0 :             --rPosX;
    1789           0 :             nScrX -= ToPixel( pDoc->GetColWidth( rPosX, nTabNo ), nPPTX );
    1790             :         }
    1791             :     }
    1792             : 
    1793          10 :     if (nClickY > 0)
    1794           8 :         AddPixelsWhile( nScrY, nClickY, rPosY, MAXROW, nPPTY, pDoc, nTabNo );
    1795             :     else
    1796             :     {
    1797             :         /* TODO: could need some "SubPixelsWhileBackward" method */
    1798           4 :         while ( rPosY>0 && nClickY < nScrY )
    1799             :         {
    1800           0 :             --rPosY;
    1801           0 :             nScrY -= ToPixel( pDoc->GetRowHeight( rPosY, nTabNo ), nPPTY );
    1802             :         }
    1803             :     }
    1804             : 
    1805          10 :     if (bNextIfLarge)       //  cells to big?
    1806             :     {
    1807          10 :         if ( rPosX == nStartPosX && nClickX > 0 )
    1808             :         {
    1809           2 :             if (pView)
    1810           2 :                 aScrSize.Width() = pView->GetGridWidth(eHWhich);
    1811           2 :             if ( nClickX > aScrSize.Width() )
    1812           0 :                 ++rPosX;
    1813             :         }
    1814          10 :         if ( rPosY == nStartPosY && nClickY > 0 )
    1815             :         {
    1816           2 :             if (pView)
    1817           2 :                 aScrSize.Height() = pView->GetGridHeight(eVWhich);
    1818           2 :             if ( nClickY > aScrSize.Height() )
    1819           0 :                 ++rPosY;
    1820             :         }
    1821             :     }
    1822             : 
    1823          10 :     if (rPosX<0) rPosX=0;
    1824          10 :     if (rPosX>MAXCOL) rPosX=MAXCOL;
    1825          10 :     if (rPosY<0) rPosY=0;
    1826          10 :     if (rPosY>MAXROW) rPosY=MAXROW;
    1827             : 
    1828          10 :     if (bTestMerge)
    1829             :     {
    1830             :         // public method to adapt position
    1831           6 :         SCCOL nOrigX = rPosX;
    1832           6 :         SCROW nOrigY = rPosY;
    1833           6 :         pDoc->SkipOverlapped(rPosX, rPosY, nTabNo);
    1834           6 :         bool bHOver = (nOrigX != rPosX);
    1835           6 :         bool bVOver = (nOrigY != rPosY);
    1836             : 
    1837           6 :         if ( bRepair && ( bHOver || bVOver ) )
    1838             :         {
    1839             :             const ScMergeAttr* pMerge = static_cast<const ScMergeAttr*>(
    1840           0 :                                 pDoc->GetAttr( rPosX, rPosY, nTabNo, ATTR_MERGE ) );
    1841           0 :             if ( ( bHOver && pMerge->GetColMerge() <= 1 ) ||
    1842           0 :                  ( bVOver && pMerge->GetRowMerge() <= 1 ) )
    1843             :             {
    1844             :                 OSL_FAIL("Merge-Fehler gefunden");
    1845             : 
    1846           0 :                 pDoc->RemoveFlagsTab( 0,0, MAXCOL,MAXROW, nTabNo, SC_MF_HOR | SC_MF_VER );
    1847           0 :                 SCCOL nEndCol = MAXCOL;
    1848           0 :                 SCROW nEndRow = MAXROW;
    1849           0 :                 pDoc->ExtendMerge( 0,0, nEndCol,nEndRow, nTabNo, true );
    1850           0 :                 if (pDocShell)
    1851           0 :                     pDocShell->PostPaint( ScRange(0,0,nTabNo,MAXCOL,MAXROW,nTabNo), PAINT_GRID );
    1852             :             }
    1853             :         }
    1854             :     }
    1855             : 
    1856          10 :     return false;
    1857             : }
    1858             : 
    1859           2 : void ScViewData::GetMouseQuadrant( const Point& rClickPos, ScSplitPos eWhich,
    1860             :                                         SCsCOL nPosX, SCsROW nPosY, bool& rLeft, bool& rTop )
    1861             : {
    1862           2 :     bool bLayoutRTL = pDoc->IsLayoutRTL( nTabNo );
    1863           2 :     long nLayoutSign = bLayoutRTL ? -1 : 1;
    1864             : 
    1865           2 :     Point aCellStart = GetScrPos( nPosX, nPosY, eWhich, true );
    1866             :     long nSizeX;
    1867             :     long nSizeY;
    1868           2 :     GetMergeSizePixel( nPosX, nPosY, nSizeX, nSizeY );
    1869           2 :     rLeft = ( rClickPos.X() - aCellStart.X() ) * nLayoutSign <= nSizeX / 2;
    1870           2 :     rTop  = rClickPos.Y() - aCellStart.Y() <= nSizeY / 2;
    1871           2 : }
    1872             : 
    1873          63 : void ScViewData::SetPosX( ScHSplitPos eWhich, SCCOL nNewPosX )
    1874             : {
    1875             :     // in the tiled rendering case, nPosX [the leftmost visible column] must be 0
    1876          63 :     ScDrawLayer* pModel = GetDocument()->GetDrawLayer();
    1877          63 :     bool bIsTiledRendering = pModel && pModel->isTiledRendering();
    1878          63 :     if (nNewPosX != 0 && !bIsTiledRendering)
    1879             :     {
    1880          34 :         SCCOL nOldPosX = pThisTab->nPosX[eWhich];
    1881          34 :         long nTPosX = pThisTab->nTPosX[eWhich];
    1882          34 :         long nPixPosX = pThisTab->nPixPosX[eWhich];
    1883             :         SCCOL i;
    1884          34 :         if ( nNewPosX > nOldPosX )
    1885        6954 :             for ( i=nOldPosX; i<nNewPosX; i++ )
    1886             :             {
    1887        6923 :                 long nThis = pDoc->GetColWidth( i,nTabNo );
    1888        6923 :                 nTPosX -= nThis;
    1889        6923 :                 nPixPosX -= ToPixel(sal::static_int_cast<sal_uInt16>(nThis), nPPTX);
    1890             :             }
    1891             :         else
    1892           3 :             for ( i=nNewPosX; i<nOldPosX; i++ )
    1893             :             {
    1894           0 :                 long nThis = pDoc->GetColWidth( i,nTabNo );
    1895           0 :                 nTPosX += nThis;
    1896           0 :                 nPixPosX += ToPixel(sal::static_int_cast<sal_uInt16>(nThis), nPPTX);
    1897             :             }
    1898             : 
    1899          34 :         pThisTab->nPosX[eWhich] = nNewPosX;
    1900          34 :         pThisTab->nTPosX[eWhich] = nTPosX;
    1901          34 :         pThisTab->nMPosX[eWhich] = (long) (nTPosX * HMM_PER_TWIPS);
    1902          34 :         pThisTab->nPixPosX[eWhich] = nPixPosX;
    1903             :     }
    1904             :     else
    1905             :     {
    1906          29 :         pThisTab->nPixPosX[eWhich] =
    1907          58 :         pThisTab->nTPosX[eWhich] =
    1908          58 :         pThisTab->nMPosX[eWhich] =
    1909         116 :         pThisTab->nPosX[eWhich] = 0;
    1910             :     }
    1911          63 : }
    1912             : 
    1913          85 : void ScViewData::SetPosY( ScVSplitPos eWhich, SCROW nNewPosY )
    1914             : {
    1915             :     // in the tiled rendering case, nPosY [the topmost visible row] must be 0
    1916          85 :     ScDrawLayer* pModel = GetDocument()->GetDrawLayer();
    1917          85 :     bool bIsTiledRendering = pModel && pModel->isTiledRendering();
    1918          85 :     if (nNewPosY != 0 && !bIsTiledRendering)
    1919             :     {
    1920          40 :         SCROW nOldPosY = pThisTab->nPosY[eWhich];
    1921          40 :         long nTPosY = pThisTab->nTPosY[eWhich];
    1922          40 :         long nPixPosY = pThisTab->nPixPosY[eWhich];
    1923             :         SCROW i, nHeightEndRow;
    1924          40 :         if ( nNewPosY > nOldPosY )
    1925          96 :             for ( i=nOldPosY; i<nNewPosY; i++ )
    1926             :             {
    1927          62 :                 long nThis = pDoc->GetRowHeight( i, nTabNo, NULL, &nHeightEndRow );
    1928          62 :                 SCROW nRows = std::min( nNewPosY, nHeightEndRow + 1) - i;
    1929          62 :                 i = nHeightEndRow;
    1930          62 :                 nTPosY -= nThis * nRows;
    1931          62 :                 nPixPosY -= ToPixel(sal::static_int_cast<sal_uInt16>(nThis), nPPTY) * nRows;
    1932             :             }
    1933             :         else
    1934          16 :             for ( i=nNewPosY; i<nOldPosY; i++ )
    1935             :             {
    1936          10 :                 long nThis = pDoc->GetRowHeight( i, nTabNo, NULL, &nHeightEndRow );
    1937          10 :                 SCROW nRows = std::min( nOldPosY, nHeightEndRow + 1) - i;
    1938          10 :                 i = nHeightEndRow;
    1939          10 :                 nTPosY += nThis * nRows;
    1940          10 :                 nPixPosY += ToPixel(sal::static_int_cast<sal_uInt16>(nThis), nPPTY) * nRows;
    1941             :             }
    1942             : 
    1943          40 :         pThisTab->nPosY[eWhich] = nNewPosY;
    1944          40 :         pThisTab->nTPosY[eWhich] = nTPosY;
    1945          40 :         pThisTab->nMPosY[eWhich] = (long) (nTPosY * HMM_PER_TWIPS);
    1946          40 :         pThisTab->nPixPosY[eWhich] = nPixPosY;
    1947             :     }
    1948             :     else
    1949             :     {
    1950          45 :         pThisTab->nPixPosY[eWhich] =
    1951          90 :         pThisTab->nTPosY[eWhich] =
    1952          90 :         pThisTab->nMPosY[eWhich] =
    1953         180 :         pThisTab->nPosY[eWhich] = 0;
    1954             :     }
    1955          85 : }
    1956             : 
    1957        2028 : void ScViewData::RecalcPixPos()             // after zoom changes
    1958             : {
    1959        6084 :     for (sal_uInt16 eWhich=0; eWhich<2; eWhich++)
    1960             :     {
    1961        4056 :         long nPixPosX = 0;
    1962        4056 :         SCCOL nPosX = pThisTab->nPosX[eWhich];
    1963       16370 :         for (SCCOL i=0; i<nPosX; i++)
    1964       12314 :             nPixPosX -= ToPixel(pDoc->GetColWidth(i,nTabNo), nPPTX);
    1965        4056 :         pThisTab->nPixPosX[eWhich] = nPixPosX;
    1966             : 
    1967        4056 :         long nPixPosY = 0;
    1968        4056 :         SCROW nPosY = pThisTab->nPosY[eWhich];
    1969     9179712 :         for (SCROW j=0; j<nPosY; j++)
    1970     9175656 :             nPixPosY -= ToPixel(pDoc->GetRowHeight(j,nTabNo), nPPTY);
    1971        4056 :         pThisTab->nPixPosY[eWhich] = nPixPosY;
    1972             :     }
    1973        2028 : }
    1974             : 
    1975        3342 : const MapMode& ScViewData::GetLogicMode( ScSplitPos eWhich )
    1976             : {
    1977        3342 :     aLogicMode.SetOrigin( Point( pThisTab->nMPosX[WhichH(eWhich)],
    1978        6684 :                                     pThisTab->nMPosY[WhichV(eWhich)] ) );
    1979        3342 :     return aLogicMode;
    1980             : }
    1981             : 
    1982       26590 : const MapMode& ScViewData::GetLogicMode()
    1983             : {
    1984       26590 :     aLogicMode.SetOrigin( Point() );
    1985       26590 :     return aLogicMode;
    1986             : }
    1987             : 
    1988           0 : void ScViewData::SetScreen( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
    1989             : {
    1990             :     SCCOL nCol;
    1991             :     SCROW nRow;
    1992             :     sal_uInt16 nTSize;
    1993             :     long nSizePix;
    1994           0 :     long nScrPosX = 0;
    1995           0 :     long nScrPosY = 0;
    1996             : 
    1997           0 :     SetActivePart( SC_SPLIT_BOTTOMLEFT );
    1998           0 :     SetPosX( SC_SPLIT_LEFT, nCol1 );
    1999           0 :     SetPosY( SC_SPLIT_BOTTOM, nRow1 );
    2000             : 
    2001           0 :     for (nCol=nCol1; nCol<=nCol2; nCol++)
    2002             :     {
    2003           0 :         nTSize = pDoc->GetColWidth( nCol, nTabNo );
    2004           0 :         if (nTSize)
    2005             :         {
    2006           0 :             nSizePix = ToPixel( nTSize, nPPTX );
    2007           0 :             nScrPosX += (sal_uInt16) nSizePix;
    2008             :         }
    2009             :     }
    2010             : 
    2011           0 :     for (nRow=nRow1; nRow<=nRow2; nRow++)
    2012             :     {
    2013           0 :         nTSize = pDoc->GetRowHeight( nRow, nTabNo );
    2014           0 :         if (nTSize)
    2015             :         {
    2016           0 :             nSizePix = ToPixel( nTSize, nPPTY );
    2017           0 :             nScrPosY += (sal_uInt16) nSizePix;
    2018             :         }
    2019             :     }
    2020             : 
    2021           0 :     aScrSize = Size( nScrPosX, nScrPosY );
    2022           0 : }
    2023             : 
    2024           6 : void ScViewData::SetScreenPos( const Point& rVisAreaStart )
    2025             : {
    2026             :     long nSize;
    2027             :     long nTwips;
    2028             :     long nAdd;
    2029             :     bool bEnd;
    2030             : 
    2031           6 :     nSize = 0;
    2032           6 :     nTwips = (long) (rVisAreaStart.X() / HMM_PER_TWIPS);
    2033           6 :     if ( pDoc->IsLayoutRTL( nTabNo ) )
    2034           0 :         nTwips = -nTwips;
    2035           6 :     SCCOL nX1 = 0;
    2036           6 :     bEnd = false;
    2037          19 :     while (!bEnd)
    2038             :     {
    2039           7 :         nAdd = (long) pDoc->GetColWidth(nX1,nTabNo);
    2040           7 :         if (nSize+nAdd <= nTwips+1 && nX1<MAXCOL)
    2041             :         {
    2042           1 :             nSize += nAdd;
    2043           1 :             ++nX1;
    2044             :         }
    2045             :         else
    2046           6 :             bEnd = true;
    2047             :     }
    2048             : 
    2049           6 :     nSize = 0;
    2050           6 :     nTwips = (long) (rVisAreaStart.Y() / HMM_PER_TWIPS);
    2051           6 :     SCROW nY1 = 0;
    2052           6 :     bEnd = false;
    2053          19 :     while (!bEnd)
    2054             :     {
    2055           7 :         nAdd = (long) pDoc->GetRowHeight(nY1,nTabNo);
    2056           7 :         if (nSize+nAdd <= nTwips+1 && nY1<MAXROW)
    2057             :         {
    2058           1 :             nSize += nAdd;
    2059           1 :             ++nY1;
    2060             :         }
    2061             :         else
    2062           6 :             bEnd = true;
    2063             :     }
    2064             : 
    2065           6 :     SetActivePart( SC_SPLIT_BOTTOMLEFT );
    2066           6 :     SetPosX( SC_SPLIT_LEFT, nX1 );
    2067           6 :     SetPosY( SC_SPLIT_BOTTOM, nY1 );
    2068             : 
    2069           6 :     SetCurX( nX1 );
    2070           6 :     SetCurY( nY1 );
    2071           6 : }
    2072             : 
    2073           5 : void ScViewData::SetScreen( const Rectangle& rVisArea )
    2074             : {
    2075           5 :     SetScreenPos( rVisArea.TopLeft() );
    2076             : 
    2077             :     //  here without GetOutputFactor(), since it's for the output into a Metafile
    2078             : 
    2079           5 :     aScrSize = rVisArea.GetSize();
    2080           5 :     aScrSize.Width() = (long)
    2081           5 :         ( aScrSize.Width() * ScGlobal::nScreenPPTX / HMM_PER_TWIPS );
    2082           5 :     aScrSize.Height() = (long)
    2083           5 :         ( aScrSize.Height() * ScGlobal::nScreenPPTY / HMM_PER_TWIPS );
    2084           5 : }
    2085             : 
    2086           0 : ScDocFunc& ScViewData::GetDocFunc() const
    2087             : {
    2088           0 :     return pDocShell->GetDocFunc();
    2089             : }
    2090             : 
    2091       10565 : SfxBindings& ScViewData::GetBindings()
    2092             : {
    2093             :     OSL_ENSURE( pViewShell, "GetBindings() without ViewShell" );
    2094       10565 :     return pViewShell->GetViewFrame()->GetBindings();
    2095             : }
    2096             : 
    2097         434 : SfxDispatcher& ScViewData::GetDispatcher()
    2098             : {
    2099             :     OSL_ENSURE( pViewShell, "GetDispatcher() without ViewShell" );
    2100         434 :     return *pViewShell->GetViewFrame()->GetDispatcher();
    2101             : }
    2102             : 
    2103       41689 : ScMarkData& ScViewData::GetMarkData()
    2104             : {
    2105       41689 :     return *mpMarkData;
    2106             : }
    2107             : 
    2108          42 : const ScMarkData& ScViewData::GetMarkData() const
    2109             : {
    2110          42 :     return *mpMarkData;
    2111             : }
    2112             : 
    2113           0 : vcl::Window* ScViewData::GetDialogParent()
    2114             : {
    2115             :     OSL_ENSURE( pViewShell, "GetDialogParent() ohne ViewShell" );
    2116           0 :     return pViewShell->GetDialogParent();
    2117             : }
    2118             : 
    2119        1013 : ScGridWindow* ScViewData::GetActiveWin()
    2120             : {
    2121             :     OSL_ENSURE( pView, "GetActiveWin() ohne View" );
    2122        1013 :     return pView->GetActiveWin();
    2123             : }
    2124             : 
    2125           0 : const ScGridWindow* ScViewData::GetActiveWin() const
    2126             : {
    2127             :     OSL_ENSURE( pView, "GetActiveWin() ohne View" );
    2128           0 :     return pView->GetActiveWin();
    2129             : }
    2130             : 
    2131         696 : ScDrawView* ScViewData::GetScDrawView()
    2132             : {
    2133             :     OSL_ENSURE( pView, "GetScDrawView() ohne View" );
    2134         696 :     return pView->GetScDrawView();
    2135             : }
    2136             : 
    2137        2964 : bool ScViewData::IsMinimized()
    2138             : {
    2139             :     OSL_ENSURE( pView, "IsMinimized() ohne View" );
    2140        2964 :     return pView->IsMinimized();
    2141             : }
    2142             : 
    2143           0 : void ScViewData::UpdateScreenZoom( const Fraction& rNewX, const Fraction& rNewY )
    2144             : {
    2145           0 :     Fraction aOldX = GetZoomX();
    2146           0 :     Fraction aOldY = GetZoomY();
    2147             : 
    2148           0 :     SetZoom( rNewX, rNewY, false );
    2149             : 
    2150           0 :     Fraction aWidth = GetZoomX();
    2151           0 :     aWidth *= Fraction( aScrSize.Width(),1 );
    2152           0 :     aWidth /= aOldX;
    2153             : 
    2154           0 :     Fraction aHeight = GetZoomY();
    2155           0 :     aHeight *= Fraction( aScrSize.Height(),1 );
    2156           0 :     aHeight /= aOldY;
    2157             : 
    2158           0 :     aScrSize.Width()  = (long) aWidth;
    2159           0 :     aScrSize.Height() = (long) aHeight;
    2160           0 : }
    2161             : 
    2162        2338 : void ScViewData::CalcPPT()
    2163             : {
    2164        2338 :     nPPTX = ScGlobal::nScreenPPTX * (double) GetZoomX();
    2165        2338 :     if (pDocShell)
    2166        2338 :         nPPTX = nPPTX / pDocShell->GetOutputFactor();   // Faktor ist Drucker zu Bildschirm
    2167        2338 :     nPPTY = ScGlobal::nScreenPPTY * (double) GetZoomY();
    2168             : 
    2169             :     //  if detective objects are present,
    2170             :     //  try to adjust horizontal scale so the most common column width has minimal rounding errors,
    2171             :     //  to avoid differences between cell and drawing layer output
    2172             : 
    2173        2338 :     if ( pDoc && pDoc->HasDetectiveObjects(nTabNo) )
    2174             :     {
    2175           0 :         SCCOL nEndCol = 0;
    2176           0 :         SCROW nDummy = 0;
    2177           0 :         pDoc->GetTableArea( nTabNo, nEndCol, nDummy );
    2178           0 :         if (nEndCol<20)
    2179           0 :             nEndCol = 20;           // same end position as when determining draw scale
    2180             : 
    2181           0 :         sal_uInt16 nTwips = pDoc->GetCommonWidth( nEndCol, nTabNo );
    2182           0 :         if ( nTwips )
    2183             :         {
    2184           0 :             double fOriginal = nTwips * nPPTX;
    2185           0 :             if ( fOriginal < static_cast<double>(nEndCol) )
    2186             :             {
    2187             :                 //  if one column is smaller than the column count,
    2188             :                 //  rounding errors are likely to add up to a whole column.
    2189             : 
    2190           0 :                 double fRounded = ::rtl::math::approxFloor( fOriginal + 0.5 );
    2191           0 :                 if ( fRounded > 0.0 )
    2192             :                 {
    2193           0 :                     double fScale = fRounded / fOriginal + 1E-6;
    2194           0 :                     if ( fScale >= 0.9 && fScale <= 1.1 )
    2195           0 :                         nPPTX *= fScale;
    2196             :                 }
    2197             :             }
    2198             :         }
    2199             :     }
    2200        2338 : }
    2201             : 
    2202             : #define SC_OLD_TABSEP   '/'
    2203             : #define SC_NEW_TABSEP   '+'
    2204             : 
    2205           1 : void ScViewData::WriteUserData(OUString& rData)
    2206             : {
    2207             :     //  nZoom (bis 364v) oder nZoom/nPageZoom/bPageMode (ab 364w)
    2208             :     //  nTab
    2209             :     //  Tab-ControlBreite
    2210             :     //  pro Tabelle:
    2211             :     //  CursorX/CursorY/HSplitMode/VSplitMode/HSplitPos/VSplitPos/SplitActive/
    2212             :     //  PosX[links]/PosX[rechts]/PosY[oben]/PosY[unten]
    2213             :     //  wenn Zeilen groesser 8192, "+" statt "/"
    2214             : 
    2215           1 :     sal_uInt16 nZoom = (sal_uInt16)((pThisTab->aZoomY.GetNumerator() * 100) / pThisTab->aZoomY.GetDenominator());
    2216           1 :     rData = OUString::number( nZoom ) + "/";
    2217           1 :     nZoom = (sal_uInt16)((pThisTab->aPageZoomY.GetNumerator() * 100) / pThisTab->aPageZoomY.GetDenominator());
    2218           1 :     rData += OUString::number( nZoom ) + "/";
    2219           1 :     if (bPagebreak)
    2220           0 :         rData += "1";
    2221             :     else
    2222           1 :         rData += "0";
    2223             : 
    2224           2 :     rData += ";" + OUString::number( nTabNo ) + ";" TAG_TABBARWIDTH +
    2225           3 :              OUString::number( pView->GetTabBarWidth() );
    2226             : 
    2227           1 :     SCTAB nTabCount = pDoc->GetTableCount();
    2228           2 :     for (SCTAB i=0; i<nTabCount; i++)
    2229             :     {
    2230           1 :         rData += ";";                   // Numerierung darf auf keinen Fall durcheinanderkommen
    2231           1 :         if (i < static_cast<SCTAB>(maTabData.size()) && maTabData[i])
    2232             :         {
    2233           1 :             OUString cTabSep = OUString(SC_OLD_TABSEP);                // like 3.1
    2234           3 :             if ( maTabData[i]->nCurY > MAXROW_30 ||
    2235           3 :                  maTabData[i]->nPosY[0] > MAXROW_30 || maTabData[i]->nPosY[1] > MAXROW_30 ||
    2236           1 :                  ( maTabData[i]->eVSplitMode == SC_SPLIT_FIX &&
    2237           0 :                     maTabData[i]->nFixPosY > MAXROW_30 ) )
    2238             :             {
    2239           0 :                 cTabSep = OUStringLiteral1<SC_NEW_TABSEP>(); // in order to not kill a 3.1-version
    2240             :             }
    2241             : 
    2242           2 :             rData += OUString::number( maTabData[i]->nCurX ) + cTabSep +
    2243           4 :                      OUString::number( maTabData[i]->nCurY ) + cTabSep +
    2244           4 :                      OUString::number( maTabData[i]->eHSplitMode ) + cTabSep +
    2245           3 :                      OUString::number( maTabData[i]->eVSplitMode ) + cTabSep;
    2246           1 :             if ( maTabData[i]->eHSplitMode == SC_SPLIT_FIX )
    2247           0 :                 rData += OUString::number( maTabData[i]->nFixPosX );
    2248             :             else
    2249           1 :                 rData += OUString::number( maTabData[i]->nHSplitPos );
    2250           1 :             rData += cTabSep;
    2251           1 :             if ( maTabData[i]->eVSplitMode == SC_SPLIT_FIX )
    2252           0 :                 rData += OUString::number( maTabData[i]->nFixPosY );
    2253             :             else
    2254           1 :                 rData += OUString::number( maTabData[i]->nVSplitPos );
    2255           2 :             rData += cTabSep +
    2256           4 :                      OUString::number( maTabData[i]->eWhichActive ) + cTabSep +
    2257           4 :                      OUString::number( maTabData[i]->nPosX[0] ) + cTabSep +
    2258           4 :                      OUString::number( maTabData[i]->nPosX[1] ) + cTabSep +
    2259           4 :                      OUString::number( maTabData[i]->nPosY[0] ) + cTabSep +
    2260           3 :                      OUString::number( maTabData[i]->nPosY[1] );
    2261             :         }
    2262             :     }
    2263           1 : }
    2264             : 
    2265           0 : void ScViewData::ReadUserData(const OUString& rData)
    2266             : {
    2267           0 :     if (rData.isEmpty())    // Leerer String kommt bei "neu Laden"
    2268           0 :         return;             // then exit without assertion
    2269             : 
    2270           0 :     sal_Int32 nCount = comphelper::string::getTokenCount(rData, ';');
    2271           0 :     if ( nCount <= 2 )
    2272             :     {
    2273             :         //  beim Reload in der Seitenansicht sind evtl. die Preview-UserData
    2274             :         //  stehengelassen worden. Den Zoom von der Preview will man hier nicht...
    2275             :         OSL_FAIL("ReadUserData: das sind nicht meine Daten");
    2276           0 :         return;
    2277             :     }
    2278             : 
    2279             :     // nicht pro Tabelle:
    2280           0 :     SCTAB nTabStart = 2;
    2281             : 
    2282           0 :     Fraction aZoomX, aZoomY, aPageZoomX, aPageZoomY;    // evaluate (all sheets?)
    2283             : 
    2284           0 :     OUString aZoomStr = rData.getToken(0, ';');                 // Zoom/PageZoom/Modus
    2285           0 :     sal_uInt16 nNormZoom = sal::static_int_cast<sal_uInt16>(aZoomStr.getToken(0,'/').toInt32());
    2286           0 :     if ( nNormZoom >= MINZOOM && nNormZoom <= MAXZOOM )
    2287           0 :         aZoomX = aZoomY = Fraction( nNormZoom, 100 );           //  "normal" zoom (always)
    2288           0 :     sal_uInt16 nPageZoom = sal::static_int_cast<sal_uInt16>(aZoomStr.getToken(1,'/').toInt32());
    2289           0 :     if ( nPageZoom >= MINZOOM && nPageZoom <= MAXZOOM )
    2290           0 :         aPageZoomX = aPageZoomY = Fraction( nPageZoom, 100 );   // Pagebreak-zoom, if set
    2291           0 :     sal_Unicode cMode = aZoomStr.getToken(2,'/')[0];            // 0 or "0"/"1"
    2292           0 :     SetPagebreakMode( cMode == '1' );
    2293             :     // SetPagebreakMode muss immer gerufen werden wegen CalcPPT / RecalcPixPos()
    2294             : 
    2295             :     //  Tabelle kann ungueltig geworden sein (z.B. letzte Version):
    2296           0 :     SCTAB nNewTab = static_cast<SCTAB>(rData.getToken(1, ';').toInt32());
    2297           0 :     if (pDoc->HasTable( nNewTab ))
    2298           0 :         SetTabNo(nNewTab);
    2299             : 
    2300             :     // wenn vorhanden, TabBar-Breite holen:
    2301           0 :     OUString aTabOpt = rData.getToken(2, ';');
    2302             : 
    2303           0 :     if (aTabOpt.startsWith(TAG_TABBARWIDTH))
    2304             :     {
    2305           0 :         sal_Int32 nTagLen = RTL_CONSTASCII_LENGTH(TAG_TABBARWIDTH);
    2306           0 :         pView->SetTabBarWidth(aTabOpt.copy(nTagLen).toInt32());
    2307           0 :         nTabStart = 3;
    2308             :     }
    2309             : 
    2310             :     // per table
    2311           0 :     SCTAB nPos = 0;
    2312           0 :     while ( nCount > nPos+nTabStart )
    2313             :     {
    2314           0 :         aTabOpt = rData.getToken(static_cast<sal_Int32>(nPos+nTabStart), ';');
    2315           0 :         EnsureTabDataSize(nPos + 1);
    2316           0 :         if (!maTabData[nPos])
    2317           0 :             maTabData[nPos] = new ScViewDataTable;
    2318             : 
    2319           0 :         sal_Unicode cTabSep = 0;
    2320           0 :         if (comphelper::string::getTokenCount(aTabOpt, SC_OLD_TABSEP) >= 11)
    2321           0 :             cTabSep = SC_OLD_TABSEP;
    2322           0 :         else if (comphelper::string::getTokenCount(aTabOpt, SC_NEW_TABSEP) >= 11)
    2323           0 :             cTabSep = SC_NEW_TABSEP;
    2324             :         // '+' ist nur erlaubt, wenn wir mit Zeilen > 8192 umgehen koennen
    2325             : 
    2326           0 :         if (cTabSep)
    2327             :         {
    2328           0 :             maTabData[nPos]->nCurX = SanitizeCol( static_cast<SCCOL>(aTabOpt.getToken(0,cTabSep).toInt32()));
    2329           0 :             maTabData[nPos]->nCurY = SanitizeRow( aTabOpt.getToken(1,cTabSep).toInt32());
    2330           0 :             maTabData[nPos]->eHSplitMode = (ScSplitMode) aTabOpt.getToken(2,cTabSep).toInt32();
    2331           0 :             maTabData[nPos]->eVSplitMode = (ScSplitMode) aTabOpt.getToken(3,cTabSep).toInt32();
    2332             : 
    2333           0 :             if ( maTabData[nPos]->eHSplitMode == SC_SPLIT_FIX )
    2334             :             {
    2335           0 :                 maTabData[nPos]->nFixPosX = SanitizeCol( static_cast<SCCOL>(aTabOpt.getToken(4,cTabSep).toInt32()));
    2336           0 :                 UpdateFixX(nPos);
    2337             :             }
    2338             :             else
    2339           0 :                 maTabData[nPos]->nHSplitPos = aTabOpt.getToken(4,cTabSep).toInt32();
    2340             : 
    2341           0 :             if ( maTabData[nPos]->eVSplitMode == SC_SPLIT_FIX )
    2342             :             {
    2343           0 :                 maTabData[nPos]->nFixPosY = SanitizeRow( aTabOpt.getToken(5,cTabSep).toInt32());
    2344           0 :                 UpdateFixY(nPos);
    2345             :             }
    2346             :             else
    2347           0 :                 maTabData[nPos]->nVSplitPos = aTabOpt.getToken(5,cTabSep).toInt32();
    2348             : 
    2349           0 :             maTabData[nPos]->eWhichActive = (ScSplitPos) aTabOpt.getToken(6,cTabSep).toInt32();
    2350           0 :             maTabData[nPos]->nPosX[0] = SanitizeCol( static_cast<SCCOL>(aTabOpt.getToken(7,cTabSep).toInt32()));
    2351           0 :             maTabData[nPos]->nPosX[1] = SanitizeCol( static_cast<SCCOL>(aTabOpt.getToken(8,cTabSep).toInt32()));
    2352           0 :             maTabData[nPos]->nPosY[0] = SanitizeRow( aTabOpt.getToken(9,cTabSep).toInt32());
    2353           0 :             maTabData[nPos]->nPosY[1] = SanitizeRow( aTabOpt.getToken(10,cTabSep).toInt32());
    2354             : 
    2355             :             //  Test, ob der aktive Teil laut SplitMode ueberhaupt existiert
    2356             :             //  (Bug #44516#)
    2357           0 :             ScSplitPos eTest = maTabData[nPos]->eWhichActive;
    2358           0 :             if ( ( WhichH( eTest ) == SC_SPLIT_RIGHT &&
    2359           0 :                     maTabData[nPos]->eHSplitMode == SC_SPLIT_NONE ) ||
    2360           0 :                  ( WhichV( eTest ) == SC_SPLIT_TOP &&
    2361           0 :                     maTabData[nPos]->eVSplitMode == SC_SPLIT_NONE ) )
    2362             :             {
    2363             :                 //  dann wieder auf Default (unten links)
    2364           0 :                 maTabData[nPos]->eWhichActive = SC_SPLIT_BOTTOMLEFT;
    2365             :                 OSL_FAIL("SplitPos musste korrigiert werden");
    2366             :             }
    2367             :         }
    2368           0 :         ++nPos;
    2369             :     }
    2370             : 
    2371           0 :     RecalcPixPos();
    2372             : }
    2373             : 
    2374          25 : void ScViewData::WriteExtOptions( ScExtDocOptions& rDocOpt ) const
    2375             : {
    2376             :     // *** Fill extended document data for export filters ***
    2377             : 
    2378             :     // document settings
    2379          25 :     ScExtDocSettings& rDocSett = rDocOpt.GetDocSettings();
    2380             : 
    2381             :     // displayed sheet
    2382          25 :     rDocSett.mnDisplTab = GetTabNo();
    2383             : 
    2384             :     // width of the tabbar, relative to frame window width
    2385          25 :     rDocSett.mfTabBarWidth = pView->GetPendingRelTabBarWidth();
    2386          25 :     if( rDocSett.mfTabBarWidth < 0.0 )
    2387          25 :         rDocSett.mfTabBarWidth = pView->GetRelTabBarWidth();
    2388             : 
    2389             :     // sheet settings
    2390          82 :     for( SCTAB nTab = 0; nTab < static_cast<SCTAB>(maTabData.size()); ++nTab )
    2391             :     {
    2392          57 :         if( const ScViewDataTable* pViewTab = maTabData[ nTab ] )
    2393             :         {
    2394          32 :             ScExtTabSettings& rTabSett = rDocOpt.GetOrCreateTabSettings( nTab );
    2395             : 
    2396             :             // split mode
    2397          32 :             ScSplitMode eHSplit = pViewTab->eHSplitMode;
    2398          32 :             ScSplitMode eVSplit = pViewTab->eVSplitMode;
    2399          32 :             bool bHSplit = eHSplit != SC_SPLIT_NONE;
    2400          32 :             bool bVSplit = eVSplit != SC_SPLIT_NONE;
    2401          32 :             bool bRealSplit = (eHSplit == SC_SPLIT_NORMAL) || (eVSplit == SC_SPLIT_NORMAL);
    2402          32 :             bool bFrozen    = (eHSplit == SC_SPLIT_FIX)    || (eVSplit == SC_SPLIT_FIX);
    2403             :             OSL_ENSURE( !bRealSplit || !bFrozen, "ScViewData::WriteExtOptions - split and freeze in same sheet" );
    2404          32 :             rTabSett.mbFrozenPanes = !bRealSplit && bFrozen;
    2405             : 
    2406             :             // split and freeze position
    2407          32 :             rTabSett.maSplitPos = Point( 0, 0 );
    2408          32 :             rTabSett.maFreezePos.Set( 0, 0, nTab );
    2409          32 :             if( bRealSplit )
    2410             :             {
    2411           0 :                 Point& rSplitPos = rTabSett.maSplitPos;
    2412           0 :                 rSplitPos = Point( bHSplit ? pViewTab->nHSplitPos : 0, bVSplit ? pViewTab->nVSplitPos : 0 );
    2413           0 :                 rSplitPos = Application::GetDefaultDevice()->PixelToLogic( rSplitPos, MapMode( MAP_TWIP ) );
    2414           0 :                 if( pDocShell )
    2415           0 :                     rSplitPos.X() = (long)((double)rSplitPos.X() / pDocShell->GetOutputFactor());
    2416             :             }
    2417          32 :             else if( bFrozen )
    2418             :             {
    2419           0 :                 if( bHSplit ) rTabSett.maFreezePos.SetCol( pViewTab->nFixPosX );
    2420           0 :                 if( bVSplit ) rTabSett.maFreezePos.SetRow( pViewTab->nFixPosY );
    2421             :             }
    2422             : 
    2423             :             // first visible cell in top-left and additional panes
    2424          32 :             rTabSett.maFirstVis.Set( pViewTab->nPosX[ SC_SPLIT_LEFT ], pViewTab->nPosY[ bVSplit ? SC_SPLIT_TOP : SC_SPLIT_BOTTOM ], nTab );
    2425          32 :             rTabSett.maSecondVis.Set( pViewTab->nPosX[ SC_SPLIT_RIGHT ], pViewTab->nPosY[ SC_SPLIT_BOTTOM ], nTab );
    2426             : 
    2427             :             // active pane
    2428          32 :             switch( pViewTab->eWhichActive )
    2429             :             {
    2430             :                 // no horizontal split -> always use left panes
    2431             :                 // no vertical split -> always use top panes
    2432             :                 case SC_SPLIT_TOPLEFT:
    2433           0 :                     rTabSett.meActivePane = SCEXT_PANE_TOPLEFT;
    2434           0 :                 break;
    2435             :                 case SC_SPLIT_TOPRIGHT:
    2436           0 :                     rTabSett.meActivePane = bHSplit ? SCEXT_PANE_TOPRIGHT : SCEXT_PANE_TOPLEFT;
    2437           0 :                 break;
    2438             :                 case SC_SPLIT_BOTTOMLEFT:
    2439          32 :                     rTabSett.meActivePane = bVSplit ? SCEXT_PANE_BOTTOMLEFT : SCEXT_PANE_TOPLEFT;
    2440          32 :                 break;
    2441             :                 case SC_SPLIT_BOTTOMRIGHT:
    2442             :                     rTabSett.meActivePane = bHSplit ?
    2443             :                         (bVSplit ? SCEXT_PANE_BOTTOMRIGHT : SCEXT_PANE_TOPRIGHT) :
    2444           0 :                         (bVSplit ? SCEXT_PANE_BOTTOMLEFT : SCEXT_PANE_TOPLEFT);
    2445           0 :                 break;
    2446             :             }
    2447             : 
    2448             :             // cursor position
    2449          32 :             rTabSett.maCursor.Set( pViewTab->nCurX, pViewTab->nCurY, nTab );
    2450             : 
    2451             :             // sheet selection and selected ranges
    2452          32 :             const ScMarkData& rMarkData = GetMarkData();
    2453          32 :             rTabSett.mbSelected = rMarkData.GetTableSelect( nTab );
    2454          32 :             rMarkData.FillRangeListWithMarks( &rTabSett.maSelection, true );
    2455             : 
    2456             :             // grid color
    2457          32 :             rTabSett.maGridColor.SetColor( COL_AUTO );
    2458          32 :             if( pOptions )
    2459             :             {
    2460          32 :                 const Color& rGridColor = pOptions->GetGridColor();
    2461          32 :                 if( rGridColor.GetColor() != SC_STD_GRIDCOLOR )
    2462           0 :                     rTabSett.maGridColor = rGridColor;
    2463             :             }
    2464          32 :             rTabSett.mbShowGrid = pViewTab->bShowGrid;
    2465             : 
    2466             :             // view mode and zoom
    2467          32 :             rTabSett.mbPageMode = bPagebreak;
    2468          32 :             rTabSett.mnNormalZoom = static_cast< long >( pViewTab->aZoomY * Fraction( 100.0 ) );
    2469          32 :             rTabSett.mnPageZoom = static_cast< long >( pViewTab->aPageZoomY * Fraction( 100.0 ) );
    2470             :         }
    2471             :     }
    2472          25 : }
    2473             : 
    2474          29 : void ScViewData::ReadExtOptions( const ScExtDocOptions& rDocOpt )
    2475             : {
    2476             :     // *** Get extended document data from import filters ***
    2477             : 
    2478          58 :     if( !rDocOpt.IsChanged() ) return;
    2479             : 
    2480             :     // document settings
    2481          29 :     const ScExtDocSettings& rDocSett = rDocOpt.GetDocSettings();
    2482             : 
    2483             :     // displayed sheet
    2484          29 :     SetTabNo( rDocSett.mnDisplTab );
    2485             : 
    2486             :     /*  Width of the tabbar, relative to frame window width. We do not have the
    2487             :         correct width of the frame window here -> store in ScTabView, which sets
    2488             :         the size in the next resize. */
    2489          29 :     pView->SetPendingRelTabBarWidth( rDocSett.mfTabBarWidth );
    2490             : 
    2491             :     // sheet settings
    2492          29 :     SCTAB nLastTab = rDocOpt.GetLastTab();
    2493          29 :     if (static_cast<SCTAB>(maTabData.size()) <= nLastTab)
    2494          24 :         maTabData.resize(nLastTab+1);
    2495             : 
    2496         116 :     for( SCTAB nTab = 0; nTab < static_cast<SCTAB>(maTabData.size()); ++nTab )
    2497             :     {
    2498          87 :         if( const ScExtTabSettings* pTabSett = rDocOpt.GetTabSettings( nTab ) )
    2499             :         {
    2500          85 :             if( !maTabData[ nTab ] )
    2501          55 :                 maTabData[ nTab ] = new ScViewDataTable;
    2502             : 
    2503          85 :             const ScExtTabSettings& rTabSett = *pTabSett;
    2504          85 :             ScViewDataTable& rViewTab = *maTabData[ nTab ];
    2505             : 
    2506             :             // split mode initialization
    2507          85 :             bool bFrozen = rTabSett.mbFrozenPanes;
    2508          85 :             bool bHSplit = bFrozen ? (rTabSett.maFreezePos.Col() > 0) : (rTabSett.maSplitPos.X() > 0);
    2509          85 :             bool bVSplit = bFrozen ? (rTabSett.maFreezePos.Row() > 0) : (rTabSett.maSplitPos.Y() > 0);
    2510             : 
    2511             :             // first visible cell of top-left pane and additional panes
    2512          85 :             if (rTabSett.maFirstVis.IsValid())
    2513             :             {
    2514          85 :                 rViewTab.nPosX[ SC_SPLIT_LEFT ] = rTabSett.maFirstVis.Col();
    2515          85 :                 rViewTab.nPosY[ bVSplit ? SC_SPLIT_TOP : SC_SPLIT_BOTTOM ] = rTabSett.maFirstVis.Row();
    2516             :             }
    2517             : 
    2518          85 :             if (rTabSett.maSecondVis.IsValid())
    2519             :             {
    2520          85 :                 if (bHSplit)
    2521           0 :                     rViewTab.nPosX[ SC_SPLIT_RIGHT ] = rTabSett.maSecondVis.Col();
    2522          85 :                 if (bVSplit)
    2523           0 :                     rViewTab.nPosY[ SC_SPLIT_BOTTOM ] = rTabSett.maSecondVis.Row();
    2524             :             }
    2525             : 
    2526             :             // split mode, split and freeze position
    2527          85 :             rViewTab.eHSplitMode = rViewTab.eVSplitMode = SC_SPLIT_NONE;
    2528          85 :             rViewTab.nHSplitPos = rViewTab.nVSplitPos = 0;
    2529          85 :             rViewTab.nFixPosX = 0;
    2530          85 :             rViewTab.nFixPosY = 0;
    2531          85 :             if( bFrozen )
    2532             :             {
    2533           0 :                 if( bHSplit )
    2534             :                 {
    2535           0 :                     rViewTab.eHSplitMode = SC_SPLIT_FIX;
    2536           0 :                     rViewTab.nFixPosX = rTabSett.maFreezePos.Col();
    2537           0 :                     UpdateFixX( nTab );
    2538             :                 }
    2539           0 :                 if( bVSplit )
    2540             :                 {
    2541           0 :                     rViewTab.eVSplitMode = SC_SPLIT_FIX;
    2542           0 :                     rViewTab.nFixPosY = rTabSett.maFreezePos.Row();
    2543           0 :                     UpdateFixY( nTab );
    2544             :                 }
    2545             :             }
    2546             :             else
    2547             :             {
    2548             :                 Point aPixel = Application::GetDefaultDevice()->LogicToPixel(
    2549          85 :                                 rTabSett.maSplitPos, MapMode( MAP_TWIP ) );  //! Zoom?
    2550             :                 // the test for use of printer metrics for text formatting here
    2551             :                 // effectively results in the nFactor = 1.0 regardless of the Option setting.
    2552          85 :                 if( pDocShell && SC_MOD()->GetInputOptions().GetTextWysiwyg())
    2553             :                 {
    2554           0 :                     double nFactor = pDocShell->GetOutputFactor();
    2555           0 :                     aPixel.X() = (long)( aPixel.X() * nFactor + 0.5 );
    2556             :                 }
    2557             : 
    2558          85 :                 bHSplit = bHSplit && aPixel.X() > 0;
    2559          85 :                 bVSplit = bVSplit && aPixel.Y() > 0;
    2560          85 :                 if( bHSplit )
    2561             :                 {
    2562           0 :                     rViewTab.eHSplitMode = SC_SPLIT_NORMAL;
    2563           0 :                     rViewTab.nHSplitPos = aPixel.X();
    2564             :                 }
    2565          85 :                 if( bVSplit )
    2566             :                 {
    2567           0 :                     rViewTab.eVSplitMode = SC_SPLIT_NORMAL;
    2568           0 :                     rViewTab.nVSplitPos = aPixel.Y();
    2569             :                 }
    2570             :             }
    2571             : 
    2572             :             // active pane
    2573          85 :             ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT;
    2574          85 :             switch( rTabSett.meActivePane )
    2575             :             {
    2576             :                 // no horizontal split -> always use left panes
    2577             :                 // no vertical split -> always use *bottom* panes
    2578             :                 case SCEXT_PANE_TOPLEFT:
    2579          85 :                     ePos = bVSplit ? SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT;
    2580          85 :                 break;
    2581             :                 case SCEXT_PANE_TOPRIGHT:
    2582             :                     ePos = bHSplit ?
    2583             :                         (bVSplit ? SC_SPLIT_TOPRIGHT : SC_SPLIT_BOTTOMRIGHT) :
    2584           0 :                         (bVSplit ? SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT);
    2585           0 :                 break;
    2586             :                 case SCEXT_PANE_BOTTOMLEFT:
    2587           0 :                     ePos = SC_SPLIT_BOTTOMLEFT;
    2588           0 :                 break;
    2589             :                 case SCEXT_PANE_BOTTOMRIGHT:
    2590           0 :                     ePos = bHSplit ? SC_SPLIT_BOTTOMRIGHT : SC_SPLIT_BOTTOMLEFT;
    2591           0 :                 break;
    2592             :             }
    2593          85 :             rViewTab.eWhichActive = ePos;
    2594             : 
    2595             :             // cursor position
    2596          85 :             const ScAddress& rCursor = rTabSett.maCursor;
    2597          85 :             if( rCursor.IsValid() )
    2598             :             {
    2599          85 :                 rViewTab.nCurX = rCursor.Col();
    2600          85 :                 rViewTab.nCurY = rCursor.Row();
    2601             :             }
    2602             : 
    2603             :             // sheet selection and selected ranges
    2604          85 :             ScMarkData& rMarkData = GetMarkData();
    2605          85 :             rMarkData.SelectTable( nTab, rTabSett.mbSelected );
    2606             : 
    2607             :             // zoom for each sheet
    2608          85 :             if( rTabSett.mnNormalZoom )
    2609          85 :                 rViewTab.aZoomX = rViewTab.aZoomY = Fraction( rTabSett.mnNormalZoom, 100L );
    2610          85 :             if( rTabSett.mnPageZoom )
    2611          85 :                 rViewTab.aPageZoomX = rViewTab.aPageZoomY = Fraction( rTabSett.mnPageZoom, 100L );
    2612             : 
    2613          85 :             rViewTab.bShowGrid = rTabSett.mbShowGrid;
    2614             : 
    2615             :             // get some settings from displayed Excel sheet, set at Calc document
    2616          85 :             if( nTab == GetTabNo() )
    2617             :             {
    2618             :                 // grid color -- #i47435# set automatic grid color explicitly
    2619          29 :                 if( pOptions )
    2620             :                 {
    2621          29 :                     Color aGridColor( rTabSett.maGridColor );
    2622          29 :                     if( aGridColor.GetColor() == COL_AUTO )
    2623          29 :                         aGridColor.SetColor( SC_STD_GRIDCOLOR );
    2624          29 :                     pOptions->SetGridColor( aGridColor, EMPTY_OUSTRING );
    2625             :                 }
    2626             : 
    2627             :                 // view mode and default zoom (for new sheets) from current sheet
    2628          29 :                 if( rTabSett.mnNormalZoom )
    2629          29 :                     aDefZoomX = aDefZoomY = Fraction( rTabSett.mnNormalZoom, 100L );
    2630          29 :                 if( rTabSett.mnPageZoom )
    2631          29 :                     aDefPageZoomX = aDefPageZoomY = Fraction( rTabSett.mnPageZoom, 100L );
    2632             :                 /*  #i46820# set pagebreak mode via SetPagebreakMode(), this will
    2633             :                     update map modes that are needed to draw text correctly. */
    2634          29 :                 SetPagebreakMode( rTabSett.mbPageMode );
    2635             :             }
    2636             :         }
    2637             :     }
    2638             : 
    2639             :     // RecalcPixPos oder so - auch nMPos - auch bei ReadUserData ??!?!
    2640             : }
    2641             : 
    2642         236 : void ScViewData::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rSettings) const
    2643             : {
    2644         236 :     rSettings.realloc(SC_VIEWSETTINGS_COUNT);
    2645             :     // + 1, because we have to put the view id in the sequence
    2646         236 :     beans::PropertyValue* pSettings = rSettings.getArray();
    2647         236 :     if (pSettings)
    2648             :     {
    2649         236 :         sal_uInt16 nViewID(pViewShell->GetViewFrame()->GetCurViewId());
    2650         236 :         pSettings[SC_VIEW_ID].Name = SC_VIEWID;
    2651         236 :         OUStringBuffer sBuffer(SC_VIEW);
    2652             :         ::sax::Converter::convertNumber(sBuffer,
    2653         236 :                 static_cast<sal_Int32>(nViewID));
    2654         236 :         pSettings[SC_VIEW_ID].Value <<= sBuffer.makeStringAndClear();
    2655             : 
    2656             :         uno::Reference<container::XNameContainer> xNameContainer =
    2657         472 :              document::NamedPropertyValues::create( comphelper::getProcessComponentContext() );
    2658         551 :         for (SCTAB nTab=0; nTab<static_cast<SCTAB>(maTabData.size()); nTab++)
    2659             :         {
    2660         315 :             if (maTabData[nTab])
    2661             :             {
    2662         292 :                 uno::Sequence <beans::PropertyValue> aTableViewSettings;
    2663         292 :                 maTabData[nTab]->WriteUserDataSequence(aTableViewSettings, *this, nTab);
    2664         584 :                 OUString sTabName;
    2665         292 :                 GetDocument()->GetName( nTab, sTabName );
    2666         584 :                 uno::Any aAny;
    2667         292 :                 aAny <<= aTableViewSettings;
    2668             :                 try
    2669             :                 {
    2670         292 :                     xNameContainer->insertByName(sTabName, aAny);
    2671             :                 }
    2672             :                 //#101739#; two tables with the same name are possible
    2673           0 :                 catch ( container::ElementExistException& )
    2674             :                 {
    2675             :                     OSL_FAIL("seems there are two tables with the same name");
    2676             :                 }
    2677           0 :                 catch ( uno::RuntimeException& )
    2678             :                 {
    2679             :                     OSL_FAIL("something went wrong");
    2680         292 :                 }
    2681             :             }
    2682             :         }
    2683         236 :         pSettings[SC_TABLE_VIEWSETTINGS].Name = SC_TABLES;
    2684         236 :         pSettings[SC_TABLE_VIEWSETTINGS].Value <<= xNameContainer;
    2685             : 
    2686         472 :         OUString sName;
    2687         236 :         GetDocument()->GetName( nTabNo, sName );
    2688         236 :         pSettings[SC_ACTIVE_TABLE].Name = SC_ACTIVETABLE;
    2689         236 :         pSettings[SC_ACTIVE_TABLE].Value <<= sName;
    2690         236 :         pSettings[SC_HORIZONTAL_SCROLL_BAR_WIDTH].Name = SC_HORIZONTALSCROLLBARWIDTH;
    2691         236 :         pSettings[SC_HORIZONTAL_SCROLL_BAR_WIDTH].Value <<= sal_Int32(pView->GetTabBarWidth());
    2692         236 :         sal_Int32 nZoomValue ((pThisTab->aZoomY.GetNumerator() * 100) / pThisTab->aZoomY.GetDenominator());
    2693         236 :         sal_Int32 nPageZoomValue ((pThisTab->aPageZoomY.GetNumerator() * 100) / pThisTab->aPageZoomY.GetDenominator());
    2694         236 :         pSettings[SC_ZOOM_TYPE].Name = SC_ZOOMTYPE;
    2695         236 :         pSettings[SC_ZOOM_TYPE].Value <<= sal_Int16(pThisTab->eZoomType);
    2696         236 :         pSettings[SC_ZOOM_VALUE].Name = SC_ZOOMVALUE;
    2697         236 :         pSettings[SC_ZOOM_VALUE].Value <<= nZoomValue;
    2698         236 :         pSettings[SC_PAGE_VIEW_ZOOM_VALUE].Name = SC_PAGEVIEWZOOMVALUE;
    2699         236 :         pSettings[SC_PAGE_VIEW_ZOOM_VALUE].Value <<= nPageZoomValue;
    2700         236 :         pSettings[SC_PAGE_BREAK_PREVIEW].Name = SC_SHOWPAGEBREAKPREVIEW;
    2701         236 :         ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_PAGE_BREAK_PREVIEW].Value, bPagebreak);
    2702             : 
    2703         236 :         if (pOptions)
    2704             :         {
    2705         236 :             pSettings[SC_SHOWZERO].Name = SC_UNO_SHOWZERO;
    2706         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHOWZERO].Value, pOptions->GetOption( VOPT_NULLVALS ) );
    2707         236 :             pSettings[SC_SHOWNOTES].Name = SC_UNO_SHOWNOTES;
    2708         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHOWNOTES].Value, pOptions->GetOption( VOPT_NOTES ) );
    2709         236 :             pSettings[SC_SHOWGRID].Name = SC_UNO_SHOWGRID;
    2710         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHOWGRID].Value, pOptions->GetOption( VOPT_GRID ) );
    2711         236 :             pSettings[SC_GRIDCOLOR].Name = SC_UNO_GRIDCOLOR;
    2712         236 :             OUString aColorName;
    2713         236 :             Color aColor = pOptions->GetGridColor(&aColorName);
    2714         236 :             pSettings[SC_GRIDCOLOR].Value <<= static_cast<sal_Int64>(aColor.GetColor());
    2715         236 :             pSettings[SC_SHOWPAGEBR].Name = SC_UNO_SHOWPAGEBR;
    2716         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHOWPAGEBR].Value, pOptions->GetOption( VOPT_PAGEBREAKS ) );
    2717         236 :             pSettings[SC_COLROWHDR].Name = SC_UNO_COLROWHDR;
    2718         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_COLROWHDR].Value, pOptions->GetOption( VOPT_HEADER ) );
    2719         236 :             pSettings[SC_SHEETTABS].Name = SC_UNO_SHEETTABS;
    2720         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHEETTABS].Value, pOptions->GetOption( VOPT_TABCONTROLS ) );
    2721         236 :             pSettings[SC_OUTLSYMB].Name = SC_UNO_OUTLSYMB;
    2722         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_OUTLSYMB].Value, pOptions->GetOption( VOPT_OUTLINER ) );
    2723         236 :             pSettings[SC_VALUE_HIGHLIGHTING].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_VALUEHIGH ) );
    2724         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_VALUE_HIGHLIGHTING].Value, pOptions->GetOption( VOPT_SYNTAX ) );
    2725             : 
    2726         236 :             const ScGridOptions& aGridOpt = pOptions->GetGridOptions();
    2727         236 :             pSettings[SC_SNAPTORASTER].Name = SC_UNO_SNAPTORASTER;
    2728         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SNAPTORASTER].Value, aGridOpt.GetUseGridSnap() );
    2729         236 :             pSettings[SC_RASTERVIS].Name = SC_UNO_RASTERVIS;
    2730         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_RASTERVIS].Value, aGridOpt.GetGridVisible() );
    2731         236 :             pSettings[SC_RASTERRESX].Name = SC_UNO_RASTERRESX;
    2732         236 :             pSettings[SC_RASTERRESX].Value <<= static_cast<sal_Int32> ( aGridOpt.GetFieldDrawX() );
    2733         236 :             pSettings[SC_RASTERRESY].Name = SC_UNO_RASTERRESY;
    2734         236 :             pSettings[SC_RASTERRESY].Value <<= static_cast<sal_Int32> ( aGridOpt.GetFieldDrawY() );
    2735         236 :             pSettings[SC_RASTERSUBX].Name = SC_UNO_RASTERSUBX;
    2736         236 :             pSettings[SC_RASTERSUBX].Value <<= static_cast<sal_Int32> ( aGridOpt.GetFieldDivisionX() );
    2737         236 :             pSettings[SC_RASTERSUBY].Name = SC_UNO_RASTERSUBY;
    2738         236 :             pSettings[SC_RASTERSUBY].Value <<= static_cast<sal_Int32> ( aGridOpt.GetFieldDivisionY() );
    2739         236 :             pSettings[SC_RASTERSYNC].Name = SC_UNO_RASTERSYNC;
    2740         236 :             ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_RASTERSYNC].Value, aGridOpt.GetSynchronize() );
    2741         236 :         }
    2742             :     }
    2743         236 : }
    2744             : 
    2745         347 : void ScViewData::ReadUserDataSequence(const uno::Sequence <beans::PropertyValue>& rSettings)
    2746             : {
    2747         347 :     std::vector<bool> aHasZoomVect( GetDocument()->GetTableCount(), false );
    2748             : 
    2749         347 :     sal_Int32 nCount(rSettings.getLength());
    2750         347 :     sal_Int32 nTemp32(0);
    2751         347 :     sal_Int16 nTemp16(0);
    2752         347 :     bool bPageMode(false);
    2753             : 
    2754         347 :     EnsureTabDataSize(GetDocument()->GetTableCount()-1);
    2755             : 
    2756        8077 :     for (sal_Int32 i = 0; i < nCount; i++)
    2757             :     {
    2758             :         // SC_VIEWID has to parse and use by mba
    2759        7730 :         OUString sName(rSettings[i].Name);
    2760        7730 :         if (sName == SC_TABLES)
    2761             :         {
    2762         347 :             uno::Reference<container::XNameContainer> xNameContainer;
    2763         347 :             if ((rSettings[i].Value >>= xNameContainer) && xNameContainer->hasElements())
    2764             :             {
    2765         347 :                 uno::Sequence< OUString > aNames(xNameContainer->getElementNames());
    2766         818 :                 for (sal_Int32 nTabPos = 0; nTabPos < aNames.getLength(); nTabPos++)
    2767             :                 {
    2768         471 :                     OUString sTabName(aNames[nTabPos]);
    2769         471 :                     SCTAB nTab(0);
    2770         471 :                     if (GetDocument()->GetTable(sTabName, nTab))
    2771             :                     {
    2772         471 :                         uno::Any aAny = xNameContainer->getByName(aNames[nTabPos]);
    2773         942 :                         uno::Sequence<beans::PropertyValue> aTabSettings;
    2774         471 :                         if (aAny >>= aTabSettings)
    2775             :                         {
    2776         471 :                             EnsureTabDataSize(nTab + 1);
    2777         471 :                             if (!maTabData[nTab])
    2778          68 :                                 maTabData[nTab] = new ScViewDataTable;
    2779             : 
    2780         471 :                             bool bHasZoom = false;
    2781         471 :                             maTabData[nTab]->ReadUserDataSequence(aTabSettings, *this, nTab, bHasZoom);
    2782         471 :                             aHasZoomVect[nTab] = bHasZoom;
    2783         471 :                         }
    2784             :                     }
    2785         818 :                 }
    2786         347 :             }
    2787             :         }
    2788        7383 :         else if (sName == SC_ACTIVETABLE)
    2789             :         {
    2790         347 :             OUString sValue;
    2791         347 :             if(rSettings[i].Value >>= sValue)
    2792             :             {
    2793         347 :                 OUString sTabName(sValue);
    2794         347 :                 SCTAB nTab(0);
    2795         347 :                 if (GetDocument()->GetTable(sTabName, nTab))
    2796         347 :                     nTabNo = nTab;
    2797         347 :             }
    2798             :         }
    2799        7036 :         else if (sName == SC_HORIZONTALSCROLLBARWIDTH)
    2800             :         {
    2801         279 :             if (rSettings[i].Value >>= nTemp32)
    2802         279 :                 pView->SetTabBarWidth(nTemp32);
    2803             :         }
    2804        6757 :         else if (sName == SC_RELHORIZONTALTABBARWIDTH)
    2805             :         {
    2806          68 :             double fWidth = 0.0;
    2807          68 :             if (rSettings[i].Value >>= fWidth)
    2808          68 :                 pView->SetPendingRelTabBarWidth( fWidth );
    2809             :         }
    2810        6689 :         else if (sName == SC_ZOOMTYPE)
    2811             :         {
    2812         279 :             if (rSettings[i].Value >>= nTemp16)
    2813         279 :                 eDefZoomType = SvxZoomType(nTemp16);
    2814             :         }
    2815        6410 :         else if (sName == SC_ZOOMVALUE)
    2816             :         {
    2817         279 :             if (rSettings[i].Value >>= nTemp32)
    2818             :             {
    2819         279 :                 Fraction aZoom(nTemp32, 100);
    2820         279 :                 aDefZoomX = aDefZoomY = aZoom;
    2821             :             }
    2822             :         }
    2823        6131 :         else if (sName == SC_PAGEVIEWZOOMVALUE)
    2824             :         {
    2825         279 :             if (rSettings[i].Value >>= nTemp32)
    2826             :             {
    2827         279 :                 Fraction aZoom(nTemp32, 100);
    2828         279 :                 aDefPageZoomX = aDefPageZoomY = aZoom;
    2829             :             }
    2830             :         }
    2831        5852 :         else if (sName == SC_SHOWPAGEBREAKPREVIEW)
    2832         347 :             bPageMode = ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value );
    2833        5505 :         else if ( sName == SC_UNO_SHOWZERO )
    2834         347 :             pOptions->SetOption(VOPT_NULLVALS, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2835        5158 :         else if ( sName == SC_UNO_SHOWNOTES )
    2836         279 :             pOptions->SetOption(VOPT_NOTES, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2837        4879 :         else if ( sName == SC_UNO_SHOWGRID )
    2838         347 :             pOptions->SetOption(VOPT_GRID, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2839        4532 :         else if ( sName == SC_UNO_GRIDCOLOR )
    2840             :         {
    2841         347 :             sal_Int64 nColor = 0;
    2842         347 :             if (rSettings[i].Value >>= nColor)
    2843             :             {
    2844         347 :                 OUString aColorName;
    2845         347 :                 Color aColor(static_cast<sal_uInt32>(nColor));
    2846             :                 // #i47435# set automatic grid color explicitly
    2847         347 :                 if( aColor.GetColor() == COL_AUTO )
    2848          68 :                     aColor.SetColor( SC_STD_GRIDCOLOR );
    2849         347 :                 pOptions->SetGridColor(aColor, aColorName);
    2850             :             }
    2851             :         }
    2852        4185 :         else if ( sName == SC_UNO_SHOWPAGEBR )
    2853         279 :             pOptions->SetOption(VOPT_PAGEBREAKS, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2854        3906 :         else if ( sName == SC_UNO_COLROWHDR )
    2855         347 :             pOptions->SetOption(VOPT_HEADER, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2856        3559 :         else if ( sName == SC_UNO_SHEETTABS )
    2857         347 :             pOptions->SetOption(VOPT_TABCONTROLS, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2858        3212 :         else if ( sName == SC_UNO_OUTLSYMB )
    2859         347 :             pOptions->SetOption(VOPT_OUTLINER, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2860        2865 :         else if ( sName == SC_UNO_SHOWOBJ )
    2861             :         {
    2862             :             // #i80528# placeholders not supported anymore
    2863          68 :             if ( rSettings[i].Value >>= nTemp16 )
    2864          68 :                 pOptions->SetObjMode( VOBJ_TYPE_OLE, (nTemp16 == 1) ? VOBJ_MODE_HIDE : VOBJ_MODE_SHOW );
    2865             :         }
    2866        2797 :         else if ( sName == SC_UNO_SHOWCHARTS )
    2867             :         {
    2868             :             // #i80528# placeholders not supported anymore
    2869          68 :             if ( rSettings[i].Value >>= nTemp16 )
    2870          68 :                 pOptions->SetObjMode( VOBJ_TYPE_CHART, (nTemp16 == 1) ? VOBJ_MODE_HIDE : VOBJ_MODE_SHOW );
    2871             :         }
    2872        2729 :         else if ( sName == SC_UNO_SHOWDRAW )
    2873             :         {
    2874             :             // #i80528# placeholders not supported anymore
    2875          68 :             if ( rSettings[i].Value >>= nTemp16 )
    2876          68 :                 pOptions->SetObjMode( VOBJ_TYPE_DRAW, (nTemp16 == 1) ? VOBJ_MODE_HIDE : VOBJ_MODE_SHOW );
    2877             :         }
    2878        2661 :         else if ( sName.compareToAscii( SC_UNO_VALUEHIGH ) == 0 )
    2879         225 :             pOptions->SetOption( VOPT_SYNTAX, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2880             :         else
    2881             :         {
    2882        2436 :             ScGridOptions aGridOpt(pOptions->GetGridOptions());
    2883        2436 :             if ( sName == SC_UNO_SNAPTORASTER )
    2884         279 :                 aGridOpt.SetUseGridSnap( ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2885        2157 :             else if ( sName == SC_UNO_RASTERVIS )
    2886         279 :                 aGridOpt.SetGridVisible( ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2887        1878 :             else if ( sName == SC_UNO_RASTERRESX )
    2888         279 :                 aGridOpt.SetFieldDrawX( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( rSettings[i].Value ) ) );
    2889        1599 :             else if ( sName == SC_UNO_RASTERRESY )
    2890         279 :                 aGridOpt.SetFieldDrawY( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( rSettings[i].Value ) ) );
    2891        1320 :             else if ( sName == SC_UNO_RASTERSUBX )
    2892         279 :                 aGridOpt.SetFieldDivisionX( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( rSettings[i].Value ) ) );
    2893        1041 :             else if ( sName == SC_UNO_RASTERSUBY )
    2894         279 :                 aGridOpt.SetFieldDivisionY( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( rSettings[i].Value ) ) );
    2895         762 :             else if ( sName == SC_UNO_RASTERSYNC )
    2896         279 :                 aGridOpt.SetSynchronize( ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
    2897        2436 :             pOptions->SetGridOptions(aGridOpt);
    2898             :         }
    2899        7730 :     }
    2900             : 
    2901             :     // copy default zoom to sheets where a different one wasn't specified
    2902        1181 :     for (SCTAB nZoomTab=0; nZoomTab< static_cast<SCTAB>(maTabData.size()); ++nZoomTab)
    2903         834 :         if (maTabData[nZoomTab] && ( nZoomTab >= static_cast<SCTAB>(aHasZoomVect.size()) || !aHasZoomVect[nZoomTab] ))
    2904             :         {
    2905           0 :             maTabData[nZoomTab]->eZoomType  = eDefZoomType;
    2906           0 :             maTabData[nZoomTab]->aZoomX     = aDefZoomX;
    2907           0 :             maTabData[nZoomTab]->aZoomY     = aDefZoomY;
    2908           0 :             maTabData[nZoomTab]->aPageZoomX = aDefPageZoomX;
    2909           0 :             maTabData[nZoomTab]->aPageZoomY = aDefPageZoomY;
    2910             :         }
    2911             : 
    2912         347 :     if (nCount)
    2913         347 :         SetPagebreakMode( bPageMode );
    2914             : 
    2915             :     // #i47426# write view options to document, needed e.g. for Excel export
    2916         347 :     pDoc->SetViewOptions( *pOptions );
    2917         347 : }
    2918             : 
    2919          16 : void ScViewData::SetOptions( const ScViewOptions& rOpt )
    2920             : {
    2921             :     //  if visibility of horizontal ScrollBar is changed, TabBar may have to be resized...
    2922          16 :     bool bHScrollChanged = ( rOpt.GetOption(VOPT_HSCROLL) != pOptions->GetOption(VOPT_HSCROLL) );
    2923             : 
    2924             :     //  if graphics are turned on or off, animation has to be started or stopped
    2925             :     //  graphics are controlled by VOBJ_TYPE_OLE
    2926          16 :     bool bGraphicsChanged = ( pOptions->GetObjMode(VOBJ_TYPE_OLE) !=
    2927          16 :                                    rOpt.GetObjMode(VOBJ_TYPE_OLE) );
    2928             : 
    2929          16 :     *pOptions = rOpt;
    2930             :     OSL_ENSURE( pView, "No View" );
    2931             : 
    2932          16 :     if( pView )
    2933             :     {
    2934          16 :         pView->ViewOptionsHasChanged( bHScrollChanged, bGraphicsChanged );
    2935             :     }
    2936          16 : }
    2937             : 
    2938           0 : Point ScViewData::GetMousePosPixel()
    2939             : {
    2940             :     OSL_ENSURE( pView, "GetMousePosPixel() ohne View" );
    2941           0 :     return pView->GetMousePosPixel();
    2942             : }
    2943             : 
    2944           0 : void ScViewData::UpdateInputHandler( bool bForce, bool bStopEditing )
    2945             : {
    2946           0 :     if (pViewShell)
    2947           0 :         pViewShell->UpdateInputHandler( bForce, bStopEditing );
    2948           0 : }
    2949             : 
    2950           0 : bool ScViewData::IsOle()
    2951             : {
    2952           0 :     return pDocShell && pDocShell->IsOle();
    2953             : }
    2954             : 
    2955           0 : bool ScViewData::UpdateFixX( SCTAB nTab )                   // true = value changed
    2956             : {
    2957           0 :     if (!ValidTab(nTab))        // Default
    2958           0 :         nTab=nTabNo;            // current table
    2959             : 
    2960           0 :     if (!pView || maTabData[nTab]->eHSplitMode != SC_SPLIT_FIX)
    2961           0 :         return false;
    2962             : 
    2963           0 :     ScDocument* pLocalDoc = GetDocument();
    2964           0 :     if (!pLocalDoc->HasTable(nTab))          // if called from reload, the sheet may not exist
    2965           0 :         return false;
    2966             : 
    2967           0 :     SCCOL nFix = maTabData[nTab]->nFixPosX;
    2968           0 :     long nNewPos = 0;
    2969           0 :     for (SCCOL nX=maTabData[nTab]->nPosX[SC_SPLIT_LEFT]; nX<nFix; nX++)
    2970             :     {
    2971           0 :         sal_uInt16 nTSize = pLocalDoc->GetColWidth( nX, nTab );
    2972           0 :         if (nTSize)
    2973             :         {
    2974           0 :             long nPix = ToPixel( nTSize, nPPTX );
    2975           0 :             nNewPos += nPix;
    2976             :         }
    2977             :     }
    2978           0 :     nNewPos += pView->GetGridOffset().X();
    2979           0 :     if (nNewPos != maTabData[nTab]->nHSplitPos)
    2980             :     {
    2981           0 :         maTabData[nTab]->nHSplitPos = nNewPos;
    2982           0 :         if (nTab == nTabNo)
    2983           0 :             RecalcPixPos();                 // should not be needed
    2984           0 :         return true;
    2985             :     }
    2986             : 
    2987           0 :     return false;
    2988             : }
    2989             : 
    2990           0 : bool ScViewData::UpdateFixY( SCTAB nTab )               // true = value changed
    2991             : {
    2992           0 :     if (!ValidTab(nTab))        // Default
    2993           0 :         nTab=nTabNo;        // current table
    2994             : 
    2995           0 :     if (!pView || maTabData[nTab]->eVSplitMode != SC_SPLIT_FIX)
    2996           0 :         return false;
    2997             : 
    2998           0 :     ScDocument* pLocalDoc = GetDocument();
    2999           0 :     if (!pLocalDoc->HasTable(nTab))          // if called from reload, the sheet may not exist
    3000           0 :         return false;
    3001             : 
    3002           0 :     SCROW nFix = maTabData[nTab]->nFixPosY;
    3003           0 :     long nNewPos = 0;
    3004           0 :     for (SCROW nY=maTabData[nTab]->nPosY[SC_SPLIT_TOP]; nY<nFix; nY++)
    3005             :     {
    3006           0 :         sal_uInt16 nTSize = pLocalDoc->GetRowHeight( nY, nTab );
    3007           0 :         if (nTSize)
    3008             :         {
    3009           0 :             long nPix = ToPixel( nTSize, nPPTY );
    3010           0 :             nNewPos += nPix;
    3011             :         }
    3012             :     }
    3013           0 :     nNewPos += pView->GetGridOffset().Y();
    3014           0 :     if (nNewPos != maTabData[nTab]->nVSplitPos)
    3015             :     {
    3016           0 :         maTabData[nTab]->nVSplitPos = nNewPos;
    3017           0 :         if (nTab == nTabNo)
    3018           0 :             RecalcPixPos();                 // should not be needed
    3019           0 :         return true;
    3020             :     }
    3021             : 
    3022           0 :     return false;
    3023             : }
    3024             : 
    3025           0 : void ScViewData::UpdateOutlinerFlags( Outliner& rOutl ) const
    3026             : {
    3027           0 :     ScDocument* pLocalDoc = GetDocument();
    3028           0 :     bool bOnlineSpell = pLocalDoc->GetDocOptions().IsAutoSpell();
    3029             : 
    3030           0 :     EEControlBits nCntrl = rOutl.GetControlWord();
    3031           0 :     nCntrl |= EEControlBits::MARKFIELDS;
    3032           0 :     nCntrl |= EEControlBits::AUTOCORRECT;
    3033           0 :     if( bOnlineSpell )
    3034           0 :         nCntrl |= EEControlBits::ONLINESPELLING;
    3035             :     else
    3036           0 :         nCntrl &= ~EEControlBits::ONLINESPELLING;
    3037           0 :     rOutl.SetControlWord(nCntrl);
    3038             : 
    3039           0 :     rOutl.SetCalcFieldValueHdl( LINK( SC_MOD(), ScModule, CalcFieldValueHdl ) );
    3040             : 
    3041             :     //  don't call GetSpellChecker if online spelling isn't enabled.
    3042             :     //  The language for AutoCorrect etc. is taken from the pool defaults
    3043             :     //  (set in ScDocument::UpdateDrawLanguages)
    3044             : 
    3045           0 :     if ( bOnlineSpell )
    3046             :     {
    3047           0 :         com::sun::star::uno::Reference<com::sun::star::linguistic2::XSpellChecker1> xXSpellChecker1( LinguMgr::GetSpellChecker() );
    3048           0 :         rOutl.SetSpeller( xXSpellChecker1 );
    3049             :     }
    3050             : 
    3051             :     rOutl.SetDefaultHorizontalTextDirection(
    3052           0 :         (EEHorizontalTextDirection)pLocalDoc->GetEditTextDirection( nTabNo ) );
    3053           0 : }
    3054             : 
    3055        3038 : ScAddress ScViewData::GetCurPos() const
    3056             : {
    3057        3038 :     return ScAddress( GetCurX(), GetCurY(), GetTabNo() );
    3058             : }
    3059             : 
    3060          86 : void ScViewData::SetRefStart( SCCOL nNewX, SCROW nNewY, SCTAB nNewZ )
    3061             : {
    3062          86 :     nRefStartX = nNewX; nRefStartY = nNewY; nRefStartZ = nNewZ;
    3063          86 : }
    3064             : 
    3065           0 : void ScViewData::SetRefEnd( SCCOL nNewX, SCROW nNewY, SCTAB nNewZ )
    3066             : {
    3067           0 :     nRefEndX = nNewX; nRefEndY = nNewY; nRefEndZ = nNewZ;
    3068           0 : }
    3069             : 
    3070       41919 : void ScViewData::AddPixelsWhile( long & rScrY, long nEndPixels, SCROW & rPosY,
    3071             :         SCROW nEndRow, double nPPTY, const ScDocument * pDoc, SCTAB nTabNo )
    3072             : {
    3073       41919 :     SCROW nRow = rPosY;
    3074      146415 :     while (rScrY <= nEndPixels && nRow <= nEndRow)
    3075             :     {
    3076             :         SCROW nHeightEndRow;
    3077       62577 :         sal_uInt16 nHeight = pDoc->GetRowHeight( nRow, nTabNo, NULL, &nHeightEndRow);
    3078       62577 :         if (nHeightEndRow > nEndRow)
    3079           0 :             nHeightEndRow = nEndRow;
    3080       62577 :         if (!nHeight)
    3081         635 :             nRow = nHeightEndRow + 1;
    3082             :         else
    3083             :         {
    3084       61942 :             SCROW nRows = nHeightEndRow - nRow + 1;
    3085       61942 :             sal_Int64 nPixel = ToPixel( nHeight, nPPTY);
    3086       61942 :             sal_Int64 nAdd = nPixel * nRows;
    3087       61942 :             if (nAdd + rScrY > nEndPixels)
    3088             :             {
    3089       41847 :                 sal_Int64 nDiff = rScrY + nAdd - nEndPixels;
    3090       41847 :                 nRows -= static_cast<SCROW>(nDiff / nPixel);
    3091       41847 :                 nAdd = nPixel * nRows;
    3092             :                 // We're looking for a value that satisfies loop condition.
    3093       41847 :                 if (nAdd + rScrY <= nEndPixels)
    3094             :                 {
    3095        3591 :                     ++nRows;
    3096        3591 :                     nAdd += nPixel;
    3097             :                 }
    3098             :             }
    3099       61942 :             rScrY += static_cast<long>(nAdd);
    3100       61942 :             nRow += nRows;
    3101             :         }
    3102             :     }
    3103       41919 :     if (nRow > rPosY)
    3104       41919 :         --nRow;
    3105       41919 :     rPosY = nRow;
    3106       41919 : }
    3107             : 
    3108          44 : void ScViewData::AddPixelsWhileBackward( long & rScrY, long nEndPixels,
    3109             :         SCROW & rPosY, SCROW nStartRow, double nPPTY, const ScDocument * pDoc,
    3110             :         SCTAB nTabNo )
    3111             : {
    3112          44 :     SCROW nRow = rPosY;
    3113         163 :     while (rScrY <= nEndPixels && nRow >= nStartRow)
    3114             :     {
    3115             :         SCROW nHeightStartRow;
    3116          75 :         sal_uInt16 nHeight = pDoc->GetRowHeight( nRow, nTabNo, &nHeightStartRow, NULL);
    3117          75 :         if (nHeightStartRow < nStartRow)
    3118           0 :             nHeightStartRow = nStartRow;
    3119          75 :         if (!nHeight)
    3120           0 :             nRow = nHeightStartRow - 1;
    3121             :         else
    3122             :         {
    3123          75 :             SCROW nRows = nRow - nHeightStartRow + 1;
    3124          75 :             sal_Int64 nPixel = ToPixel( nHeight, nPPTY);
    3125          75 :             sal_Int64 nAdd = nPixel * nRows;
    3126          75 :             if (nAdd + rScrY > nEndPixels)
    3127             :             {
    3128          23 :                 sal_Int64 nDiff = nAdd + rScrY - nEndPixels;
    3129          23 :                 nRows -= static_cast<SCROW>(nDiff / nPixel);
    3130          23 :                 nAdd = nPixel * nRows;
    3131             :                 // We're looking for a value that satisfies loop condition.
    3132          23 :                 if (nAdd + rScrY <= nEndPixels)
    3133             :                 {
    3134           0 :                     ++nRows;
    3135           0 :                     nAdd += nPixel;
    3136             :                 }
    3137             :             }
    3138          75 :             rScrY += static_cast<long>(nAdd);
    3139          75 :             nRow -= nRows;
    3140             :         }
    3141             :     }
    3142          44 :     if (nRow < rPosY)
    3143          38 :         ++nRow;
    3144          44 :     rPosY = nRow;
    3145         200 : }
    3146             : 
    3147             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11