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