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