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