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

Generated by: LCOV version 1.10