LCOV - code coverage report
Current view: top level - sc/source/filter/oox - viewsettings.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 252 328 76.8 %
Date: 2015-06-13 12:38:46 Functions: 29 35 82.9 %
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 "viewsettings.hxx"
      21             : 
      22             : #include <com/sun/star/awt/Point.hpp>
      23             : #include <com/sun/star/awt/Size.hpp>
      24             : #include <com/sun/star/beans/PropertyValue.hpp>
      25             : #include <com/sun/star/container/XIndexContainer.hpp>
      26             : #include <com/sun/star/container/XNameContainer.hpp>
      27             : #include <com/sun/star/document/IndexedPropertyValues.hpp>
      28             : #include <com/sun/star/document/XViewDataSupplier.hpp>
      29             : #include <com/sun/star/document/NamedPropertyValues.hpp>
      30             : #include <osl/diagnose.h>
      31             : #include <unotools/mediadescriptor.hxx>
      32             : #include <oox/core/filterbase.hxx>
      33             : #include <oox/helper/attributelist.hxx>
      34             : #include <oox/helper/containerhelper.hxx>
      35             : #include <oox/helper/propertymap.hxx>
      36             : #include <oox/helper/propertyset.hxx>
      37             : #include "addressconverter.hxx"
      38             : #include "biffinputstream.hxx"
      39             : #include "unitconverter.hxx"
      40             : #include "workbooksettings.hxx"
      41             : #include "worksheetbuffer.hxx"
      42             : 
      43             : namespace oox {
      44             : namespace xls {
      45             : 
      46             : using namespace ::com::sun::star::awt;
      47             : using namespace ::com::sun::star::container;
      48             : using namespace ::com::sun::star::document;
      49             : using namespace ::com::sun::star::table;
      50             : using namespace ::com::sun::star::uno;
      51             : 
      52             : using ::oox::core::FilterBase;
      53             : 
      54             : namespace {
      55             : 
      56             : const sal_Int32 OOX_BOOKVIEW_TABBARRATIO_DEF        = 600;      /// Default tabbar ratio.
      57             : const sal_Int32 OOX_SHEETVIEW_NORMALZOOM_DEF        = 100;      /// Default zoom for normal view.
      58             : const sal_Int32 OOX_SHEETVIEW_SHEETLAYZOOM_DEF      = 60;       /// Default zoom for pagebreak preview.
      59             : 
      60             : const sal_uInt8 BIFF12_PANE_FROZEN                  = 0x01;
      61             : const sal_uInt8 BIFF12_PANE_FROZENNOSPLIT           = 0x02;
      62             : 
      63             : const sal_uInt16 BIFF12_SHEETVIEW_SHOWFORMULAS      = 0x0002;
      64             : const sal_uInt16 BIFF12_SHEETVIEW_SHOWGRID          = 0x0004;
      65             : const sal_uInt16 BIFF12_SHEETVIEW_SHOWHEADINGS      = 0x0008;
      66             : const sal_uInt16 BIFF12_SHEETVIEW_SHOWZEROS         = 0x0010;
      67             : const sal_uInt16 BIFF12_SHEETVIEW_RIGHTTOLEFT       = 0x0020;
      68             : const sal_uInt16 BIFF12_SHEETVIEW_SELECTED          = 0x0040;
      69             : const sal_uInt16 BIFF12_SHEETVIEW_SHOWOUTLINE       = 0x0100;
      70             : const sal_uInt16 BIFF12_SHEETVIEW_DEFGRIDCOLOR      = 0x0200;
      71             : 
      72             : const sal_uInt16 BIFF12_CHARTSHEETVIEW_SELECTED     = 0x0001;
      73             : const sal_uInt16 BIFF12_CHARTSHEETVIEW_ZOOMTOFIT    = 0x0002;
      74             : 
      75             : const sal_uInt8 BIFF12_WBVIEW_HIDDEN                = 0x01;
      76             : const sal_uInt8 BIFF12_WBVIEW_MINIMIZED             = 0x02;
      77             : const sal_uInt8 BIFF12_WBVIEW_SHOWHORSCROLL         = 0x08;
      78             : const sal_uInt8 BIFF12_WBVIEW_SHOWVERSCROLL         = 0x10;
      79             : const sal_uInt8 BIFF12_WBVIEW_SHOWTABBAR            = 0x20;
      80             : 
      81             : // Attention: view settings in Calc do not use com.sun.star.view.DocumentZoomType!
      82             : const sal_Int16 API_ZOOMTYPE_PERCENT                = 0;        /// Zoom value in percent.
      83             : 
      84             : const sal_Int32 API_ZOOMVALUE_MIN                   = 20;       /// Minimum zoom in Calc.
      85             : const sal_Int32 API_ZOOMVALUE_MAX                   = 400;      /// Maximum zoom in Calc.
      86             : 
      87             : // no predefined constants for split mode
      88             : const sal_Int16 API_SPLITMODE_NONE                  = 0;        /// No splits in window.
      89             : const sal_Int16 API_SPLITMODE_SPLIT                 = 1;        /// Window is split.
      90             : const sal_Int16 API_SPLITMODE_FREEZE                = 2;        /// Window has frozen panes.
      91             : 
      92             : // no predefined constants for pane idetifiers
      93             : const sal_Int16 API_SPLITPANE_TOPLEFT               = 0;        /// Top-left, or top pane.
      94             : const sal_Int16 API_SPLITPANE_TOPRIGHT              = 1;        /// Top-right pane.
      95             : const sal_Int16 API_SPLITPANE_BOTTOMLEFT            = 2;        /// Bottom-left, bottom, left, or single pane.
      96             : const sal_Int16 API_SPLITPANE_BOTTOMRIGHT           = 3;        /// Bottom-right, or right pane.
      97             : 
      98             : /** Returns the OOXML pane identifier from the passed BIFF pane id. */
      99           3 : sal_Int32 lclGetOoxPaneId( sal_Int32 nBiffPaneId, sal_Int32 nDefaultPaneId )
     100             : {
     101             :     static const sal_Int32 spnPaneIds[] = { XML_bottomRight, XML_topRight, XML_bottomLeft, XML_topLeft };
     102           3 :     return STATIC_ARRAY_SELECT( spnPaneIds, nBiffPaneId, nDefaultPaneId );
     103             : }
     104             : 
     105             : } // namespace
     106             : 
     107         195 : PaneSelectionModel::PaneSelectionModel() :
     108         195 :     mnActiveCellId( 0 )
     109             : {
     110         195 : }
     111             : 
     112         269 : SheetViewModel::SheetViewModel() :
     113             :     mnWorkbookViewId( 0 ),
     114             :     mnViewType( XML_normal ),
     115             :     mnActivePaneId( XML_topLeft ),
     116             :     mnPaneState( XML_split ),
     117             :     mfSplitX( 0.0 ),
     118             :     mfSplitY( 0.0 ),
     119             :     mnCurrentZoom( 0 ),
     120             :     mnNormalZoom( 0 ),
     121             :     mnSheetLayoutZoom( 0 ),
     122             :     mnPageLayoutZoom( 0 ),
     123             :     mbSelected( false ),
     124             :     mbRightToLeft( false ),
     125             :     mbDefGridColor( true ),
     126             :     mbShowFormulas( false ),
     127             :     mbShowGrid( true ),
     128             :     mbShowHeadings( true ),
     129             :     mbShowZeros( true ),
     130             :     mbShowOutline( true ),
     131         269 :     mbZoomToFit( false )
     132             : {
     133         269 :     maGridColor.setIndexed( OOX_COLOR_WINDOWTEXT );
     134         269 : }
     135             : 
     136         952 : bool SheetViewModel::isPageBreakPreview() const
     137             : {
     138         952 :     return mnViewType == XML_pageBreakPreview;
     139             : }
     140             : 
     141         269 : sal_Int32 SheetViewModel::getNormalZoom() const
     142             : {
     143         269 :     const sal_Int32& rnZoom = isPageBreakPreview() ? mnNormalZoom : mnCurrentZoom;
     144         269 :     sal_Int32 nZoom = (rnZoom > 0) ? rnZoom : OOX_SHEETVIEW_NORMALZOOM_DEF;
     145         269 :     return getLimitedValue< sal_Int32 >( nZoom, API_ZOOMVALUE_MIN, API_ZOOMVALUE_MAX );
     146             : }
     147             : 
     148         269 : sal_Int32 SheetViewModel::getPageBreakZoom() const
     149             : {
     150         269 :     const sal_Int32& rnZoom = isPageBreakPreview() ? mnCurrentZoom : mnSheetLayoutZoom;
     151         269 :     sal_Int32 nZoom = (rnZoom > 0) ? rnZoom : OOX_SHEETVIEW_SHEETLAYZOOM_DEF;
     152         269 :     return getLimitedValue< sal_Int32 >( nZoom, API_ZOOMVALUE_MIN, API_ZOOMVALUE_MAX );
     153             : }
     154             : 
     155         414 : sal_Int32 SheetViewModel::getGridColor( const FilterBase& rFilter ) const
     156             : {
     157         414 :     return mbDefGridColor ? API_RGB_TRANSPARENT : maGridColor.getColor( rFilter.getGraphicHelper() );
     158             : }
     159             : 
     160         269 : const PaneSelectionModel* SheetViewModel::getPaneSelection( sal_Int32 nPaneId ) const
     161             : {
     162         269 :     return maPaneSelMap.get( nPaneId ).get();
     163             : }
     164             : 
     165         269 : const PaneSelectionModel* SheetViewModel::getActiveSelection() const
     166             : {
     167         269 :     return getPaneSelection( mnActivePaneId );
     168             : }
     169             : 
     170         195 : PaneSelectionModel& SheetViewModel::createPaneSelection( sal_Int32 nPaneId )
     171             : {
     172         195 :     PaneSelectionModelMap::mapped_type& rxPaneSel = maPaneSelMap[ nPaneId ];
     173         195 :     if( !rxPaneSel )
     174         195 :         rxPaneSel.reset( new PaneSelectionModel );
     175         195 :     return *rxPaneSel;
     176             : }
     177             : 
     178         269 : SheetViewSettings::SheetViewSettings( const WorksheetHelper& rHelper ) :
     179         269 :     WorksheetHelper( rHelper )
     180             : {
     181         269 : }
     182             : 
     183         266 : void SheetViewSettings::importSheetView( const AttributeList& rAttribs )
     184             : {
     185         266 :     SheetViewModel& rModel = *createSheetView();
     186         266 :     rModel.maGridColor.setIndexed( rAttribs.getInteger( XML_colorId, OOX_COLOR_WINDOWTEXT ) );
     187         266 :     rModel.maFirstPos        = getAddressConverter().createValidCellAddress( rAttribs.getString( XML_topLeftCell, OUString() ), getSheetIndex(), false );
     188         266 :     rModel.mnWorkbookViewId  = rAttribs.getToken( XML_workbookViewId, 0 );
     189         266 :     rModel.mnViewType        = rAttribs.getToken( XML_view, XML_normal );
     190         266 :     rModel.mnCurrentZoom     = rAttribs.getInteger( XML_zoomScale, 100 );
     191         266 :     rModel.mnNormalZoom      = rAttribs.getInteger( XML_zoomScaleNormal, 0 );
     192         266 :     rModel.mnSheetLayoutZoom = rAttribs.getInteger( XML_zoomScaleSheetLayoutView, 0 );
     193         266 :     rModel.mnPageLayoutZoom  = rAttribs.getInteger( XML_zoomScalePageLayoutView, 0 );
     194         266 :     rModel.mbSelected        = rAttribs.getBool( XML_tabSelected, false );
     195         266 :     rModel.mbRightToLeft     = rAttribs.getBool( XML_rightToLeft, false );
     196         266 :     rModel.mbDefGridColor    = rAttribs.getBool( XML_defaultGridColor, true );
     197         266 :     rModel.mbShowFormulas    = rAttribs.getBool( XML_showFormulas, false );
     198         266 :     rModel.mbShowGrid        = rAttribs.getBool( XML_showGridLines, true );
     199         266 :     rModel.mbShowHeadings    = rAttribs.getBool( XML_showRowColHeaders, true );
     200         266 :     rModel.mbShowZeros       = rAttribs.getBool( XML_showZeros, true );
     201         266 :     rModel.mbShowOutline     = rAttribs.getBool( XML_showOutlineSymbols, true );
     202         266 : }
     203             : 
     204           0 : void SheetViewSettings::importPane( const AttributeList& rAttribs )
     205             : {
     206             :     OSL_ENSURE( !maSheetViews.empty(), "SheetViewSettings::importPane - missing sheet view model" );
     207           0 :     if( !maSheetViews.empty() )
     208             :     {
     209           0 :         SheetViewModel& rModel = *maSheetViews.back();
     210           0 :         rModel.maSecondPos    = getAddressConverter().createValidCellAddress( rAttribs.getString( XML_topLeftCell, OUString() ), getSheetIndex(), false );
     211           0 :         rModel.mnActivePaneId = rAttribs.getToken( XML_activePane, XML_topLeft );
     212           0 :         rModel.mnPaneState    = rAttribs.getToken( XML_state, XML_split );
     213           0 :         rModel.mfSplitX       = rAttribs.getDouble( XML_xSplit, 0.0 );
     214           0 :         rModel.mfSplitY       = rAttribs.getDouble( XML_ySplit, 0.0 );
     215             :     }
     216           0 : }
     217             : 
     218         192 : void SheetViewSettings::importSelection( const AttributeList& rAttribs )
     219             : {
     220             :     OSL_ENSURE( !maSheetViews.empty(), "SheetViewSettings::importSelection - missing sheet view model" );
     221         192 :     if( !maSheetViews.empty() )
     222             :     {
     223             :         // pane this selection belongs to
     224         192 :         sal_Int32 nPaneId = rAttribs.getToken( XML_pane, XML_topLeft );
     225         192 :         PaneSelectionModel& rSelData = maSheetViews.back()->createPaneSelection( nPaneId );
     226             :         // cursor position
     227         192 :         rSelData.maActiveCell = getAddressConverter().createValidCellAddress( rAttribs.getString( XML_activeCell, OUString() ), getSheetIndex(), false );
     228         192 :         rSelData.mnActiveCellId = rAttribs.getInteger( XML_activeCellId, 0 );
     229             :         // selection
     230         192 :         rSelData.maSelection.clear();
     231         192 :         getAddressConverter().convertToCellRangeList( rSelData.maSelection, rAttribs.getString( XML_sqref, OUString() ), getSheetIndex(), false );
     232             :     }
     233         192 : }
     234             : 
     235           0 : void SheetViewSettings::importChartSheetView( const AttributeList& rAttribs )
     236             : {
     237           0 :     SheetViewModel& rModel = *createSheetView();
     238           0 :     rModel.mnWorkbookViewId = rAttribs.getToken( XML_workbookViewId, 0 );
     239           0 :     rModel.mnCurrentZoom    = rAttribs.getInteger( XML_zoomScale, 100 );
     240           0 :     rModel.mbSelected       = rAttribs.getBool( XML_tabSelected, false );
     241           0 :     rModel.mbZoomToFit      = rAttribs.getBool( XML_zoomToFit, false );
     242           0 : }
     243             : 
     244           3 : void SheetViewSettings::importSheetView( SequenceInputStream& rStrm )
     245             : {
     246           3 :     SheetViewModel& rModel = *createSheetView();
     247             :     sal_uInt16 nFlags;
     248             :     sal_Int32 nViewType;
     249           3 :     BinAddress aFirstPos;
     250           3 :     nFlags = rStrm.readuInt16();
     251           3 :     nViewType = rStrm.readInt32();
     252           3 :     rStrm >> aFirstPos;
     253           3 :     rModel.maGridColor.importColorId( rStrm );
     254           3 :     rModel.mnCurrentZoom = rStrm.readuInt16();
     255           3 :     rModel.mnNormalZoom = rStrm.readuInt16();
     256           3 :     rModel.mnSheetLayoutZoom = rStrm.readuInt16();
     257           3 :     rModel.mnPageLayoutZoom = rStrm.readuInt16();
     258           3 :     rModel.mnWorkbookViewId = rStrm.readInt32();
     259             : 
     260           3 :     rModel.maFirstPos = getAddressConverter().createValidCellAddress( aFirstPos, getSheetIndex(), false );
     261             :     static const sal_Int32 spnViewTypes[] = { XML_normal, XML_pageBreakPreview, XML_pageLayout };
     262           3 :     rModel.mnViewType = STATIC_ARRAY_SELECT( spnViewTypes, nViewType, XML_normal );
     263           3 :     rModel.mbSelected     = getFlag( nFlags, BIFF12_SHEETVIEW_SELECTED );
     264           3 :     rModel.mbRightToLeft  = getFlag( nFlags, BIFF12_SHEETVIEW_RIGHTTOLEFT );
     265           3 :     rModel.mbDefGridColor = getFlag( nFlags, BIFF12_SHEETVIEW_DEFGRIDCOLOR );
     266           3 :     rModel.mbShowFormulas = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWFORMULAS );
     267           3 :     rModel.mbShowGrid     = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWGRID );
     268           3 :     rModel.mbShowHeadings = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWHEADINGS );
     269           3 :     rModel.mbShowZeros    = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWZEROS );
     270           3 :     rModel.mbShowOutline  = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWOUTLINE );
     271           3 : }
     272             : 
     273           0 : void SheetViewSettings::importPane( SequenceInputStream& rStrm )
     274             : {
     275             :     OSL_ENSURE( !maSheetViews.empty(), "SheetViewSettings::importPane - missing sheet view model" );
     276           0 :     if( !maSheetViews.empty() )
     277             :     {
     278           0 :         SheetViewModel& rModel = *maSheetViews.back();
     279             : 
     280           0 :         BinAddress aSecondPos;
     281             :         sal_Int32 nActivePaneId;
     282             :         sal_uInt8 nFlags;
     283           0 :         rModel.mfSplitX = rStrm.readDouble();
     284           0 :         rModel.mfSplitY = rStrm.readDouble();
     285           0 :         rStrm >> aSecondPos;
     286           0 :         nActivePaneId = rStrm.readInt32();
     287           0 :         nFlags = rStrm.readuChar();
     288             : 
     289           0 :         rModel.maSecondPos    = getAddressConverter().createValidCellAddress( aSecondPos, getSheetIndex(), false );
     290           0 :         rModel.mnActivePaneId = lclGetOoxPaneId( nActivePaneId, XML_topLeft );
     291           0 :         rModel.mnPaneState    = getFlagValue( nFlags, BIFF12_PANE_FROZEN, getFlagValue( nFlags, BIFF12_PANE_FROZENNOSPLIT, XML_frozen, XML_frozenSplit ), XML_split );
     292             :     }
     293           0 : }
     294             : 
     295           3 : void SheetViewSettings::importSelection( SequenceInputStream& rStrm )
     296             : {
     297             :     OSL_ENSURE( !maSheetViews.empty(), "SheetViewSettings::importSelection - missing sheet view model" );
     298           3 :     if( !maSheetViews.empty() )
     299             :     {
     300             :         // pane this selection belongs to
     301           3 :         sal_Int32 nPaneId = rStrm.readInt32();
     302           3 :         PaneSelectionModel& rPaneSel = maSheetViews.back()->createPaneSelection( lclGetOoxPaneId( nPaneId, -1 ) );
     303             :         // cursor position
     304           3 :         BinAddress aActiveCell;
     305           3 :         rStrm >> aActiveCell;
     306           3 :         rPaneSel.mnActiveCellId = rStrm.readInt32();
     307           3 :         rPaneSel.maActiveCell = getAddressConverter().createValidCellAddress( aActiveCell, getSheetIndex(), false );
     308             :         // selection
     309           3 :         BinRangeList aSelection;
     310           3 :         rStrm >> aSelection;
     311           3 :         rPaneSel.maSelection.clear();
     312           3 :         getAddressConverter().convertToCellRangeList( rPaneSel.maSelection, aSelection, getSheetIndex(), false );
     313             :     }
     314           3 : }
     315             : 
     316           0 : void SheetViewSettings::importChartSheetView( SequenceInputStream& rStrm )
     317             : {
     318           0 :     SheetViewModel& rModel = *createSheetView();
     319             :     sal_uInt16 nFlags;
     320           0 :     nFlags = rStrm.readuInt16();
     321           0 :     rModel.mnCurrentZoom = rStrm.readInt32();
     322           0 :     rModel.mnWorkbookViewId = rStrm.readInt32();
     323             : 
     324           0 :     rModel.mbSelected  = getFlag( nFlags, BIFF12_CHARTSHEETVIEW_SELECTED );
     325           0 :     rModel.mbZoomToFit = getFlag( nFlags, BIFF12_CHARTSHEETVIEW_ZOOMTOFIT );
     326           0 : }
     327             : 
     328         269 : void SheetViewSettings::finalizeImport()
     329             : {
     330             :     // force creation of sheet view model to get the Excel defaults
     331         269 :     SheetViewModelRef xModel = maSheetViews.empty() ? createSheetView() : maSheetViews.front();
     332             : 
     333             :     // #i59590# #158194# special handling for chart sheets (Excel ignores some settings in chart sheets)
     334         269 :     if( getSheetType() == SHEETTYPE_CHARTSHEET )
     335             :     {
     336           0 :         xModel->maPaneSelMap.clear();
     337           0 :         xModel->maFirstPos = xModel->maSecondPos = CellAddress( getSheetIndex(), 0, 0 );
     338           0 :         xModel->mnViewType = XML_normal;
     339           0 :         xModel->mnActivePaneId = XML_topLeft;
     340           0 :         xModel->mnPaneState = XML_split;
     341           0 :         xModel->mfSplitX = xModel->mfSplitY = 0.0;
     342           0 :         xModel->mbRightToLeft = false;
     343           0 :         xModel->mbDefGridColor = true;
     344           0 :         xModel->mbShowFormulas = false;
     345           0 :         xModel->mbShowGrid = true;
     346           0 :         xModel->mbShowHeadings = true;
     347           0 :         xModel->mbShowZeros = true;
     348           0 :         xModel->mbShowOutline = true;
     349             :     }
     350             : 
     351             :     // sheet selected (active sheet must be selected)
     352         269 :     bool bSelected = xModel->mbSelected || (getSheetIndex() == getViewSettings().getActiveCalcSheet());
     353         269 :     if ( bSelected )
     354             :     {
     355             :         // active tab/sheet cannot be hidden
     356             :         // always force it to be displayed
     357         145 :         PropertySet aPropSet( getSheet() );
     358         145 :         aPropSet.setProperty( PROP_IsVisible, sal_True );
     359             :     }
     360             :     // visible area and current cursor position (selection not supported via API)
     361         269 :     CellAddress aFirstPos = xModel->maFirstPos;
     362         269 :     const PaneSelectionModel* pPaneSel = xModel->getActiveSelection();
     363         269 :     CellAddress aCursor = pPaneSel ? pPaneSel->maActiveCell : aFirstPos;
     364             : 
     365             :     // freeze/split position default
     366         269 :     sal_Int16 nHSplitMode = API_SPLITMODE_NONE;
     367         269 :     sal_Int16 nVSplitMode = API_SPLITMODE_NONE;
     368         269 :     sal_Int32 nHSplitPos = 0;
     369         269 :     sal_Int32 nVSplitPos = 0;
     370             :     // active pane default
     371         269 :     sal_Int16 nActivePane = API_SPLITPANE_BOTTOMLEFT;
     372             : 
     373             :     // freeze/split position
     374         269 :     if( (xModel->mnPaneState == XML_frozen) || (xModel->mnPaneState == XML_frozenSplit) )
     375             :     {
     376             :         /*  Frozen panes: handle split position as row/column positions.
     377             :             #i35812# Excel uses number of visible rows/columns in the
     378             :                 frozen area (rows/columns scolled outside are not incuded),
     379             :                 Calc uses absolute position of first unfrozen row/column. */
     380           0 :         const CellAddress& rMaxApiPos = getAddressConverter().getMaxApiAddress();
     381           0 :         if( (xModel->mfSplitX >= 1.0) && (xModel->maFirstPos.Column + xModel->mfSplitX <= rMaxApiPos.Column) )
     382           0 :             nHSplitPos = static_cast< sal_Int32 >( xModel->maFirstPos.Column + xModel->mfSplitX );
     383           0 :         nHSplitMode = (nHSplitPos > 0) ? API_SPLITMODE_FREEZE : API_SPLITMODE_NONE;
     384           0 :         if( (xModel->mfSplitY >= 1.0) && (xModel->maFirstPos.Row + xModel->mfSplitY <= rMaxApiPos.Row) )
     385           0 :             nVSplitPos = static_cast< sal_Int32 >( xModel->maFirstPos.Row + xModel->mfSplitY );
     386           0 :         nVSplitMode = (nVSplitPos > 0) ? API_SPLITMODE_FREEZE : API_SPLITMODE_NONE;
     387             :     }
     388         269 :     else if( xModel->mnPaneState == XML_split )
     389             :     {
     390             :         // split window: view settings API uses twips...
     391         269 :         nHSplitPos = getLimitedValue< sal_Int32, double >( xModel->mfSplitX + 0.5, 0, SAL_MAX_INT32 );
     392         269 :         nHSplitMode = (nHSplitPos > 0) ? API_SPLITMODE_SPLIT : API_SPLITMODE_NONE;
     393         269 :         nVSplitPos = getLimitedValue< sal_Int32, double >( xModel->mfSplitY + 0.5, 0, SAL_MAX_INT32 );
     394         269 :         nVSplitMode = (nVSplitPos > 0) ? API_SPLITMODE_SPLIT : API_SPLITMODE_NONE;
     395             :     }
     396             : 
     397             :     // active pane
     398         269 :     switch( xModel->mnActivePaneId )
     399             :     {
     400             :         // no horizontal split -> always use left panes
     401             :         // no vertical split -> always use *bottom* panes
     402             :         case XML_topLeft:
     403         269 :             nActivePane = (nVSplitMode == API_SPLITMODE_NONE) ? API_SPLITPANE_BOTTOMLEFT : API_SPLITPANE_TOPLEFT;
     404         269 :         break;
     405             :         case XML_topRight:
     406           0 :             nActivePane = (nHSplitMode == API_SPLITMODE_NONE) ?
     407           0 :                 ((nVSplitMode == API_SPLITMODE_NONE) ? API_SPLITPANE_BOTTOMLEFT : API_SPLITPANE_TOPLEFT) :
     408           0 :                 ((nVSplitMode == API_SPLITMODE_NONE) ? API_SPLITPANE_BOTTOMRIGHT : API_SPLITPANE_TOPRIGHT);
     409           0 :         break;
     410             :         case XML_bottomLeft:
     411           0 :             nActivePane = API_SPLITPANE_BOTTOMLEFT;
     412           0 :         break;
     413             :         case XML_bottomRight:
     414           0 :             nActivePane = (nHSplitMode == API_SPLITMODE_NONE) ? API_SPLITPANE_BOTTOMLEFT : API_SPLITPANE_BOTTOMRIGHT;
     415           0 :         break;
     416             :     }
     417             : 
     418             :     // write the sheet view settings into the property sequence
     419         269 :     PropertyMap aPropMap;
     420         269 :     aPropMap.setProperty( PROP_TableSelected, bSelected);
     421         269 :     aPropMap.setProperty( PROP_CursorPositionX, aCursor.Column);
     422         269 :     aPropMap.setProperty( PROP_CursorPositionY, aCursor.Row);
     423         269 :     aPropMap.setProperty( PROP_HorizontalSplitMode, nHSplitMode);
     424         269 :     aPropMap.setProperty( PROP_VerticalSplitMode, nVSplitMode);
     425         269 :     aPropMap.setProperty( PROP_HorizontalSplitPositionTwips, nHSplitPos);
     426         269 :     aPropMap.setProperty( PROP_VerticalSplitPositionTwips, nVSplitPos);
     427         269 :     aPropMap.setProperty( PROP_ActiveSplitRange, nActivePane);
     428         269 :     aPropMap.setProperty( PROP_PositionLeft, aFirstPos.Column);
     429         269 :     aPropMap.setProperty( PROP_PositionTop, aFirstPos.Row);
     430         269 :     aPropMap.setProperty( PROP_PositionRight, xModel->maSecondPos.Column);
     431         269 :     aPropMap.setProperty( PROP_PositionBottom, ((nVSplitPos > 0) ? xModel->maSecondPos.Row : xModel->maFirstPos.Row));
     432         269 :     aPropMap.setProperty( PROP_ZoomType, API_ZOOMTYPE_PERCENT);
     433         269 :     aPropMap.setProperty( PROP_ZoomValue, static_cast< sal_Int16 >( xModel->getNormalZoom() ));
     434         269 :     aPropMap.setProperty( PROP_PageViewZoomValue, static_cast< sal_Int16 >( xModel->getPageBreakZoom() ));
     435         269 :     aPropMap.setProperty( PROP_GridColor, xModel->getGridColor( getBaseFilter() ));
     436         269 :     aPropMap.setProperty( PROP_ShowPageBreakPreview, xModel->isPageBreakPreview());
     437         269 :     aPropMap.setProperty( PROP_ShowFormulas, xModel->mbShowFormulas);
     438         269 :     aPropMap.setProperty( PROP_ShowGrid, xModel->mbShowGrid);
     439         269 :     aPropMap.setProperty( PROP_HasColumnRowHeaders, xModel->mbShowHeadings);
     440         269 :     aPropMap.setProperty( PROP_ShowZeroValues, xModel->mbShowZeros);
     441         269 :     aPropMap.setProperty( PROP_IsOutlineSymbolsSet, xModel->mbShowOutline);
     442             : 
     443             :     // store sheet view settings in global view settings object
     444         269 :     getViewSettings().setSheetViewSettings( getSheetIndex(), xModel, Any( aPropMap.makePropertyValueSequence() ) );
     445         269 : }
     446             : 
     447         269 : bool SheetViewSettings::isSheetRightToLeft() const
     448             : {
     449         269 :     return !maSheetViews.empty() && maSheetViews.front()->mbRightToLeft;
     450             : }
     451             : 
     452             : // private --------------------------------------------------------------------
     453             : 
     454         269 : SheetViewModelRef SheetViewSettings::createSheetView()
     455             : {
     456         269 :     SheetViewModelRef xModel( new SheetViewModel );
     457         269 :     maSheetViews.push_back( xModel );
     458         269 :     return xModel;
     459             : }
     460             : 
     461         145 : WorkbookViewModel::WorkbookViewModel() :
     462             :     mnWinX( 0 ),
     463             :     mnWinY( 0 ),
     464             :     mnWinWidth( 0 ),
     465             :     mnWinHeight( 0 ),
     466             :     mnActiveSheet( 0 ),
     467             :     mnFirstVisSheet( 0 ),
     468             :     mnTabBarWidth( OOX_BOOKVIEW_TABBARRATIO_DEF ),
     469             :     mnVisibility( XML_visible ),
     470             :     mbShowTabBar( true ),
     471             :     mbShowHorScroll( true ),
     472             :     mbShowVerScroll( true ),
     473         145 :     mbMinimized( false )
     474             : {
     475         145 : }
     476             : 
     477         145 : ViewSettings::ViewSettings( const WorkbookHelper& rHelper ) :
     478             :     WorkbookHelper( rHelper ),
     479         145 :     mbValidOleSize( false )
     480             : {
     481         145 : }
     482             : 
     483         143 : void ViewSettings::importWorkbookView( const AttributeList& rAttribs )
     484             : {
     485         143 :     WorkbookViewModel& rModel = createWorkbookView();
     486         143 :     rModel.mnWinX          = rAttribs.getInteger( XML_xWindow, 0 );
     487         143 :     rModel.mnWinY          = rAttribs.getInteger( XML_yWindow, 0 );
     488         143 :     rModel.mnWinWidth      = rAttribs.getInteger( XML_windowWidth, 0 );
     489         143 :     rModel.mnWinHeight     = rAttribs.getInteger( XML_windowHeight, 0 );
     490         143 :     rModel.mnActiveSheet   = rAttribs.getInteger( XML_activeTab, 0 );
     491         143 :     rModel.mnFirstVisSheet = rAttribs.getInteger( XML_firstSheet, 0 );
     492         143 :     rModel.mnTabBarWidth   = rAttribs.getInteger( XML_tabRatio, 600 );
     493         143 :     rModel.mnVisibility    = rAttribs.getToken( XML_visibility, XML_visible );
     494         143 :     rModel.mbShowTabBar    = rAttribs.getBool( XML_showSheetTabs, true );
     495         143 :     rModel.mbShowHorScroll = rAttribs.getBool( XML_showHorizontalScroll, true );
     496         143 :     rModel.mbShowVerScroll = rAttribs.getBool( XML_showVerticalScroll, true );
     497         143 :     rModel.mbMinimized     = rAttribs.getBool( XML_minimized, false );
     498         143 : }
     499             : 
     500           0 : void ViewSettings::importOleSize( const AttributeList& rAttribs )
     501             : {
     502           0 :     OUString aRange = rAttribs.getString( XML_ref, OUString() );
     503           0 :     mbValidOleSize = getAddressConverter().convertToCellRange( maOleSize, aRange, 0, true, false );
     504           0 : }
     505             : 
     506           2 : void ViewSettings::importWorkbookView( SequenceInputStream& rStrm )
     507             : {
     508           2 :     WorkbookViewModel& rModel = createWorkbookView();
     509             :     sal_uInt8 nFlags;
     510           2 :     rModel.mnWinX = rStrm.readInt32();
     511           2 :     rModel.mnWinY = rStrm.readInt32();
     512           2 :     rModel.mnWinWidth = rStrm.readInt32();
     513           2 :     rModel.mnWinHeight = rStrm.readInt32();
     514           2 :     rModel.mnTabBarWidth = rStrm.readInt32();
     515           2 :     rModel.mnFirstVisSheet = rStrm.readInt32();
     516           2 :     rModel.mnActiveSheet = rStrm.readInt32();
     517           2 :     nFlags = rStrm.readuChar();
     518           2 :     rModel.mnVisibility    = getFlagValue( nFlags, BIFF12_WBVIEW_HIDDEN, XML_hidden, XML_visible );
     519           2 :     rModel.mbShowTabBar    = getFlag( nFlags, BIFF12_WBVIEW_SHOWTABBAR );
     520           2 :     rModel.mbShowHorScroll = getFlag( nFlags, BIFF12_WBVIEW_SHOWHORSCROLL );
     521           2 :     rModel.mbShowVerScroll = getFlag( nFlags, BIFF12_WBVIEW_SHOWVERSCROLL );
     522           2 :     rModel.mbMinimized     = getFlag( nFlags, BIFF12_WBVIEW_MINIMIZED );
     523           2 : }
     524             : 
     525           0 : void ViewSettings::importOleSize( SequenceInputStream& rStrm )
     526             : {
     527           0 :     BinRange aBinRange;
     528           0 :     rStrm >> aBinRange;
     529           0 :     mbValidOleSize = getAddressConverter().convertToCellRange( maOleSize, aBinRange, 0, true, false );
     530           0 : }
     531             : 
     532         269 : void ViewSettings::setSheetViewSettings( sal_Int16 nSheet, const SheetViewModelRef& rxSheetView, const Any& rProperties )
     533             : {
     534         269 :     maSheetViews[ nSheet ] = rxSheetView;
     535         269 :     maSheetProps[ nSheet ] = rProperties;
     536         269 : }
     537             : 
     538         269 : void ViewSettings::setSheetUsedArea( const CellRangeAddress& rUsedArea )
     539             : {
     540         269 :     maSheetUsedAreas[ rUsedArea.Sheet ] = rUsedArea;
     541         269 : }
     542             : 
     543         145 : void ViewSettings::finalizeImport()
     544             : {
     545         145 :     const WorksheetBuffer& rWorksheets = getWorksheets();
     546         145 :     if( rWorksheets.getWorksheetCount() <= 0 ) return;
     547             : 
     548             :     // force creation of workbook view model to get the Excel defaults
     549         145 :     const WorkbookViewModel& rModel = maBookViews.empty() ? createWorkbookView() : *maBookViews.front();
     550             : 
     551             :     // show object mode is part of workbook settings
     552         145 :     sal_Int16 nShowMode = getWorkbookSettings().getApiShowObjectMode();
     553             : 
     554             :     // view settings for all sheets
     555         145 :     Reference< XNameContainer > xSheetsNC = NamedPropertyValues::create( getBaseFilter().getComponentContext() );
     556         145 :     if( !xSheetsNC.is() ) return;
     557         414 :     for( SheetPropertiesMap::const_iterator aIt = maSheetProps.begin(), aEnd = maSheetProps.end(); aIt != aEnd; ++aIt )
     558         269 :         ContainerHelper::insertByName( xSheetsNC, rWorksheets.getCalcSheetName( aIt->first ), aIt->second );
     559             : 
     560             :     // use active sheet to set sheet properties that are document-global in Calc
     561         145 :     sal_Int16 nActiveSheet = getActiveCalcSheet();
     562         145 :     SheetViewModelRef& rxActiveSheetView = maSheetViews[ nActiveSheet ];
     563             :     OSL_ENSURE( rxActiveSheetView.get(), "ViewSettings::finalizeImport - missing active sheet view settings" );
     564         145 :     if( !rxActiveSheetView )
     565           0 :         rxActiveSheetView.reset( new SheetViewModel );
     566             : 
     567         290 :     Reference< XIndexContainer > xContainer = IndexedPropertyValues::create( getBaseFilter().getComponentContext() );
     568         145 :     if( xContainer.is() ) try
     569             :     {
     570         145 :         PropertyMap aPropMap;
     571         145 :         aPropMap.setProperty( PROP_Tables, xSheetsNC);
     572         145 :         aPropMap.setProperty( PROP_ActiveTable, rWorksheets.getCalcSheetName( nActiveSheet ));
     573         145 :         aPropMap.setProperty( PROP_HasHorizontalScrollBar, rModel.mbShowHorScroll);
     574         145 :         aPropMap.setProperty( PROP_HasVerticalScrollBar, rModel.mbShowVerScroll);
     575         145 :         aPropMap.setProperty( PROP_HasSheetTabs, rModel.mbShowTabBar);
     576         145 :         aPropMap.setProperty( PROP_RelativeHorizontalTabbarWidth, double( rModel.mnTabBarWidth / 1000.0 ));
     577         145 :         aPropMap.setProperty( PROP_ShowObjects, nShowMode);
     578         145 :         aPropMap.setProperty( PROP_ShowCharts, nShowMode);
     579         145 :         aPropMap.setProperty( PROP_ShowDrawing, nShowMode);
     580         145 :         aPropMap.setProperty( PROP_GridColor, rxActiveSheetView->getGridColor( getBaseFilter() ));
     581         145 :         aPropMap.setProperty( PROP_ShowPageBreakPreview, rxActiveSheetView->isPageBreakPreview());
     582         145 :         aPropMap.setProperty( PROP_ShowFormulas, rxActiveSheetView->mbShowFormulas);
     583         145 :         aPropMap.setProperty( PROP_ShowGrid, rxActiveSheetView->mbShowGrid);
     584         145 :         aPropMap.setProperty( PROP_HasColumnRowHeaders, rxActiveSheetView->mbShowHeadings);
     585         145 :         aPropMap.setProperty( PROP_ShowZeroValues, rxActiveSheetView->mbShowZeros);
     586         145 :         aPropMap.setProperty( PROP_IsOutlineSymbolsSet, rxActiveSheetView->mbShowOutline);
     587             : 
     588         145 :         xContainer->insertByIndex( 0, Any( aPropMap.makePropertyValueSequence() ) );
     589         290 :         Reference< XViewDataSupplier > xViewDataSuppl( getDocument(), UNO_QUERY_THROW );
     590         290 :         xViewDataSuppl->setViewData( xContainer );
     591             :     }
     592           0 :     catch( Exception& )
     593             :     {
     594             :         OSL_FAIL( "ViewSettings::finalizeImport - cannot create document view settings" );
     595             :     }
     596             : 
     597             :     /*  Set visible area to be used if this document is an embedded OLE object.
     598             :         #i44077# If a new OLE object is inserted from file, there is no OLESIZE
     599             :         record in the Excel file. In this case, use the used area calculated
     600             :         from file contents (used cells and drawing objects). */
     601         145 :     maOleSize.Sheet = nActiveSheet;
     602             :     const CellRangeAddress* pVisibleArea = mbValidOleSize ?
     603         145 :         &maOleSize : ContainerHelper::getMapElement( maSheetUsedAreas, nActiveSheet );
     604         145 :     if( pVisibleArea )
     605             :     {
     606             :         // calculate the visible area in units of 1/100 mm
     607         145 :         PropertySet aRangeProp( getCellRangeFromDoc( *pVisibleArea ) );
     608         145 :         css::awt::Point aPos;
     609         145 :         css::awt::Size aSize;
     610         145 :         if( aRangeProp.getProperty( aPos, PROP_Position ) && aRangeProp.getProperty( aSize, PROP_Size ) )
     611             :         {
     612             :             // set the visible area as sequence of long at the media descriptor
     613         145 :             Sequence< sal_Int32 > aWinExtent( 4 );
     614         145 :             aWinExtent[ 0 ] = aPos.X;
     615         145 :             aWinExtent[ 1 ] = aPos.Y;
     616         145 :             aWinExtent[ 2 ] = aPos.X + aSize.Width;
     617         145 :             aWinExtent[ 3 ] = aPos.Y + aSize.Height;
     618         145 :             getBaseFilter().getMediaDescriptor()[ "WinExtent" ] <<= aWinExtent;
     619         145 :         }
     620         145 :     }
     621             : }
     622             : 
     623         269 : sal_Int16 ViewSettings::getActiveCalcSheet() const
     624             : {
     625         269 :     return maBookViews.empty() ? 0 : ::std::max< sal_Int16 >( getWorksheets().getCalcSheetIndex( maBookViews.front()->mnActiveSheet ), 0 );
     626             : }
     627             : 
     628             : // private --------------------------------------------------------------------
     629             : 
     630         145 : WorkbookViewModel& ViewSettings::createWorkbookView()
     631             : {
     632         145 :     WorkbookViewModelRef xModel( new WorkbookViewModel );
     633         145 :     maBookViews.push_back( xModel );
     634         145 :     return *xModel;
     635             : }
     636             : 
     637             : } // namespace xls
     638          30 : } // namespace oox
     639             : 
     640             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11