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 "xiview.hxx"
21 : #include "document.hxx"
22 : #include "scextopt.hxx"
23 : #include "viewopti.hxx"
24 : #include "xistream.hxx"
25 : #include "xihelper.hxx"
26 : #include "xistyle.hxx"
27 :
28 : // Document view settings =====================================================
29 :
30 84 : XclImpDocViewSettings::XclImpDocViewSettings( const XclImpRoot& rRoot ) :
31 84 : XclImpRoot( rRoot )
32 : {
33 84 : }
34 :
35 82 : void XclImpDocViewSettings::ReadWindow1( XclImpStream& rStrm )
36 : {
37 82 : maData.mnWinX = rStrm.ReaduInt16();
38 82 : maData.mnWinY = rStrm.ReaduInt16();
39 82 : maData.mnWinWidth = rStrm.ReaduInt16();
40 82 : maData.mnWinHeight = rStrm.ReaduInt16();
41 82 : maData.mnFlags = rStrm.ReaduInt16();
42 82 : if( GetBiff() >= EXC_BIFF5 )
43 : {
44 82 : maData.mnDisplXclTab = rStrm.ReaduInt16();
45 82 : maData.mnFirstVisXclTab = rStrm.ReaduInt16();
46 82 : maData.mnXclSelectCnt = rStrm.ReaduInt16();
47 82 : maData.mnTabBarWidth = rStrm.ReaduInt16();
48 : }
49 82 : }
50 :
51 308 : SCTAB XclImpDocViewSettings::GetDisplScTab() const
52 : {
53 : /* Simply cast Excel index to Calc index.
54 : TODO: This may fail if the document contains scenarios. */
55 308 : sal_uInt16 nMaxXclTab = static_cast< sal_uInt16 >( GetMaxPos().Tab() );
56 308 : return static_cast< SCTAB >( (maData.mnDisplXclTab <= nMaxXclTab) ? maData.mnDisplXclTab : 0 );
57 : }
58 :
59 84 : void XclImpDocViewSettings::Finalize()
60 : {
61 84 : ScViewOptions aViewOpt( GetDoc().GetViewOptions() );
62 84 : aViewOpt.SetOption( VOPT_HSCROLL, ::get_flag( maData.mnFlags, EXC_WIN1_HOR_SCROLLBAR ) );
63 84 : aViewOpt.SetOption( VOPT_VSCROLL, ::get_flag( maData.mnFlags, EXC_WIN1_VER_SCROLLBAR ) );
64 84 : aViewOpt.SetOption( VOPT_TABCONTROLS, ::get_flag( maData.mnFlags, EXC_WIN1_TABBAR ) );
65 84 : GetDoc().SetViewOptions( aViewOpt );
66 :
67 : // displayed sheet
68 84 : GetExtDocOptions().GetDocSettings().mnDisplTab = GetDisplScTab();
69 :
70 : // width of the tabbar with sheet names
71 84 : if( maData.mnTabBarWidth <= 1000 )
72 84 : GetExtDocOptions().GetDocSettings().mfTabBarWidth = static_cast< double >( maData.mnTabBarWidth ) / 1000.0;
73 84 : }
74 :
75 : // Sheet view settings ========================================================
76 :
77 : namespace {
78 :
79 448 : long lclGetScZoom( sal_uInt16 nXclZoom, sal_uInt16 nDefZoom )
80 : {
81 448 : return static_cast< long >( nXclZoom ? nXclZoom : nDefZoom );
82 : }
83 :
84 : } // namespace
85 :
86 84 : XclImpTabViewSettings::XclImpTabViewSettings( const XclImpRoot& rRoot ) :
87 84 : XclImpRoot( rRoot )
88 : {
89 84 : Initialize();
90 84 : }
91 :
92 308 : void XclImpTabViewSettings::Initialize()
93 : {
94 308 : maData.SetDefaults();
95 308 : }
96 :
97 2 : void XclImpTabViewSettings::ReadTabBgColor( XclImpStream& rStrm, XclImpPalette& rPal )
98 : {
99 : OSL_ENSURE_BIFF( GetBiff() >= EXC_BIFF8 );
100 2 : if( GetBiff() < EXC_BIFF8 )
101 2 : return;
102 :
103 : sal_uInt8 ColorIndex;
104 2 : Color TabBgColor;
105 :
106 2 : rStrm.Ignore( 16 );
107 2 : ColorIndex = rStrm.ReaduInt8() & EXC_SHEETEXT_TABCOLOR; //0x7F
108 2 : if ( ColorIndex >= 8 && ColorIndex <= 63 ) //only accept valid index values
109 : {
110 2 : TabBgColor = rPal.GetColor( ColorIndex );
111 2 : maData.maTabBgColor = TabBgColor;
112 : }
113 : }
114 :
115 222 : void XclImpTabViewSettings::ReadWindow2( XclImpStream& rStrm, bool bChart )
116 : {
117 222 : if( GetBiff() == EXC_BIFF2 )
118 : {
119 0 : maData.mbShowFormulas = rStrm.ReaduInt8() != 0;
120 0 : maData.mbShowGrid = rStrm.ReaduInt8() != 0;
121 0 : maData.mbShowHeadings = rStrm.ReaduInt8() != 0;
122 0 : maData.mbFrozenPanes = rStrm.ReaduInt8() != 0;
123 0 : maData.mbShowZeros = rStrm.ReaduInt8() != 0;
124 0 : rStrm >> maData.maFirstXclPos;
125 0 : maData.mbDefGridColor = rStrm.ReaduInt8() != 0;
126 0 : rStrm >> maData.maGridColor;
127 : }
128 : else
129 : {
130 : sal_uInt16 nFlags;
131 222 : nFlags = rStrm.ReaduInt16();
132 222 : rStrm >> maData.maFirstXclPos;
133 :
134 : // #i59590# real life: Excel ignores some view settings in chart sheets
135 222 : maData.mbSelected = ::get_flag( nFlags, EXC_WIN2_SELECTED );
136 222 : maData.mbDisplayed = ::get_flag( nFlags, EXC_WIN2_DISPLAYED );
137 222 : maData.mbMirrored = !bChart && ::get_flag( nFlags, EXC_WIN2_MIRRORED );
138 222 : maData.mbFrozenPanes = !bChart && ::get_flag( nFlags, EXC_WIN2_FROZEN );
139 222 : maData.mbPageMode = !bChart && ::get_flag( nFlags, EXC_WIN2_PAGEBREAKMODE );
140 222 : maData.mbDefGridColor = bChart || ::get_flag( nFlags, EXC_WIN2_DEFGRIDCOLOR );
141 222 : maData.mbShowFormulas = !bChart && ::get_flag( nFlags, EXC_WIN2_SHOWFORMULAS );
142 222 : maData.mbShowGrid = bChart || ::get_flag( nFlags, EXC_WIN2_SHOWGRID );
143 222 : maData.mbShowHeadings = bChart || ::get_flag( nFlags, EXC_WIN2_SHOWHEADINGS );
144 222 : maData.mbShowZeros = bChart || ::get_flag( nFlags, EXC_WIN2_SHOWZEROS );
145 222 : maData.mbShowOutline = bChart || ::get_flag( nFlags, EXC_WIN2_SHOWOUTLINE );
146 :
147 222 : switch( GetBiff() )
148 : {
149 : case EXC_BIFF3:
150 : case EXC_BIFF4:
151 : case EXC_BIFF5:
152 6 : rStrm >> maData.maGridColor;
153 6 : break;
154 : case EXC_BIFF8:
155 : {
156 : sal_uInt16 nGridColorIdx;
157 216 : nGridColorIdx = rStrm.ReaduInt16();
158 : // zoom data not included in chart sheets
159 216 : if( rStrm.GetRecLeft() >= 6 )
160 : {
161 215 : rStrm.Ignore( 2 );
162 215 : maData.mnPageZoom = rStrm.ReaduInt16();
163 215 : maData.mnNormalZoom = rStrm.ReaduInt16();
164 : }
165 :
166 216 : if( !maData.mbDefGridColor )
167 0 : maData.maGridColor = GetPalette().GetColor( nGridColorIdx );
168 : }
169 216 : break;
170 : default: DBG_ERROR_BIFF();
171 : }
172 : }
173 :
174 : // do not scroll chart sheets
175 222 : if( bChart )
176 0 : maData.maFirstXclPos.Set( 0, 0 );
177 222 : }
178 :
179 3 : void XclImpTabViewSettings::ReadScl( XclImpStream& rStrm )
180 : {
181 : sal_uInt16 nNum, nDenom;
182 3 : nNum = rStrm.ReaduInt16();
183 3 : nDenom = rStrm.ReaduInt16();
184 : OSL_ENSURE( nDenom > 0, "XclImpPageSettings::ReadScl - invalid denominator" );
185 3 : if( nDenom > 0 )
186 3 : maData.mnCurrentZoom = limit_cast< sal_uInt16 >( (nNum * 100) / nDenom );
187 3 : }
188 :
189 16 : void XclImpTabViewSettings::ReadPane( XclImpStream& rStrm )
190 : {
191 16 : maData.mnSplitX = rStrm.ReaduInt16();
192 16 : maData.mnSplitY = rStrm.ReaduInt16();
193 :
194 16 : rStrm >> maData.maSecondXclPos;
195 16 : maData.mnActivePane = rStrm.ReaduInt8();
196 16 : }
197 :
198 242 : void XclImpTabViewSettings::ReadSelection( XclImpStream& rStrm )
199 : {
200 : // pane of this selection
201 : sal_uInt8 nPane;
202 242 : nPane = rStrm.ReaduInt8();
203 242 : XclSelectionData& rSelData = maData.CreateSelectionData( nPane );
204 : // cursor position and selection
205 242 : rStrm >> rSelData.maXclCursor;
206 242 : rSelData.mnCursorIdx = rStrm.ReaduInt16();
207 242 : rSelData.maXclSelection.Read( rStrm, false );
208 242 : }
209 :
210 224 : void XclImpTabViewSettings::Finalize()
211 : {
212 224 : SCTAB nScTab = GetCurrScTab();
213 224 : ScDocument& rDoc = GetDoc();
214 224 : XclImpAddressConverter& rAddrConv = GetAddressConverter();
215 224 : ScExtTabSettings& rTabSett = GetExtDocOptions().GetOrCreateTabSettings( nScTab );
216 224 : bool bDisplayed = GetDocViewSettings().GetDisplScTab() == nScTab;
217 :
218 : // *** sheet options: cursor, selection, splits, zoom ***
219 :
220 : // sheet flags
221 224 : if( maData.mbMirrored )
222 : // do not call this function with sal_False, it would mirror away all drawing objects
223 0 : rDoc.SetLayoutRTL( nScTab, true );
224 224 : rTabSett.mbSelected = maData.mbSelected || bDisplayed;
225 :
226 : // first visible cell in top-left pane and in additional pane(s)
227 224 : rTabSett.maFirstVis = rAddrConv.CreateValidAddress( maData.maFirstXclPos, nScTab, false );
228 224 : rTabSett.maSecondVis = rAddrConv.CreateValidAddress( maData.maSecondXclPos, nScTab, false );
229 :
230 : // cursor position and selection
231 224 : if( const XclSelectionData* pSelData = maData.GetSelectionData( maData.mnActivePane ) )
232 : {
233 220 : rTabSett.maCursor = rAddrConv.CreateValidAddress( pSelData->maXclCursor, nScTab, false );
234 220 : rAddrConv.ConvertRangeList( rTabSett.maSelection, pSelData->maXclSelection, nScTab, false );
235 : }
236 :
237 : // active pane
238 224 : switch( maData.mnActivePane )
239 : {
240 209 : case EXC_PANE_TOPLEFT: rTabSett.meActivePane = SCEXT_PANE_TOPLEFT; break;
241 0 : case EXC_PANE_TOPRIGHT: rTabSett.meActivePane = SCEXT_PANE_TOPRIGHT; break;
242 15 : case EXC_PANE_BOTTOMLEFT: rTabSett.meActivePane = SCEXT_PANE_BOTTOMLEFT; break;
243 0 : case EXC_PANE_BOTTOMRIGHT: rTabSett.meActivePane = SCEXT_PANE_BOTTOMRIGHT; break;
244 : }
245 :
246 : // freeze/split position
247 224 : rTabSett.mbFrozenPanes = maData.mbFrozenPanes;
248 224 : if( maData.mbFrozenPanes )
249 : {
250 : /* Frozen panes: handle split position as row/column positions.
251 : #i35812# Excel uses number of visible rows/columns, Calc uses position of freeze. */
252 15 : if( (maData.mnSplitX > 0) && (maData.maFirstXclPos.mnCol + maData.mnSplitX <= GetScMaxPos().Col()) )
253 0 : rTabSett.maFreezePos.SetCol( static_cast< SCCOL >( maData.maFirstXclPos.mnCol + maData.mnSplitX ) );
254 15 : if( (maData.mnSplitY > 0) && (maData.maFirstXclPos.mnRow + maData.mnSplitY <= static_cast<unsigned>(GetScMaxPos().Row())) )
255 15 : rTabSett.maFreezePos.SetRow( static_cast< SCROW >( maData.maFirstXclPos.mnRow + maData.mnSplitY ) );
256 : }
257 : else
258 : {
259 : // split window: position is in twips
260 209 : rTabSett.maSplitPos.X() = static_cast< long >( maData.mnSplitX );
261 209 : rTabSett.maSplitPos.Y() = static_cast< long >( maData.mnSplitY );
262 : }
263 :
264 : // grid color
265 224 : if( maData.mbDefGridColor )
266 224 : rTabSett.maGridColor.SetColor( COL_AUTO );
267 : else
268 0 : rTabSett.maGridColor = maData.maGridColor;
269 :
270 : // show grid option
271 224 : rTabSett.mbShowGrid = maData.mbShowGrid;
272 :
273 : // view mode and zoom
274 224 : if( maData.mnCurrentZoom != 0 )
275 3 : (maData.mbPageMode ? maData.mnPageZoom : maData.mnNormalZoom) = maData.mnCurrentZoom;
276 224 : rTabSett.mbPageMode = maData.mbPageMode;
277 224 : rTabSett.mnNormalZoom = lclGetScZoom( maData.mnNormalZoom, EXC_WIN2_NORMALZOOM_DEF );
278 224 : rTabSett.mnPageZoom = lclGetScZoom( maData.mnPageZoom, EXC_WIN2_PAGEZOOM_DEF );
279 :
280 : // *** additional handling for displayed sheet ***
281 :
282 224 : if( bDisplayed )
283 : {
284 : // set Excel sheet settings globally at Calc document, take settings from displayed sheet
285 82 : ScViewOptions aViewOpt( rDoc.GetViewOptions() );
286 82 : aViewOpt.SetOption( VOPT_FORMULAS, maData.mbShowFormulas );
287 82 : aViewOpt.SetOption( VOPT_HEADER, maData.mbShowHeadings );
288 82 : aViewOpt.SetOption( VOPT_NULLVALS, maData.mbShowZeros );
289 82 : aViewOpt.SetOption( VOPT_OUTLINER, maData.mbShowOutline );
290 82 : rDoc.SetViewOptions( aViewOpt );
291 : }
292 :
293 : // *** set tab bg color
294 224 : if ( !maData.IsDefaultTabBgColor() )
295 2 : rDoc.SetTabBgColor(nScTab, maData.maTabBgColor);
296 254 : }
297 :
298 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|