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