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